其实质上的日志条目被设计为彼此独立。
将它们连接在一起的正确方法是在条目中包含一些上下文信息,以便稍后查看日志时进行过滤。
下面是与这样的信息一个SharePoint日志记录的一个例子:
Timestamp Process TID Area Category EventID Level Message Correlation
02/26/2015 17:49:19.65 w3wp.exe (0x1F40) 0x2358 SharePoint Foundation Logging Correlation Data xmnv Medium Name=Request (POST:http://reserver2:80/pest/_vti_bin/sitedata.asmx) d1e2b688-e0b2-481e-98ce-497a11acab44
在Python logging
文档,Adding contextual information to your logging output建议两种方法:使用LoggerAdapter
或Filter
。
LoggerAdapter
使用这样的(例子是基于那些在文档中):
class AddConnIdAdapter(logging.LoggerAdapter):
def process(self, msg, kwargs):
return <augment_message(msg,arbitrary_info)>, kwargs
la = AddConnIdAdapter(<logger>,extra=<parameters, saved in self.extra>)
<...>
la.info(<message>)
Filter
使用这样的:
#Either all messages should have custom fields
# or the Formatter used should support messages
# both with and without custom fields
logging.basicConfig(<...>,format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s')
class AddClientInfo(logging.Filter):
#override __init__ or set attributes to specify parameters
def filter(self, record):
record.ip = <get_client_ip()>
record.user = <get_client_name()>
return True #do not filter out anything
l=<logger()>
l.addFilter(AddClientInfo()) #can attach to either loggers or handlers
<...>
l.info('message')
正如你可以看到,不同的是LoggerAdapter
是不透明,而Filter
是透明的。在这些例子中,前者修改了消息文本,而后者设置了自定义属性(并且实际上编写它们需要使用Formatter
的合作),但事实上,两者都可以同时执行。
因此,前者更有用,如果您只需要将上下文添加到某些消息,而后者更适合扩充所有或大部分被记录的消息。
这种方法通常很有用,而且在您记录到多个独立日志时很有必要,例如, Python日志框架加上Web服务器日志。如果没有这些,很难在日志间进行关联。 – 2015-03-06 14:37:59