繁体   English   中英

Python 使用 logging.config.dictConfig 以 {} 格式记录

[英]Python logging with {} format using logging.config.dictConfig

我正在尝试将 string.format() 样式与 python 日志记录模块一起使用。 我从该站点复制了一些示例,并使用新的格式化程序对其进行了修改。 我想使用 logging.config.dictConfig 来指定日志记录格式。 我的脚本是:

import sys, logging, logging.config

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': '{message}',
            'style': '{' # use string.format()
        },
    },
    'handlers': { 
        'default': { 
            'level': 'INFO',
            'formatter': 'standard',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',  # Default is stderr
        },
    },
    'loggers': {
        '__main__': {  # if __name__ == '__main__'
            'handlers': ['default'],
            'level': 'DEBUG',
            'formatter': 'standard'
        },
        '': {
            'handlers': ['default'],
            'level': 'INFO',
            'formatter': 'standard'
        },
    }
}

logger = logging.getLogger(__name__)
logging.config.dictConfig(DEFAULT_LOGGING)

if __name__ == '__main__':
    logger.info('Hello, {}', 'log')
    sys.exit(0)

但是提出了一个例外:

--- 记录错误 --- 回溯(最近一次调用最后):文件“/usr/lib/python3.8/logging/init .py”,第 1081 行,在发出 msg = self.format (record) 文件“/ usr/lib/python3.8/logging/ init .py”,第 925 行,格式返回fmt.format (record) 文件“/usr/lib/python3.8/logging/init .py”,第 664 行,格式record.message = record.getMessage () File "/usr/lib/python3.8/logging/init .py", line 369, in getMessage msg = msg % self.args TypeError: not all arguments conversion during string formatting 调用堆栈:文件“test/dbg/log.py”,第 48 行,在 logger.info('Hello, {}', 'log') 消息:'Hello, {}' Arguments: ('log',)

由于某种原因,python 正在尝试使用 % formatter (msg = msg % self.args) 进行格式化。 如何修改我的脚本以指向正确的格式? 任何帮助将不胜感激。 提前致谢。 -乌里

解决这个问题的一种方法是围绕内置的日志格式化程序创建一个瘦适配器。

例子:

import sys, logging, logging.config

class standardFormatterFactory(logging.Formatter):
    def __init__(self, fmt, datefmt, style, validate=False):
        try:
            # 3.x
            super(standardFormatterFactory, self).__init__(fmt=fmt, datefmt=datefmt, style=style, validate=validate)
        except:
            # 2.7
            super(standardFormatterFactory, self).__init__(fmt=fmt, datefmt=datefmt)
        self._usesTime = self._fmt.find('%(asctime)') >= 0 or self._fmt.find('{asctime}') >= 0

    def usesTime(self):
        '''Override logging.Formatter.usesTime()'''
        return self._usesTime

    def format(self, record):
        '''Override logging.Formatter.format()'''
        try:
            return super(standardFormatterFactory, self).format(record=record)
        except TypeError as ex:
            # message contains {} formate specifiers
            record.message = record.msg.format(*record.args)
            if self.usesTime():
                record.asctime = self.formatTime(record, self.datefmt)
            return self._fmt.format(**record.__dict__)

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'propagate': False,
    'formatters': {
        'standard': {
            '()' : standardFormatterFactory,
            'fmt': '{asctime}-{levelname}: {message}',
            'datefmt': '%Y-%m-%d %H:%M:%S',
            'style': '{'
        },
    },
    'handlers': { 
        'default': { 
            'level': 'DEBUG',
            'formatter': 'standard',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',  # Default is stderr
        },
    },
    'loggers': {
        '__main__': {  # if __name__ == '__main__'
            'handlers': ['default'],
            'level': 'DEBUG',
            'formatter': 'standard'
        },
    }
}

logger = logging.getLogger(__name__)
logging.config.dictConfig(DEFAULT_LOGGING)

if __name__ == '__main__':
    logger.info('Hello, {}', 'log')
    sys.exit(0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM