繁体   English   中英

使用Python记录器记录到文件和stderr

[英]logging to a file and stderr with a Python logger

我正在尝试向使用标准Python(2.7)日志记录库的项目添加模块。 我要实现以下目标:

  • 等于或比警告更严重的任何东西都可以运到主程序(我的控制范围之外)配置了日志记录的位置(通常是stderr)
  • 其他所有内容(主要是调试消息)都进入日志文件

请注意,这里的关键问题是我不想修改全局日志记录设置,因为这些设置由主应用程序控制。 否则,我将在这里使用示例:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM