Python项目中的单一日志记录器?

5 投票
4 回答
5549 浏览
提问于 2025-04-16 14:50

我想为我的Python项目创建一个日志记录器。我希望在项目中的每个模块都使用同一个日志记录器。这样做的最佳方法是什么呢?看起来我需要一个全局的日志对象?或者说是一个可以被其他所有模块导入的日志模块?我想确保我始终在写入同一个日志文件。

我已经在使用Python的日志记录器和处理器了。问题是我必须在每个模块中都定义日志记录器要写入哪个文件。我希望只定义一次日志文件的路径,然后在每个模块中都能使用这个路径。

4 个回答

1

在__builtin__模块中定义一个日志记录器对象。这样,你就可以像使用其他Python全局函数一样访问它,而不需要在每个文件中都导入某个日志模块。

在logmodule.py文件中:

import __builtin__
__builtin__.log = logging.getLogger('global')
# ... configure your logger

在你的'main'文件中:

import logmodule

在其他文件中:

log.debug('blah')
3

单例模式(singleton pattern)非常适合这种情况。在Python中,你可以这样来实现它:

class MySingleton(object):
     __instance = None

    def __init__(self):
        if self.__class__.__instance:
            raise Exception, """
                             Tried to allocate a second instance of a singleton.
                             Use getInstance() instead.
                             """

        self.__class__.__instance = self

    @classmethod
    def getInstance(cls):
        if not cls.__instance:
            cls()

        return cls.__instance

然后你可以像平常一样导入这个模块,并使用 MySingleton.getInstance() 来获取这个类的实例。在一个应用程序中,你可以保证每次得到的都是同一个实例。

补充一下:其他人提到了 logging 模块,我也同意他们的看法,使用这个模块可能比自己写一个日志记录器要好。不过,如果你出于某种原因需要自己写日志记录器,上面的模式可能就是你想用的。

5

正如你所说,可以看看Python的logging模块

这个模块提供了一些对象,比如Logger和Handler,我觉得这些对你会有帮助。

撰写回答