Python日志记录:如何向LogRecord添加自定义字段,并注册全局回调以设置其值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python日志记录:如何向LogRecord添加自定义字段,并注册全局回调以设置其值相关的知识,希望对你有一定的参考价值。
在Flask应用程序中,每当user_id
中存在user_id
时,我想添加一个flask.session
字段添加到生成的每个错误日志记录中。
我想出了下面的解决方案,但它是hackish,因为它不允许格式字符串驱动user_id
的格式,并且因为日志记录API似乎提供了自定义日志记录的方法(LoggerAdapter
,logging.makeRecord
等...我认为必须有一个更清洁的方式。
这样做的“蟒蛇方式”是什么?
class CustomFormatter(Formatter):
def format(self, record):
from myapp.core import authenticationManager
user_id = authenticationManager.current_user_id_if_authenticated()
user_id = "unknown" if user_id is None else str(user_id)
return super(F,self).format(record) + ", user_id" + user_id
答案
您可以定义a custom filter,它为record.user_id
注入一个值。通过这种方式,您可以像其他(标准)记录属性一样定义包含%(user_id)s
的格式:
format='%(asctime)-15s %(name)-5s %(levelname)-8s user_id %(user_id)-15s: %(message)s')
然后所有日志记录调用将自动添加user_id
值。
import logging
class UserIDFilter(logging.Filter):
"""
This is a filter which injects contextual information into the log.
"""
from myapp.core import authenticationManager
def filter(self, record):
user_id = authenticationManager.current_user_id_if_authenticated()
user_id = "unknown" if user_id is None else str(user_id)
record.user_id = user_id
return True
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)-15s %(name)-5s %(levelname)-8s user_id %(user_id)-15s: %(message)s')
logger = logging.getLogger(__name__)
filt = UserIDFilter()
logger.addFilter(filt)
另一答案
logaugment
(Github page)包执行此操作:
使用:
import logaugment
logaugment.set(logger, user_id='custom_value')
使用logger
的所有日志记录调用现在将在日志消息中使用'custom_value'
的值%(user_id)s
。
您可以反复调用logaugment.set
而无需更改值。或者,您可以指定每次进行日志记录调用时将调用的可调用对象。这将允许动态计算/检索用户ID(参见README包中的示例)。
安装:
pip install logaugment
(免责声明:我开发了这个包)
以上是关于Python日志记录:如何向LogRecord添加自定义字段,并注册全局回调以设置其值的主要内容,如果未能解决你的问题,请参考以下文章