考虑以下日志记录示例。有两个 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()
# mylib.py
import logging
def do_something():
lgr = logging.getLogger('test')
lgr.info('Doing something')
当您执行 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 View 中使用。将 main() 替换为 Django View 。
最佳答案
您无法轻松地为第三方库执行此操作(因为它们不会使用适配器,即使您在代码中使用了适配器)。但是,您可以使用过滤器来执行此操作,如文档中所述 here .
关于Python 日志记录 : Inherit contextual information,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46895678/