python日志格式化程序,以额外的方式显示所有KWARG
我希望在我的应用程序中添加以下日志点,并在控制台上显示python日志格式化程序,以额外的方式显示所有KWARG,python,logging,Python,Logging,我希望在我的应用程序中添加以下日志点,并在控制台上显示extra的全部内容,例如 logger.info('Status', extra={'foo':data}) logger.info('Status', extra={'bar':data}) logger.info('Status', extra={'foo':data, 'bar':data}) 我希望看到: 2016-10-10 15:28:31,408, INFO, Status, foo=data 2016-10-10 15:
extra
的全部内容,例如
logger.info('Status', extra={'foo':data})
logger.info('Status', extra={'bar':data})
logger.info('Status', extra={'foo':data, 'bar':data})
我希望看到:
2016-10-10 15:28:31,408, INFO, Status, foo=data
2016-10-10 15:38:31,408, INFO, Status, bar=data
2016-10-10 15:48:31,408, INFO, Status, foo=data, bar=data
这可能吗?根据官方记录文件,
Formatter
必须设置一个格式字符串,该字符串需要foo
和bar
,但在我的情况下,我只想将extra
的所有文件都转储掉,而事先不知道foo
和bar正在尝试解决相同的问题。问题是,传递给extra的任何内容都被添加为LogRecord的属性,格式化程序无法将其与其他LogRecord属性区分开来。我只是想出了一个很粗糙的方法,创建一个虚拟记录,并将其与实际记录进行比较:
class ExtraLogFormatter(logging.Formatter):
def format(self, record):
dummy = logging.LogRecord(None,None,None,None,None,None,None)
extra_txt = ''
for k,v in record.__dict__.items():
if k not in dummy.__dict__:
extra_txt += ', {}={}'.format(k,v)
message = super().format(record)
return message + extra_txt
作为extra
传递的对象条目将成为日志记录的成员变量
logger.info('Status',extra={'my_params':{'foo':3,'bar':4})
然后您可以将其格式化为:
handler.setFormatter(logging.Formatter('%(消息)s%(我的参数)s'))
这将导致以下日志:
#> Status {'foo':3, 'bar':4}}
这假设您在记录时可以控制“extra”参数。请查看。我没有时间写出一个完整的例子,但我认为您可以滥用日志记录上的args attr,只需传递一个dict。