替换Python记录器的默认处理程序 [英] Replace default handler of Python logger
本文介绍了替换Python记录器的默认处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在wsgi(web2py)应用程序的每个请求上运行了以下代码:
I've got the following code running on each request of a wsgi (web2py) application:
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")
这意味着使用我想要的格式化处理程序对记录器进行一次配置.它行得通,除了我的标准输出中有两次输入:
It's meant to configure the logger once, with the formatted handler I want. It works, except that I'm getting double entries in my stdout:
81893 4329050112: CONFIGURING LOGGER
DEBUG:dummy:CONFIGURING LOGGER
81893 4329050112: TEST
DEBUG:dummy:TEST
如何使用新的格式化处理程序并摆脱/隐藏默认处理程序?
How do I use my new formatted handler and get rid of/hide the default one?
推荐答案
以下示例也许会有所帮助.基本上,您可以删除要禁用的记录器的处理程序,也可以不与正在记录的记录器一起传播.
Perhaps the following example will help. Basically you can either remove the handlers of the logger you'd like to disable, or don't propagate with the logger you are logging from.
$ 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
这篇关于替换Python记录器的默认处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文