字典配置实例

现在想要把 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 即可

results matching ""

    No results matching ""