使用logging.config.dictConfig以{}格式进行Python日志记录
我试图在python日志模块中使用string.format()样式。我从这个站点复制了一些示例,并用新的格式化程序对其进行了修改。我想使用logging.config.dictConfig来指定日志记录格式。 我的剧本是:使用logging.config.dictConfig以{}格式进行Python日志记录,python,logging,Python,Logging,我试图在python日志模块中使用string.format()样式。我从这个站点复制了一些示例,并用新的格式化程序对其进行了修改。我想使用logging.config.dictConfig来指定日志记录格式。 我的剧本是: import sys,logging,logging.config 默认日志记录={ “版本”:1, “禁用现有日志记录器”:False, “格式化程序”:{ “标准”:{ '格式':'{message}', 'style':'{'#使用string.format() },
import sys,logging,logging.config
默认日志记录={
“版本”:1,
“禁用现有日志记录器”:False,
“格式化程序”:{
“标准”:{
'格式':'{message}',
'style':'{'#使用string.format()
},
},
“处理程序”:
'默认值':{
“级别”:“信息”,
“格式化程序”:“标准”,
'class':'logging.StreamHandler',
'流':'ext://sys.stdout“,#默认值为stderr
},
},
“伐木工人”:{
“uuu main_uuuuu”:{#如果uuuu name_uuuuu==”uuuuuu main_uuuuuu'
'handlers':['default'],
“级别”:“调试”,
“格式化程序”:“标准”
},
'': {
'handlers':['default'],
“级别”:“信息”,
“格式化程序”:“标准”
},
}
}
logger=logging.getLogger(_名称__)
logging.config.dictConfig(默认的日志记录)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
info('Hello,{},'log')
系统出口(0)
但提出了一个例外:
---记录错误---回溯(最近一次调用):文件“/usr/lib/python3.8/Logging/init.py”,第1081行,在emit中
msg=self.format(record)File“/usr/lib/python3.8/logging/init.py”,第925行,格式为
以格式返回fmt.format(record)文件“/usr/lib/python3.8/logging/init.py”,第664行
record.message=record.getMessage()文件“/usr/lib/python3.8/logging/init.py”,第369行,在getMessage中
msg=msg%self.args TypeError:在字符串格式化调用堆栈期间未转换所有参数:文件“test/dbg/log.py”,第行
48,在
info('Hello,{}','log')消息:'Hello,{}'参数:('log',)
由于某些原因,python正在尝试使用%formatter(msg=msg%self.args)格式化。如何修改脚本以指向正确的格式?如有任何帮助,将不胜感激。
提前谢谢。
-Uri解决此问题的一种方法是围绕内置日志格式化程序创建精简适配器 例如:
import sys,logging,logging.config
类standardFormatterFactory(logging.Formatter):
定义初始化(self、fmt、datefmt、style、validate=False):
尝试:
#3.x
super(standardFormatterFactory,self)。\uuuuu init\uuuuuu(fmt=fmt,datefmt=datefmt,style=style,validate=validate)
除:
# 2.7
super(standardFormatterFactory,self)。\uuuuu init\uuuuuu(fmt=fmt,datefmt=datefmt)
self.\u usesTime=self.\u fmt.find('%(asctime)')>=0或self.\u fmt.find('{asctime}')>=0
def usesTime(自我):
''重写logging.Formatter.usesTime()'''
返回自我
def格式(自我,记录):
''重写logging.Formatter.format()'''
尝试:
返回超级(standardFormatterFactory,self).format(记录=记录)
除类型错误外,例如:
#消息包含{}个格式化说明符
record.message=record.msg.format(*record.args)
如果self.usesTime():
record.asctime=self.formatTime(record,self.datefmt)
返回自身格式(**记录格式)
默认日志记录={
“版本”:1,
“禁用现有日志记录器”:False,
"传播":假,,
“格式化程序”:{
“标准”:{
“()”:standardFormatterFactory,
“fmt”:“{asctime}-{levelname}:{message}”,
“datefmt”:“%Y-%m-%d%H:%m:%S”,
“样式”:“{”
},
},
“处理程序”:
'默认值':{
“级别”:“调试”,
“格式化程序”:“标准”,
'class':'logging.StreamHandler',
'流':'ext://sys.stdout“,#默认值为stderr
},
},
“伐木工人”:{
“uuu main_uuuuu”:{#如果uuuu name_uuuuu==”uuuuuu main_uuuuuu'
'handlers':['default'],
“级别”:“调试”,
“格式化程序”:“标准”
},
}
}
logger=logging.getLogger(_名称__)
logging.config.dictConfig(默认的日志记录)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
info('Hello,{},'log')
系统出口(0)