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

时间:2016-08-11 13:12:10

标签: python django logging

我遵循了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

如果代码使用root代替logging.info()

,我希望看到长版本(不是logger.info()

更新

这不是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

2 个答案:

答案 0 :(得分:4)

正如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!

答案 1 :(得分:3)

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

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并重写它们的日志代码来做一些粗糙的事情。但是,不要这样做。