我想将特定记录器名称、特定级别或更高级别(比如 INFO
及以上)的消息记录到特定的日志处理程序,比如文件处理程序,同时仍然将所有日志消息发送到控制台。 Python 是 2.7 版。
到目前为止,我尝试的是创建两个记录器:
- 根记录器
- 命名记录器
对于根记录器,我附加了一个 logging.StreamHandler
,并将日志级别设置为 logging.DEBUG
。
然后我将一个处理程序附加到指定的记录器,并将该记录器的级别设置为 logging.INFO
。
现在,当我调用使用命名记录器的模块时,我不再将 DEBUG
日志传播到根记录器。
注意:extraLogger 在这里有一个 StreamHandler 来演示这个问题。在我的生产代码中,我会使用 FileHandler
import logging
def do_logging(turn):
logger = logging.getLogger('extra')
logger.info('some info turn %d' % turn)
logger.debug('this is debug fudge turn %d' % turn)
rootLogger = logging.getLogger()
handler = logging.StreamHandler()
rootFormatter = logging.Formatter('root - %(levelname)s: %(msg)s')
handler.setFormatter(rootFormatter)
rootLogger.addHandler(handler)
rootLogger.setLevel(logging.DEBUG)
do_logging(1)
extraLogger = logging.getLogger('extra')
extraHandler = logging.StreamHandler()
extraFormatter = logging.Formatter('extra - %(levelname)s: %(msg)s')
extraHandler.setFormatter(extraFormatter)
extraLogger.addHandler(extraHandler)
extraLogger.setLevel(logging.INFO)
do_logging(2)
实际输出:
root - INFO: some info turn 1
root - DEBUG: this is debug fudge turn 1
extra - INFO: some info turn 2
root - INFO: some info turn 2
我想要的输出:
root - INFO: some info turn 1
root - DEBUG: this is debug fudge turn 1
extra - INFO: some info turn 2
root - INFO: some info turn 2
root - DEBUG: this is debug fudge turn 2
我怀疑自定义 Filter
在这种情况下会有所帮助,但我不知道如何……
原文由 trapicki 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以像这样使用 robert 的 LevelFilter :