如何修改日志记录调用以使其包含上下文信息?

时间:2016-09-10 14:28:51

标签: python logging

我正在尝试根据Logger中提供的logging工具创建Python 2.7课程。有很多示例演示了如何使用从原始logging.Adapterlogging.Filters类继承的自定义处理程序和适配器来自定义日志记录和拦截(修改)各种工具。

特别是这是一个非常有用的资源:Logging Cookbook

我遇到的问题是,由于上面链接中提供的示例演示了一些特定的基于上下文的调整,我很难找到一种方法将trace数据包含到我的日志记录中。

我知道我可以使用额外的参数传递它,而不会弄乱实际的消息。但是,对我来说理想的解决方案是将其作为FilterFormatter来实现。

如果格式化程序如下所示:

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())

0 个答案:

没有答案