Python项目中的单一日志记录器?
我想为我的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,我觉得这些对你会有帮助。