4

我正在尝试将一个模块添加到使用标准 Python (2.7) 日志库的项目中。我想要实现的是以下内容:

  • 任何等于或差于 WARNING 的内容都会出现在主程序(我无法控制)配置日志记录的任何地方(通常是 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() 或其他任何影响全局日志基础设施的情况下实现这一点吗?如果可能的话,我只想在这里修改我自己的模块。

谢谢!

4

2 回答 2

2
  • 任何等于或差于 WARNING 的内容都会出现在主程序(我无法控制)配置日志记录的任何地方(通常是 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()

我不确定这个记录器层次结构是如何工作的:我创建的记录器是应用程序配置的根记录器的子级?

''是一个根记录器。'a.b''a'logger 的孩子。

于 2013-01-16T17:22:47.490 回答
0

尝试创建两个指向同一个文件的记录器。一个.ERROR 和一个.WARNING。从来没有用 Python 做过这个,但我不明白为什么它不起作用。只要您在写入后刷新流,它们就不会相互干扰,除非您正在运行协同例程,在这种情况下,您需要在某些锁等中进行编程。只要您的程序线性运行,您就不必担心。

于 2013-01-16T16:40:28.513 回答