我希望将以下日志点添加到我的应用程序并显示extra控制台上的完整内容,例如,
logger.info('Status', extra={'foo':data})
logger.info('Status', extra={'bar':data})
logger.info('Status', extra={'foo':data, 'bar':data})
Run Code Online (Sandbox Code Playgroud)
我希望看到:
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
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?据官方日志文件,则Formatter必须设置与预期格式字符串foo和bar,但在我的情况我要的是倾倒了整个kwargs extra没有先验知识foo和bar.
小智 6
现在正在尝试解决同样的问题。问题是传递给 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
Run Code Online (Sandbox Code Playgroud)
传递的对象条目extra将成为 LogRecord 的成员变量。
logger.info('Status', extra={'my_params':{'foo':3, 'bar':4}})
Run Code Online (Sandbox Code Playgroud)
然后您可以将其格式化为:
handler.setFormatter(logging.Formatter('%(message)s %(my_params)s'))
Run Code Online (Sandbox Code Playgroud)
这将导致以下日志:
#> Status {'foo':3, 'bar':4}}
Run Code Online (Sandbox Code Playgroud)
这假设您在记录时可以控制“额外”参数。