我正在使用兩個日誌記錄處理程序。一個用於DEBUG級別以上的文件,另一個用於WARNING及以上的控制檯。 我使用了很多模塊,其中一些是外部的(使用pip安裝)。當有logging.info()
呼叫(而不是logger.info()
),該沉船爲控制檯記錄器設置:使用logging.info而不是logger.info wrecks StreamHandler
import logging
import logging.handlers
import sys, os
from demo_module import something, something_else
logger = logging.getLogger("demo")
logger.setLevel(logging.DEBUG)
main_handler = logging.FileHandler('demo.log')
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s %(filename)s:%(lineno)d %(message)s')
main_handler.setFormatter(formatter)
logger.addHandler(main_handler)
# log serious issues to console
console_handler = logging.StreamHandler(stream=sys.stderr)
console_handler.setLevel(logging.WARNING)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.debug('this is a debug')
logger.info('this is an info')
logger.warning('this is a warning')
logger.error('this is an error')
logger.critical('reactor has melted down')
something()
logger.info('after something')
something_else()
logger.info('after something else')
其中demo_module.py是:
import logging
logger = logging.getLogger('demo')
def something():
logger.info('something needs to be done')
a = 1+1
logger.info('something has been done')
logger.error('some banale error')
def something_else():
logger.info('calling logger.info')
# OOPS, calling logging instead of logger here
logging.info("module may use logging directly instead of logger")
logger.info('logger.info called')
正如你可以看到,裏面demo_module.something_else()
有一個呼叫logging.info
而不是logger.info
。
輸出到控制檯看起來是這樣的:
% python logger.py
2017-10-07 17:45:08,077 demo WARNING logger2.py:21 this is a warning
2017-10-07 17:45:08,077 demo ERROR logger2.py:22 this is an error
2017-10-07 17:45:08,077 demo CRITICAL logger2.py:23 reactor has melted down
2017-10-07 17:45:08,078 demo ERROR demo_module.py:8 some banale error
INFO:demo:logger.info called
INFO:demo:after something else
正如你所看到的,最後兩行失去了我最初的設置控制檯處理程序的所有設置,如水平,而且該格式。 如果只是我的代碼,我可以找到這個違反logging.info()
聲明並替換它,但一些代碼不是我的,但第三方,因此這是我無法控制的。 任何想法如何使這些設置堅持?