我正在尝试使用Python的logging
模块进行实验,但是在这里感到有些困惑。以下是创建一个logger
的标准脚本,然后创建并添加文件处理器
和控制台处理器
到logger
。
import logging
logger = logging.getLogger('logging_test')
logger.setLevel(logging.DEBUG)
print(len(logger.handlers)) # output: 0
# create file handler which logs even debug messages
fh = logging.FileHandler('/home/Jian/Downloads/spam.log', mode='w')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)
print(len(logger.handlers)) # output: 2
# write some log messages
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
我在新启动的内核上运行了这个程序。文件处理器
按预期运行。但是在控制台输出中,我得到了一些重复的消息:
2015-07-14 10:59:26,942 - logging_test - DEBUG - debug message
DEBUG:logging_test:debug message
2015-07-14 10:59:26,944 - logging_test - INFO - info message
INFO:logging_test:info message
2015-07-14 10:59:26,944 - logging_test - WARNING - warn message
WARNING:logging_test:warn message
2015-07-14 10:59:26,945 - logging_test - ERROR - error message
ERROR:logging_test:error message
2015-07-14 10:59:26,946 - logging_test - CRITICAL - critical message
CRITICAL:logging_test:critical message
我猜那些带时间戳的日志消息来自用户定义的控制台处理程序
,但是重复的消息从哪里来? 我能摆脱它们吗,比如只保留每两行? 非常感谢任何帮助。
reload(logging)
。 - Padraic Cunninghamimport logging;logging.getLogger().handlers
,你会看到一个已经在使用中的fh。 - Padraic Cunninghamlogger.propagate = False
。 - Peter Wood