Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python日志:继承上下文信息_Python_Logging - Fatal编程技术网

Python日志:继承上下文信息

Python日志:继承上下文信息,python,logging,Python,Logging,考虑下面的日志记录示例。有两个python文件,myapp.py和mylib.py # myapp.py import logging import mylib class customAdapter(logging.LoggerAdapter): def process(self, msg, kwargs): return '[%s] %s' % (self.extra['connid'], msg), kwargs def main(): logging.

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

# myapp.py
import logging
import mylib

class customAdapter(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        return '[%s] %s' % (self.extra['connid'], msg), kwargs

def main():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logger = logging.getLogger('test')
    adapter = customAdapter(logger,{'connid': 123})
    adapter.info('Started')
    mylib.do_something()
    adapter.info('Finished')

if __name__ == '__main__':
    main()

执行myapp.py时,日志文件将获得以下输出:

INFO:test:[123] Started
INFO:test:Doing something
INFO:test:[123] Finished
我试图让登录继承从父代码获取的上下文信息。期望输出:

INFO:test:[123] Started
INFO:test:[123] Doing something
INFO:test:[123] Finished
这可能吗?(注意,“[123]”包含在日志的第2行中)

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

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

对于第三方库,您无法轻松做到这一点(因为即使您在代码中使用了适配器,它们也不会使用适配器)。但是,您可以使用文档中描述的过滤器来实现这一点。

我接受了Vinay Sajip的答案并应用了它,得到了以下结果。它似乎按照我希望的方式工作。希望这也能帮助其他人。谢谢


对于第三方库,您无法轻松做到这一点(因为即使您在代码中使用了适配器,它们也不会使用适配器)。但是,您可以使用文档中描述的过滤器来完成此操作

我的日志输出现在如下所示:

INFO:test:[123] Started
INFO:test:[123] Doing something
INFO:test:[123] Finished
格式更改

# 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