[英]logging to a file and stderr with a Python logger
我正在尝试向使用标准Python(2.7)日志记录库的项目添加模块。 我要实现以下目标:
请注意,这里的关键问题是我不想修改全局日志记录设置,因为这些设置由主应用程序控制。 否则,我将在这里使用示例:
http://docs.python.org/2/howto/logging-cookbook.html#logging-to-multiple-destinations
我已经试过了:
logger = logging.getLogger('my_module')
logger.setLevel(logging.WARNING)
fh = logging.FileHandler('my_module.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
但后来我只在文件中收到警告消息。
如果我将以上行替换为:
logger.setLevel(logging.DEBUG)
然后我在stderr和我的文件中都收到调试消息。
然后我尝试了这个:
logger = logging.getLogger('my_module')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.NullHandler())
console = logging.StreamHandler()
console.setLevel(logging.WARNING)
logger.addHandler(console)
fh = logging.FileHandler('my_module.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
但是再次没有运气。
那么,我可以不必调用basicConfig()或其他会影响全局日志记录基础结构的方法来实现这一目标吗? 如果可能的话,我只想在这里修改自己的模块。
谢谢!
- 等于或比警告更严重的任何东西都可以运到主程序(我的控制范围之外)配置了日志记录的位置(通常是stderr)
- 其他所有内容(主要是调试消息)都进入日志文件
如果没有在祖先的处理程序上设置警告级别,就无法使用单个记录器执行此操作。 从文档 :
Logger.propagate
如果计算结果为true,则此记录器及其子记录器会将日志记录消息传递给更高级别(祖先)记录器的处理程序。 消息直接传递到祖先记录器的处理程序-既不考虑所讨论的祖先记录器的级别或过滤器。
您建议模块在这种情况下可以做什么?
通常,除了为记录器设置警告级别和添加NullHandler()
,库代码根本不应该配置日志记录。
如果您想为主应用程序提供一种简单的方法来为您提供调试信息,则定义一个为库配置DEBUG级别日志记录的函数。
除了文件(我想在其中看到所有内容)之外,我不希望该库为DEBUG。
如果您无法控制主程序,则不应将调试文件作为使用your_module的副作用而创建,除非明确要求这样做:
import your_module # in the main application
your_module.get_logger().log_to_file(filename) # without this line your module
# shouldn't create debug files
...
your_module.some_function()
我不确定此记录器层次结构如何工作:我创建的记录器是应用程序配置的根记录器的子级?
''
是root记录器。 'a.b'
是'a'
记录器的子级。
尝试创建两个指向相同文件的记录器。 一个.ERROR和一个.WARNING。 从来没有使用Python做到这一点,但我不明白为什么它不起作用。 只要您在写入后刷新流,它们就不会相互干扰,除非您正在运行协程,否则您将需要进行一些锁定等编程。 只要您的程序线性运行,您就不必担心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.