2013-01-16 106 views
4

我想将模块添加到使用标准Python(2.7)日志记录库的项目中。我想实现的是以下几点:使用Python日志记录器记录到文件和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) 

然后我得到了这两个标准错误,我的文件调试消息。

然后我尝试这样的:

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()或其他任何影响全球日志记录基础设施?如果可能,我只想在这里修改我自己的模块。

谢谢!

回答

2
  • 任何等于或大于警告去哪里主程序(我的控制范围之外)已配置日志去 (通常是标准错误)
  • 其他一切(调试消息为主)去一个更坏日志文件

你不能用一个单一的记录做没有对祖先的处理程序设置警戒线。从the docs

Logger.propagate 

如果该值为true,记录消息由该记录器和其子logger上级 (祖先)记录器的处理程序通过。消息被直接传递给祖先 记录器的处理程序 - 既不考虑记录器的祖先 的级别也不过滤器。


你有什么建议模块可以在这种情况下怎么办?

除了为记录器设置WARNING级别并添加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'记录器的子码。

+0

感谢您的回复。如果无法这样做,那么在这种情况下,模块可以做什么?我不太了解你的关于为库配置DEBUG的函数的建议。除了文件,我不希望图书馆进行DEBUG,我希望看到所有内容。我不确定此记录器层次结构如何工作:我创建的记录器是应用程序配置的根记录器的子项? – introiboad

+0

@introiboad:我在评论中添加了对问题的答案。 – jfs

+0

谢谢你的回答。 – introiboad

0

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

+0

这并不能达到我想要的效果。如果我将日志记录级别设置为DEBUG,则所有内容都会转到stderr,如果将其设置为WARNING,则不会有任何调试信息进入该文件,这是我的问题。 – introiboad