Python中的不同日志级别
我想做一件我认为很简单的事情。
其实我想用Python的日志模块,记录命令行上所有的信息,并且根据命令行参数设置的级别来记录,同时把日志保存到文件里,文件的日志级别固定为DEBUG。
我试着创建两个不同级别的日志记录器,但这并没有成功;然后我又尝试给两个不同的处理器设置级别,这两个处理器都添加到了根日志记录器上,但这也不行。那么,有没有什么好的建议让我知道该怎么做呢?(我在其他地方看到第二种方法应该是可行的,所以我是不是做错了什么?)
这是我目前设置日志系统的代码:
class LoggerSetup(object):
"""Setup the different logger objects
"""
def __init__(self):
self.root_logger = logging.getLogger()
self.shell_hdlr = logging.StreamHandler()
#TODO: add another logging handler which stores to a temporary file
#which should be cleaned up later
def setup_shell_logger(self, log_level):
self.root_logger.setLevel(LOG_LEVELS[log_level])
# in this way the root logger is not set but the handlers are set
self.shell_hdlr = logging.StreamHandler()
self.shell_hdlr.setLevel(LOG_LEVELS[log_level])
self.shell_hdlr.setFormatter(StarFormatter())
#FIXME: add the support for regular expression exclusion too
self.root_logger.addHandler(self.shell_hdlr)
def setup_log_include(self, log_include):
"""Set up the filter to include log messages
"""
if log_include:
incl = FilterInclude(log_include)
self.shell_hdlr.addFilter(incl)
def setup_log_exclude(self, log_exclude):
"""Set up the filters to exclude log messages
"""
if log_exclude:
excl = FilterExclude(log_exclude)
self.shell_hdlr.addFilter(excl)
def setup_file_logging(self):
"""Set up the file logger, which always logs in DEBUG mode
even if the top level logger is set to another level
"""
#XXX: not working, one possible way to make it work is to create
#only one log, and different handler/filters to make to handle all
#the different outputs
file_handler = logging.FileHandler(LOG_FILENAME)
# the file logging is always in debug mode
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s - %(asctime)s')
file_handler.setFormatter(formatter)
self.root_logger.addHandler(file_handler)
1 个回答
13
这是我在所有的Python命令行应用中使用的一个东西。虽然有点啰嗦,但你应该能得到一个记录器,它可以接受一个可选参数,这样就能在任何级别创建一个控制台记录器,而不管文件中记录的内容是什么:
#!/usr/bin/env python
import logging
from argparse import ArgumentParser
COMPANY_LOGGER = 'COMPANY.Python.Logger'
CONSL_LEVEL_RANGE = range(0, 51)
LOG_FILE = 'company.log'
FORMAT_STR = '%(asctime)s %(levelname)s %(message)s'
parser = ArgumentParser()
parser.add_argument('-c', '--console-log', metavar='ARG',
type=int, choices=range(0, 51),
action='store', dest='console_log',
default=None,
help='Adds a console logger for the level specified in the range 1..50')
args = parser.parse_args()
# Create logger
logger = logging.getLogger(COMPANY_LOGGER)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(FORMAT_STR)
# Add FileHandler and only log WARNING and higher
fh = logging.FileHandler(LOG_FILE)
fh.name = 'File Logger'
fh.level = logging.WARNING
fh.formatter = formatter
logger.addHandler(fh)
# Add optional ConsoleHandler
if args.console_log:
ch = logging.StreamHandler()
ch.name = 'Console Logger'
ch.level = args.console_log
ch.formatter = formatter
logger.addHandler(ch)
logger.debug('DEBUG')
logger.info('INFO')
logger.warning('WARNING')
logger.critical('CRITICAL')
当从命令行运行时,我们可以看到记录级别的不同。
-c1
代表“DEBUG及以上”(这是最详细的),但company.log文件中仍然只记录WARNING及以上的内容:
~ zacharyyoung$ ./so.py -c1
2012-01-12 08:59:50,086 DEBUG DEBUG
2012-01-12 08:59:50,086 INFO INFO
2012-01-12 08:59:50,087 WARNING WARNING
2012-01-12 08:59:50,087 CRITICAL CRITICAL
~ zacharyyoung$ cat company.log
2012-01-12 08:59:50,087 WARNING WARNING
2012-01-12 08:59:50,087 CRITICAL CRITICAL
-c20
代表INFO:
~ zacharyyoung$ ./so.py -c20
2012-01-12 09:00:09,393 INFO INFO
2012-01-12 09:00:09,393 WARNING WARNING
2012-01-12 09:00:09,393 CRITICAL CRITICAL
~ zacharyyoung$ cat company.log
2012-01-12 08:59:50,087 WARNING WARNING
2012-01-12 08:59:50,087 CRITICAL CRITICAL
2012-01-12 09:00:09,393 WARNING WARNING
2012-01-12 09:00:09,393 CRITICAL CRITICAL