簡體   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