[英]Custom variable field to python log record
我正在尝试在我的库中添加自定义格式字段。 我知道这是通过 Filter 或 LoggerAdapter 对象完成的。 但是,在我看到的示例中(例如: 如何将自定义字段添加到 Python 日志格式字符串? ),他们想要生成的自定义字段是静态的,并且在创建记录器时已知。
我需要能够将一个变量发送到我的日志记录,直到我写日志记录之前我才真正知道这个变量。 我想我只是没有看到解决方案,但如何最好地实现这一目标?
目前我这样设置我的记录器:
import logging
class MyClass:
filehandler = logging.handlers.RotatingRileHandler(r'C:\Users\Me\Desktop\Logs',
maxBytes=1000000, backupCount=4, encoding='ASCII')
formatter = logging.Formatter('[%(asctime)s] : %(levelname)-8s: Para: %(parameter)-15s'
' - %(message)s')
# parameter is my custom name I want to inject
self.logger = logging.getLogger(__name__)
self.logger.setLevel(logging.DEBUG)
self.logger.addHandler(file_handler)
d = {'parameter': ''}
self.logger = logging.LoggerAdapter(self.logger, extra=d)
在我的测试中,我写道:
my_obj = MyClass()
my_obj.logger.error('This is my error.', extra={'parameter': 'True'}
但这使得参数字段 '' (空白字符串)总是。 有没有办法在每次进行日志调用( error()
、 debug()
等)时设置d
字典?
我对此进行了进一步调查,并且 LoggerAdapter 的“额外”参数在实际日志操作中优先于“额外”参数。 这也在文档中进行了描述。
要实现您想要的功能,您可以覆盖 LoggerAdapter 类并按如下方式自定义流程方法:
class CustomLoggerAdapter(logging.LoggerAdapter):
def process(self, msg, kwargs):
"""
Process the Logging message and keyword arguments passed in to
a logging call to insert contextual information. The extra argument
of the LoggerAdapter will be merged with the extra argument of the
logging call where the logging call's argument take precedence.
"""
try:
kwargs["extra"] = {**self.extra, **kwargs["extra"]}
except KeyError as e:
kwargs["extra"] = self.extra
return msg, kwargs
这会将 LoggerAdapter 的额外参数与日志调用的参数合并。 日志调用的参数优先。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.