Python日志记录:继承上下文信息

时间:2017-10-23 17:58:16

标签: python logging

考虑以下日志记录示例。有两个python文件,myapp.py和mylib.py。

# mylib.py
import logging

def do_something():
    lgr = logging.getLogger('test')
    lgr.info('Doing something')
INFO:test:[123] Started
INFO:test:Doing something
INFO:test:[123] Finished

执行myapp.py时,会将以下输出提供给日志文件:

INFO:test:[123] Started
INFO:test:[123] Doing something
INFO:test:[123] Finished

我试图获取登录继承从父代码获取的上下文信息。期望的输出:

import firebase_admin
import google.auth.transport.requests
import google.oauth2.id_token
from firebase_admin import auth
from firebase_admin import credentials

这可能吗? (注意" [123]"包含在日志的第2行)

以下是一些其他相关信息:

  • 我正在使用python 3.5
  • 我试图避免将任何参数传递给" do_something"功能
  • 在实际使用中," connid"的值将是动态的。
  • 这将用于django视图。替换django视图的main()。

2 个答案:

答案 0 :(得分:1)

您不能轻易地为第三方库执行此操作(因为即使您使用代码,它们也不会使用适配器)。但是,您可以使用过滤器执行此操作,如文档here中所述。

答案 1 :(得分:0)

我接受了Vinay Sajip的回答并应用了它,得到了以下内容。它似乎按我想要的方式工作。希望这也会帮助其他人。谢谢Vinay

  

您不能轻易地为第三方库执行此操作(因为即使您使用代码,它们也不会使用适配器)。但是,您可以使用过滤器执行此操作,如文档here中所述。

# myapp.py
import logging
import mylib


class ContextFilter(logging.Filter):
    def __init__(self, filter_name, extra):
        super(ContextFilter, self).__init__(filter_name)
        self.connid = extra

    def filter(self, record):
        record.connid = self.connid
        return True


def main():
    logging.basicConfig(filename='myapp.log',level=logging.INFO,
                        format='%(levelname)s:%(name)s:[%(connid)s] %(message)s')
    logger = logging.getLogger('test')
    cf = ContextFilter(filter_name='add_conn_id', extra='123')
    logger.addFilter(cf)
    logger.info('Started')
    mylib.do_something()
    logger.info('Finished')

if __name__ == '__main__':
    main()

我的日志输出现在看起来像这样:

INFO:test:[123] Started
INFO:test:[123] Doing something
INFO:test:[123] Finished

格式更改