自定义外部/第三方库的日志记录

Posted

技术标签:

【中文标题】自定义外部/第三方库的日志记录【英文标题】:Customize logging for external/third-party libs 【发布时间】:2016-12-18 06:05:43 【问题描述】:

我遵循了 django 文档的建议,并像这样使用日志记录:

import logging
logger = logging.getLogger(__name__)

def today(...):
    logger.info('Sun is shining, the weather is sweet')

使用我当前的配置,输出如下所示:

2016-08-11 14:54:06 mylib.foo.today: INFO Sun is shining, the weather is sweet

不幸的是,一些我无法修改的库使用这样的日志记录:

import logging

def third_party(...):
    logging.info('Make you want to move your dancing feet')

不幸的是,输出如下所示:

2016-08-09 08:28:04 root.third_party: INFO Make you want to move your dancing feet

我想看看这个:

2016-08-09 08:28:04 other_lib.some_file.third_party: INFO Make you want to move your dancing feet

区别:

root.third_party ==> other_lib.some_file.third_party

如果代码使用logging.info() 而不是logger.info(),我想查看长版本(不是root

更新

这不是Elegant setup of Python logging in Django的重复,因为它的解决方案是:

报价开始

在每个模块中,我定义了一个记录器使用

logger = logging.getLogger(__name__)

引用结束。

不,我不会修改使用logging.info() 而不是logger.info() 的第三方代码。

跟进问题

Avoid logger=logging.getLogger(__name__) without loosing way to filter logs

【问题讨论】:

docs.djangoproject.com/en/1.9/topics/logging 你应该在你的settings.py中配置它 Elegant setup of Python logging in Django的可能重复 @be_good_do_good 是的,我配置了日志记录。问题是:如何处理未以logger = logging.getLogger(__name__)命名的记录器 另外,我可能会向上游库提交错误报告。没有任何借口在模块中使用logger = logging.getLogger(__name__) 你能通过记录文件名部分解决这个问题吗?文件名应该尊重 PYTHONPATH,因此应该是唯一的。它不是记录器名称,但应该非常接近。 【参考方案1】:

正如 Wayne Werner 所建议的,我会使用日志记录格式选项。这是一个例子。

文件 1:external_module

import logging
def third_party():
    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger()

    logger.info("Hello from %s!"%__name__)

文件 2:main

import external_module
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(module)s.%(funcName)s: %(levelname)s %(message)s')
logger = logging.getLogger(__name__)

def cmd():
    logger.info("Hello from %s!"%__name__)
    external_module.third_party()
cmd()

输出:

2016-08-11 09:18:17,993 main.cmd: INFO Hello from __main__!
2016-08-11 09:18:17,993 external_module.third_party(): INFO Hello from external_module!

【讨论】:

【参考方案2】:

那是因为他们使用的是根记录器(这是您在执行时默认得到的

import logging

logging.info("Hi! I'm the root logger!")

如果您想做一些不同的事情,您有两个(或三个)选项。最好使用Log Record format options。或者,您可以修改您正在使用的库,例如

import logging
import mod_with_lazy_logging

mod_with_lazy_logging.logger = logging.getLogger(mod_with_lazy_logging.__name__)

或者你可以通过解析 ast 并重写他们的日志代码来做一些粗糙的事情。但是,不要那样做。

【讨论】:

猴子补丁库可以工作。但是它有很多文件……感觉工作量太大了。 如果它是一个开源库,我建议要么向维护者提交问题,要么自己创建一个 PR。或两者。不使用logger = logging.getLogger(__name__),或者至少不使用'library name' 似乎很懒惰/不负责任。

以上是关于自定义外部/第三方库的日志记录的主要内容,如果未能解决你的问题,请参考以下文章

python-日志模块

自定义错误日志记录类

自定义日志注解 + AOP实现记录操作日志

自定义log4j的appender写es日志

SpringAOP+自定义注解实现日志记录

SpringAOP+自定义注解实现日志记录