为什么我配置的记录器没有被使用?

穿

阅读日志记录 HOWTO ( https://docs.python.org/3/howto/logging.html ) 我的印象是,如果我配置了一个记录器,那么我随后可以通过工厂请求我的记录器logging.getLogger(),python 会知道如何获得正确的记录器(我配置的那个)并且一切都会自动工作,即我不需要在我的代码周围传递配置的记录器实例,我可以在我需要的任何地方要求它。相反,我正在观察不同的东西。

文件log_tester.py

from util.logging_custom import SetupLogger
import logging
import datetime

def test():
    logger = logging.getLogger()
    logger.debug("In test()")

def main():
    logger = SetupLogger("logger_test")
    logger.setLevel(logging.DEBUG)
    logger.info(f"now is {datetime.datetime.now()}", )
    logger.debug("In main()")
    test()


if __name__ == '__main__':
    main()

文件util/logging_custom.py

import os
import time
import logging
from logging.handlers import RotatingFileHandler

def SetupLogger(name_prefix):
    if not os.path.exists("log"):
        os.makedirs("log")

    recfmt = logging.Formatter('%(asctime)s.%(msecs)03d %(levelname)s %(message)s')

    handler = RotatingFileHandler(time.strftime(f"log/{name_prefix}.log"),maxBytes=5000000, backupCount=10)
    handler.setFormatter(recfmt)
    handler.setLevel(logging.DEBUG)

    logger = logging.getLogger(f"{name_prefix} {__name__}")
    logger.addHandler(handler)

    return logger

当我运行此代码时,只有main()在日志文件中的调试语句结束。最终的调试语句test()我不确定到底在哪里。

内容log/logger_test.log

2019-02-07 09:14:39,906.906 INFO now is 2019-02-07 09:14:39.906848
2019-02-07 09:14:39,906.906 DEBUG In main()

我的期望是这In test()也会出现在我的日志文件中。我是否对 python 日志记录的工作方式做了一些不真实的假设?如何使我的程序(有许多类和模块)中的所有日志记录都转到相同的配置记录器?在 中创建记录器实例后,是否可以不到处传递记录器实例main()

谢谢。

olinox14

getLogger函数将按其名称返回记录器(一种单例):

  • 如果它不存在,它会创建它
  • 如果它已经存在,则返回它

那么你可以做的是:

util/logging_custom.py

def SetupLogger(logger_name, level=logging.INFO):
    if not os.path.exists("log"):
        os.makedirs("log")

    recfmt = logging.Formatter('%(asctime)s.%(msecs)03d %(levelname)s %(message)s')
    handler = RotatingFileHandler(time.strftime(f"log/{logger_name}.log"),maxBytes=5000000, backupCount=10)
    handler.setFormatter(recfmt)
    handler.setLevel(level)

    logger = logging.getLogger(logger_name)
    logger.addHandler(handler)

    # no need to return the logger, I would even advice not to do so

日志测试器.py

from util.logging_custom import SetupLogger
import logging
import datetime

logger = SetupLogger("logger_test", logging.DEBUG)  # you only need to run this once, in your main script.
logger = logging.getLogger("logger_test")

def test():
    logger.debug("In test()")

def main():
    logger.info(f"now is {datetime.datetime.now()}", )
    logger.debug("In main()")
    test()

if __name__ == '__main__':
    main()

any_other.py

import logging
logger = logging.getLogger("logger_test")  # this will return the logger you already instantiate in log_tester.py

logger.info("that works!")

更新

要设置根记录器的级别和处理而不是您设置的记录器,请使用logging.getLogger()而不传递任何名称:

root_logger = logging.getLogger()
root_logger.addHandler(your_handler)
root_logger.setLevel(logging.DEBUG)

root_logger.info("hello world")

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么更改根记录器对其他记录器没有影响?

来自分类Dev

为什么我不能更改python记录器的级别?

来自分类Dev

为什么我们在Rails记录器中使用块而不是字符串?

来自分类Dev

Log4j2 - 为什么我的“记录器”元素隐藏了“根”记录器的内容?

来自分类Dev

没有使用Root,Grails Log4J无法配置信息记录器

来自分类Dev

为什么我的记录没有更新?

来自分类Dev

为什么只有根记录器才能在具有JSON配置的Log4j 2中运行?

来自分类Dev

为什么只有根记录器才能在具有JSON配置的Log4j 2中运行?

来自分类Dev

我的记录器未使用Spring创建RollingFile(使用logback.xml配置)

来自分类Dev

为什么我的键盘记录器不起作用?

来自分类Dev

使用Python记录和继承记录器的配置

来自分类Dev

有没有一种方法可以更改未使用basicConfig配置的记录器对象的文件模式?

来自分类Dev

在.NET中使用记录器时,为什么要使用硬编码类名?

来自分类Dev

Python记录器,打印没有父名称的子记录器%(name)

来自分类Dev

使用Java配置Ignite记录器和附加器

来自分类Dev

为什么我的 python 记录器在设置为 DEBUG 时仍然从更高的日志记录级别打印出消息?

来自分类Dev

为什么无法将记录器服务注入CompilerPass?

来自分类Dev

为什么不要求drop记录器实现?

来自分类Dev

为什么Java飞行记录器采集的样本太少?

来自分类Dev

为什么要为每个类创建Nlog记录器

来自分类Dev

为什么我的记录器信息在服务类上不起作用,但在控制器中起作用?

来自分类Dev

为什么 Sphinx 没有记录我的课程?

来自分类Dev

为什么我的 ElasticSearch 查询没有获取任何记录?

来自分类Dev

为什么我的 App Insights 没有记录数据?

来自分类Dev

记录器配置以记录到文件

来自分类Dev

为什么我的减速器没有收到我的动作?(使用React和Redux)

来自分类Dev

我不能循环使用spdlog记录器

来自分类Dev

为什么Java中的记录器很少像System.out.println那样具有.toString()?

来自分类Dev

为什么将记录器编码设置为UTF-8会写入带有UNIX行尾的文件?

Related 相关文章

  1. 1

    为什么更改根记录器对其他记录器没有影响?

  2. 2

    为什么我不能更改python记录器的级别?

  3. 3

    为什么我们在Rails记录器中使用块而不是字符串?

  4. 4

    Log4j2 - 为什么我的“记录器”元素隐藏了“根”记录器的内容?

  5. 5

    没有使用Root,Grails Log4J无法配置信息记录器

  6. 6

    为什么我的记录没有更新?

  7. 7

    为什么只有根记录器才能在具有JSON配置的Log4j 2中运行?

  8. 8

    为什么只有根记录器才能在具有JSON配置的Log4j 2中运行?

  9. 9

    我的记录器未使用Spring创建RollingFile(使用logback.xml配置)

  10. 10

    为什么我的键盘记录器不起作用?

  11. 11

    使用Python记录和继承记录器的配置

  12. 12

    有没有一种方法可以更改未使用basicConfig配置的记录器对象的文件模式?

  13. 13

    在.NET中使用记录器时,为什么要使用硬编码类名?

  14. 14

    Python记录器,打印没有父名称的子记录器%(name)

  15. 15

    使用Java配置Ignite记录器和附加器

  16. 16

    为什么我的 python 记录器在设置为 DEBUG 时仍然从更高的日志记录级别打印出消息?

  17. 17

    为什么无法将记录器服务注入CompilerPass?

  18. 18

    为什么不要求drop记录器实现?

  19. 19

    为什么Java飞行记录器采集的样本太少?

  20. 20

    为什么要为每个类创建Nlog记录器

  21. 21

    为什么我的记录器信息在服务类上不起作用,但在控制器中起作用?

  22. 22

    为什么 Sphinx 没有记录我的课程?

  23. 23

    为什么我的 ElasticSearch 查询没有获取任何记录?

  24. 24

    为什么我的 App Insights 没有记录数据?

  25. 25

    记录器配置以记录到文件

  26. 26

    为什么我的减速器没有收到我的动作?(使用React和Redux)

  27. 27

    我不能循环使用spdlog记录器

  28. 28

    为什么Java中的记录器很少像System.out.println那样具有.toString()?

  29. 29

    为什么将记录器编码设置为UTF-8会写入带有UNIX行尾的文件?

热门标签

归档