为外部/第三方库定制日志记录

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

I followed the advice of the django docs, and use logging like this:


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()的第三方代码。

跟进问题

避免使用logger=logging.getLogger(__name__)但不失去筛选日志的方法


你应该在settings.py中配置https://docs.djangoproject.com/en/1.9/topics/logging/。 - be_good_do_good
可能是Elegant setup of Python logging in Django的重复问题。 - be_good_do_good
@be_good_do_good 是的,我已经配置了日志记录。问题是:如何处理未命名为 logger = logging.getLogger(__name__) 的记录器。 - guettli
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Wayne Werner
你能否通过记录文件名来部分解决这个问题?文件名应该遵循PYTHONPATH,因此应该是唯一的。它不是日志记录器名称,但应该非常接近。 - aisbaa
2个回答

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!

3
那是因为他们正在使用根记录器(当您只执行时默认情况下会得到根记录器)。
import logging

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

如果你想做一些不同的事情,你有两个(或三个)选择。最好的方法是使用日志记录格式选项。或者,你可以猴子补丁你正在使用的库,例如:

import logging
import mod_with_lazy_logging

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

或者你可以通过解析ast并重写他们的日志记录代码来实现某些复杂操作。但是,不要这样做。


猴子补丁库可能可行。但有很多文件…感觉太麻烦了。 - guettli
如果这是一个开源库,我建议您要么向维护者提交问题,要么自己创建PR。或者两者都做。不使用logger = logging.getLogger(__name__),或者至少使用“库名称”似乎有些懒惰/不负责任。 - Wayne Werner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接