我正在尝试根据Logger
中提供的logging
工具创建Python 2.7
课程。有很多示例演示了如何使用从原始logging.Adapter
或logging.Filters
类继承的自定义处理程序和适配器来自定义日志记录和拦截(修改)各种工具。
特别是这是一个非常有用的资源:Logging Cookbook
我遇到的问题是,由于上面链接中提供的示例演示了一些特定的基于上下文的调整,我很难找到一种方法将trace
数据包含到我的日志记录中。
我知道我可以使用额外的参数传递它,而不会弄乱实际的消息。但是,对我来说理想的解决方案是将其作为Filter
或Formatter
来实现。
如果格式化程序如下所示:
format='%(asctime)-15s %(name)-5s %(levelname)-8s {%(trace)s} %(message)s'
...还有一个自定义的Formatter类,可以从Formatter
类继承并修改日志流:
class ContextFilter(logging.Filter):
"""
This is a filter which injects contextual information into the log.
"""
def filter(self, record):
record.trace = # Do something to receive the trace data?
return True
...然后终于来了自定义Logger类:
class Logger(object):
def __init__(self, name):
self.console_formatter = '%(asctime)-15s %(name)-5s %(levelname)-8s {%(trace)s} %(message)s'
self.syslog = logging.StreamHandler(sys.stdout)
self.syslog.setFormatter(self.console_formatter)
self.syslog.setLevel(DEBUG)
f = ContextFilter()
self.logger = logging.getLogger(logger_name)
self.logger.addFilter(f)
def debug(self, msg, extra=None):
self.logger.debug(msg, extra=extra)
...并且在任何函数/模块调用中如下所示:
log = Logger(logger_name)
def main_B():
log.debug('This is a debug message: %s.', 'banana')
应该给我:
2010-09-06 22:38:15,300 logger_name DEBUG {__main__.main_B()} This is a debug message: banana
理论上,格式化程序中的%(trace)
键将填充传入的跟踪信息。但是,我不太确定如何实现最后一点。
---编辑(1)---
我一直在寻找解决方案,并且我知道我们可以在格式化程序中使用%(funcName)
等,但是我不能不认为必须有一种方法来提取该记录并将新值注入%(trace)
部分。
setattr(record, "trace", getCurrentTrace())