Python日志:继承上下文信息
考虑下面的日志记录示例。有两个python文件,myapp.py和mylib.pyPython日志:继承上下文信息,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.
# 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()
对于第三方库,您无法轻松做到这一点(因为即使您在代码中使用了适配器,它们也不会使用适配器)。但是,您可以使用文档中描述的过滤器来完成此操作 我的日志输出现在如下所示:
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