2012-08-05 62 views
22

的默认处理程序我有下面的代码放在一个WSGI(的web2py)的每个请求运行的应用程序:更换的Python记录器

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 

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

+0

我从来没有使用过这个类,但你不觉得logger.setLevel(logging.DEBUG)和logger.debug有点多余吗? – MiJyn 2012-08-05 21:50:53

+1

lkjoel-不,他们是两回事。调用'.debug(..)'在调试级别创建日志条目,同时设置日志记录级别告诉处理程序处理*处理该级别的日志条目。 – Yarin 2012-08-05 21:57:32

+0

你是否在任何地方调用'logging.basicConfig'?如果是这样,请发表评论。 – unutbu 2012-08-05 22:28:54

回答

35

也许下面的例子会有所帮助。基本上,您可以删除要禁用的记录器的处理程序,也不要使用您要记录的记录器进行传播。

$ 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 
+7

Derek-设置'logger.propagate = False'是我所需要的 - 谢谢! – Yarin 2012-08-06 02:37:36