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

时间:2013-01-16 16:31:47

标签: python logging python-2.7

我正在尝试将模块添加到使用标准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()或其他任何影响全局日志记录基础结构的情况下实现此目的?我想在可能的情况下修改我自己的模块。

谢谢!

2 个答案:

答案 0 :(得分:2)

  
      
  • 与WARNING相同或更差的任何内容都会转到主程序(我无法控制)配置日志记录的任何地方   (通常是stderr)
  •   
  • 其他所有内容(主要是调试消息)转到日志文件
  •   

如果没有在祖先的处理程序上设置WARNING级别,则无法使用单个记录器执行此操作。来自the docs

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'记录器的孩子。

答案 1 :(得分:0)

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