Python项目间的日志记录

1 投票
2 回答
552 浏览
提问于 2025-04-18 04:12

关于Python中的日志记录,已经有很多文章了,但我还没找到关于如何在多个项目中统一日志记录的全面内容。比如,大家在Github上分享的项目,很多人都会重复使用(这就是Github的目的)。我认为任何项目都需要日志记录,特别是在开发中的项目。所以我想问,怎样才能让日志记录尽可能开放和易于使用呢?

最近,我开始喜欢在主包的__init__.py文件中加载一个配置文件。

import logging.config
import sys
from traceback import print_exception

fileconf = "logging.conf"
try:
    logging.config.fileConfig(fileconf)
except:
    print "Could not use %s for configuration because:" % (fileconf,)
    print_exception(*sys.exc_info())

然后每个模块都会从一个专门的日志模块logger.py中获取一个日志记录器:

import logging

def get_logger(name):
    logger = logging.getLogger(name)
    return logger

不过,我发现把这个方法直接扩展到多个项目上并不简单。我希望能够使用同一个配置文件作为标准。

那么,我该如何创建项目,以便轻松使用超级项目的日志配置呢?也许可以先检查一下日志是否已经被配置过?

2 个回答

1

库项目一般不应该自己设置日志记录(不过可以提供一些帮助工具来做到这一点)。日志记录的配置应该由主程序来完成,而且最好是在它们的 if __name__ == '__main__' 这部分代码里。你提到的情况,应该是在一个包的 __main__.py 文件中进行配置(因为这个文件是用来运行包的),而不是在 __init__.py 中(尽量避免在导入时产生副作用)。

我不太明白你的 logger.py 有什么价值,因为在每个需要记录日志的模块中使用

logger = logging.getLogger(__name__)

对大多数人来说,这样做通常效果很好。

如果你想使用一个标准的配置文件,最好只为根日志记录器配置处理器(因为如果不这样做,你就会配置特定于项目的日志记录器)。如果你使用 dictConfig() 而不是 fileConfig(),那么在合并库的配置字典和你的主配置时,会更灵活一些。

1

如果你想给一个项目添加日志功能,那你只需要使用日志记录器,然后把配置的事情留给使用它的人或其他相关的东西。

举个例子,假设你想在一个模块里记录一些信息:

def my_method():
    try:
        # do something...
    except Exception as e:
        logger = logging.getLogger(__name__)
        logger.error("error doing something: {}".format(e))

__name__ 会返回模块的名字,包括包的路径(比如 project.path.to.module),这样需要使用这个项目或者多个项目的人就可以加载自己的配置文件,并为每个项目定义日志设置。

要避免在模块层面加载配置,而是把它留作可选(可以放在一个方法里,或者放在 if __name__ == '__main__' 里,这样可以避免冲突)。

这似乎是一个关于良好日志实践的不错参考: http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python

撰写回答