当前位置: 首页 > 面试题库 >

在简单的python日志记录配置中重复输出

乐正焕
2023-03-14
问题内容

我正在设置python日志记录,如下所示:

def setup_logging():
    loggers = (logging.getLogger("amcat"), logging.getLogger("scrapers"),logging.getLogger(__name__))
    filename = "somefile.txt"
    sys.stderr = open(filename, 'a')
    handlers = (logging.StreamHandler(sys.stdout),logging.FileHandler(filename))
    formatter = AmcatFormatter(date = True)

    for handler in handlers:
        handler.setLevel(logging.INFO)
        handler.setFormatter(formatter)

    for logger in loggers:
        logger.propagate = False
        logger.setLevel(logging.INFO)
        for handler in handlers:        
            logger.addHandler(handler)
    logging.getLogger().handlers = []

启用了2个主要的模块记录器,它们都应该作为文件记录到控制台。错误被重定向到文件(理想情况下,错误也会在控制台中显示,但我尚未实现)

之后,我检查是否正确:

should_work = [
    "amcat.scraping.scraper",
    "amcat.scraping.htmltools",
    "amcat.scraping.controller",
    "__main__"]

loggerdict = logging.Logger.manager.loggerDict #all loggers
for name, logger in loggerdict.items():
    if name in should_work:
        print("\nlogger: "+name)
        #iterate through parents see if effective handlers are set correctly
        print(effectivehandlers(logger))
        #test logger
        logger.info("test for {name}".format(**locals()))

def effectivehandlers(logger):
    handlers = logger.handlers
    while True:
        logger = logger.parent
        handlers.extend(logger.handlers)
        if not (logger.parent and logger.propagate):
            break
    return handlers

控制台输出:

logger: __main__
[<logging.StreamHandler object at 0x3425d50>, <logging.FileHandler object at 0x3425dd0>]
[2013-10-24 10:27:30 daily.py:133 INFO] test for __main__

logger: amcat.scraping.controller
[<logging.StreamHandler object at 0x3425d50>, <logging.FileHandler object at 0x3425dd0>]
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.controller
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.controller

logger: amcat.scraping.htmltools
[<logging.StreamHandler object at 0x3425d50>, <logging.FileHandler object at 0x3425dd0>]
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.htmltools
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.htmltools

logger: amcat.scraping.scraper
[<logging.StreamHandler object at 0x3425d50>, <logging.FileHandler object at 0x3425dd0>]
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.scraper
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.scraper

这是文件输出:

[2013-10-24 10:27:30 daily.py:133 INFO] test for __main__
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.controller
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.controller
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.htmltools
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.htmltools
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.scraper
[2013-10-24 10:27:30 daily.py:133 INFO] test for amcat.scraping.scraper

如您所见,尽管禁用了传播并确保没有重复的处理程序,但输出还是两倍。这哪里出错了?


问题答案:

我想通了,谢谢Paco为我指出了正确的方向

事实证明,在getLogger被调用时,将向其添加处理程序:

>>> print(effectivehandlers(logger))
[<logging.StreamHandler object at 0x305ad90>, <logging.FileHandler object at 0x305ae10>]
>>> logging.getLogger(name) #the same logger
<logging.Logger object at 0x7fa08fb9b2d0>
>>> print(effectivehandlers(logger))
[<logging.StreamHandler object at 0x305ad90>, <logging.FileHandler object at 0x305ae10>, <logging.StreamHandler object at 0x305ad90>, <logging.FileHandler object at 0x305ae10>]

现在,孩子和父母都有相同的处理程序。因此重复输出。



 类似资料:
  • 问题内容: 我正在使用python记录器。以下是我的代码: 我的问题是我在每个呼叫的日志文件中都有多个条目。我该如何解决? 问题答案: 该已经是一个单例。(文件) 问题在于,每次调用时,都会向实例添加另一个处理程序,这将导致日志重复。 也许像这样?

  • 问题内容: 我无法理解Python的模块。我的需求非常简单:我只想将所有内容记录到syslog中。阅读文档后,我想到了这个简单的测试脚本: 但是此脚本不会在syslog中产生任何日志记录。怎么了? 问题答案: 将行更改为此: 这对我有用

  • 问题内容: 我刚刚实现了Winston Logging,它可以按预期工作,但是遇到了一些我找不到答案的问题。 据我所知,winston的工作方式是设置的日志级别,以及使用优先级以下的任何东西,例如出错时,它还将包括信息日志等。是否有一种创建特定日志级别的方法可以称之为HTTP还是db,我只将http或db事件记录到日志中,而它们并没有出现在合并的文件或控制台中? 问题答案: 更好的解决方案是使用具

  • 我的FastAPI应用程序似乎记录了很多事情两次。 这包括引发的任何异常,您将两次获得整个堆栈跟踪。我已经看到一些答案建议删除Uvicorn的日志处理程序,但这感觉是错误的。如果在堆栈的Uvicorn层发生日志事件,但在FastAPI中没有,该怎么办? 有没有一种方法可以只获取一次日志输出,而不只是覆盖uvicorn的日志处理程序?

  • 从其他问题中,我发现WebSphere和Spark都在内部使用SLF4J。如何防止Spark中的SLF4J通过自身重定向来自其他应用程序的所有日志记录? 我使用的是WebSphere Application Server V8.5.5.6和Apache Spark V1.4.1 CHD4二进制发行版。

  • 本文向大家介绍python实现简单日志记录库glog的使用,包括了python实现简单日志记录库glog的使用的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了python实现简单日志记录库glog的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、 glog的简介 glog所记录的日志信息总是记录到标准的stderr中,即控制台