Python 日志记录 : Inherit contextual information

标签 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.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/

相关文章:

python - 如何处理 GRequests 中的错误?

java - 如何使用 spring 记录 RestTemplate 请求和响应?

c++ - IIS 的自定义日志记录模块

python - 从较大的数据帧创建旋转/融化数据帧的有效方法

java - 如何在 Java 中记录异常?

java - Java 中的 C++ 样式多态输出

python - Shell - 尝试输出日志文件的最后部分(时间戳是分隔符)

python - 需要删除列表中的所有重复值

python - 使用 Flask (Python) 从 MySQL 数据库获取 "Some"数据

python - 在 Python 中的文本文件的特定行中附加数据?