我想为python项目创建一个记录器。我想确保我为项目中的每个模块使用相同的记录器。做这个的最好方式是什么?看来我需要一个全局日志记录对象?或者可能是每个其他模块导入的日志记录模块?我想确保我总是写入同一个日志文件。
我已经使用了python的logger和handler。问题是我必须定义记录器将在每个模块中写入哪个文件。我想定义一次日志文件路径,并将其用于每个模块。
答案 0 :(得分:5)
正如你所说,看看Python的logging
module
它提供了Logger和Handler之类的对象,我认为它可以为你工作。
答案 1 :(得分: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模块,我同意他们使用它可能比编写自己的记录器更好。但是,如果您因任何原因需要编写自己的记录器,上述模式可能就是您想要使用的。
答案 2 :(得分:0)
在__builtin__模块中定义记录器对象。这样,您可以像任何其他python全局函数一样访问它,而无需在每个文件中导入一些日志记录模块。
logmodule.py中的:
import __builtin__
__builtin__.log = logging.getLogger('global')
# ... configure your logger
在“主要”文件中:
import logmodule
在其他文件中:
log.debug('blah')
答案 3 :(得分:0)
安装negar ...
python3 -m pip install negar
代码
from negar import log
# method one
def x():
text = 'hello world!'
return text
log('\'x\' function return value is '+'\''+str(x())+'\'')
# method two
def y():
text = 'hello world!'
return text
log(text = '\'y\' function return value is '+'\''+str(x())+'\'' , save = 'function-log.txt' , size = 1)
结果