![](/img/trans.png)
[英]Error when config logging use logging.config.dictConfig in python
[英]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.