阅读日志记录 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()
?
谢谢。
该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] 删除。
我来说两句