【问题标题】:Replace default handler of Python logger替换 Python 记录器的默认处理程序
【发布时间】:2012-08-05 21:48:14
【问题描述】:

我在 wsgi (web2py) 应用程序的每个请求上运行以下代码:

import logging, logging.handlers
from logging import StreamHandler, Formatter

def get_configured_logger(name):

    logger = logging.getLogger(name)

    if (len(logger.handlers) == 0):
        # This logger has no handlers, so we can assume it hasn't yet been configured (Django uses similiar trick)

        # === Configure logger ===

        # Create Formatted StreamHandler:
        FORMAT = "%(process)s %(thread)s: %(message)s"
        formatter = logging.Formatter(fmt=FORMAT)
        handler = logging.StreamHandler()
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.setLevel(logging.DEBUG)
        logger.debug('CONFIGURING LOGGER')

    return logger

# Get app specific logger:
logger = get_configured_logger(request.application)
logger.debug("TEST")

这意味着使用我想要的格式化处理程序配置一次记录器。它有效,除了我的标准输出中有双重条目:

81893 4329050112: CONFIGURING LOGGER
DEBUG:dummy:CONFIGURING LOGGER
81893 4329050112: TEST
DEBUG:dummy:TEST

如何使用我的新格式化处理程序并摆脱/隐藏默认处理程序?

【问题讨论】:

  • 我从来没有用过这个类,但是你不觉得 logger.setLevel(logging.DEBUG) 和 logger.debug 有点多余吗?
  • lkjoel- 不,它们是两个不同的东西。调用.debug(..) 在调试级别创建日志条目,而设置日志级别告诉处理程序处理该级别的日志条目。
  • 你在哪里打电话给logging.basicConfig?如果是这样,请将其注释掉。
  • unutbu- web2py 框架确实在其核心中调用了 basicConfig,因此无法将其注释掉。我可以改写它吗?

标签: python logging


【解决方案1】:

也许下面的例子会有所帮助。基本上,您可以删除要禁用的记录器的处理程序,或者不要与您正在记录的记录器一起传播。

$ cat testlog.py
import logging
logging.basicConfig(filename='foo', level=logging.DEBUG)
root_logger = logging.getLogger()
root_logger.debug('bar')

my_logger = logging.getLogger('my_logger')
FORMAT = "%(process)s %(thread)s: %(message)s"
formatter = logging.Formatter(fmt=FORMAT)
handler = logging.StreamHandler()
handler.setFormatter(formatter)

my_logger.addHandler(handler)
my_logger.setLevel(logging.DEBUG)
my_logger.info('baz')

my_logger.propagate = False
my_logger.info('foobar')

my_logger.propagate = True
my_logger.info('foobaz')
root_logger.handlers = []
my_logger.info('barbaz')

$ python testlog.py
5927 140735224465760: baz
5927 140735224465760: foobar
5927 140735224465760: foobaz
5927 140735224465760: barbaz

$ cat foo
DEBUG:root:bar
INFO:my_logger:baz
INFO:my_logger:foobaz

【讨论】:

  • Derek- 设置logger.propagate = False 是我所需要的- 谢谢!
  • root_logger.handlers = [] 是我需要的
  • 我两个都需要:)
  • 没有我需要的 :( 我想覆盖默认处理程序,因为一个用于文件,一个用于标准输出,但每个的格式不同
【解决方案2】:

您可以使用以下方法从 getLogger() 中删除默认处理程序:

logging.getLogger().removeHandler(logging.getLogger().handlers[0])

或在添加所需的处理程序之前先清除现有处理程序:

logging.getLogger().handlers.clear()

这样做后,这些日志将不再显示,除了您添加的新处理程序:

DEBUG: Do stuff
WARNING: Do stuff

【讨论】:

  • 它似乎不起作用...我做了removeHandlerhandlers=[] 但它们似乎被某种方式忽略了
猜你喜欢
  • 2020-07-20
  • 1970-01-01
  • 2019-10-13
  • 2016-01-15
  • 2016-04-13
  • 2015-11-07
  • 2015-10-07
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多