字典配置实例
现在想要把 DEBUG 级别的日志发送到控制台,INFO 及以上级别写入文件。这个需求必须用自定义 Filter 实现,而 python 的日志配置文件不支持 Filter,所以就尝试一下字典配置
自定义 Filter
# -*- coding: utf-8 -*-
# logfilter.py
"""
日志过滤器,过滤指定级别以外的日志
"""
import logging
class LevelFilter(object):
def __init__(self, *level):
self.level = level
def filter(self, record):
return record.levelno in self.level
# 只打印 DEBUG 级别日志
class ConsoleFilter(LevelFilter):
def __init__(self):
LevelFilter.__init__(self, logging.DEBUG)
日志配置字典
# -*- coding: utf-8 -*-
import logging.config
import sys
import logfilter
logging_config_dict = {
'version': 1,
'formatters': {
'console': {
'format': '[%(name)s] %(message)s'},
'file': {
'format': '%(asctime)s [%(name)s] - %(message)s',
'datefmt': '%Y-%m-%d %H:%M'}
},
'filters': {
'console': {
'()': logfilter.ConsoleFilter
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'stream': sys.stdout,
'level': 'DEBUG',
'formatter': 'console',
'filters': ['console']
},
'file': {
'class': 'logging.FileHandler',
'filename': 'logging_dict.log',
'mode': 'w',
'level': 'INFO',
'formatter': 'file'
}
},
'loggers': {
'app': {
'level': 'DEBUG',
'handlers': ['console', 'file']
}
},
'root': {
'level': 'DEBUG',
'handlers': ['file'],
},
'incremental': False,
'disable_existing_loggers': True
}
logging.config.dictConfig(logging_config_dict)
logger = logging.getLogger('xyz')
logger.debug('>>> debug')
logger.info('>>> info')
logger.error('>>> error')
logger.warning('>>> warning')
logger.critical('>>> critical')
说明
version
是必须的,值为 1()
是个特殊的 key,用于表示自定义类的工厂,该类的构造函数接受命名参数(其他参数怎么传还没有研究出来)。通过设置以参数名为 key 的 k-v 来设置这些参数的值- 本例定义了一个名为
app
的 logger,如果创建 logger 时名字不是app
,那么就会使用root
的设置 root
不是必须的,如果未设定root
,则会以默认设置生效:级别为 WARNING,输出到标准输出- 测试代码里 logger 的名字是
xyz
,这样就用到root
的设置了 propagate
是 logger 才有的一个属性,默认为True
,意思是日志事件要向上传递给所有更高级的 logger,这样就会导致同一个日志会打印出多遍,若不想如此,设为False
即可