我试图将getLogger放在模块级别。但是,它有一些缺点。这是我的例子:
from logging.handlers import TimeRotatingFileHandler
log_monitor = logging.getLogger('monitorlog')
log_monitor.setLevel(logging.DEBUG)
log_monitor.propagate = False
handler = TimedRotatingFileHandler('somedirectory/monitor.log',
when='h',
interval=1,
backupCount=30)
monitor_format = logging.Formatter('%(asctime)s: %(message)s')
handler.setFormatter(monitor_format)
log_monitor.addHandler(handler)
问题是,当某个其他模块导入此模块时,将执行上述代码。有可能,那时somedirectory
甚至不存在,构建将失败。
实际上,这个记录器将在一个类中使用,所以我想将getLogger
放入类中。但是,我觉得如果人们创建该类的多个对象,那么这段代码将被多次调用。我想这段代码只能被调用一次。
我对python很新。人们通常把getLogger
放在哪里,在这种情况下,我应该把这段代码放在哪里?
答案 0 :(得分:1)
简短回答,您只需确保在创建目录后设置记录器。
如果你想导入上面的内容,然后才创建文件,一种方法是将你的代码放在一个函数中。
def monitor_log_setup():
log_monitor = logging.getLogger('monitorlog')
log_monitor.setLevel(logging.DEBUG)
log_monitor.propagate = False
handler = TimedRotatingFileHandler('somedirectory/monitor.log',
when='h',
interval=1,
backupCount=30)
monitor_format = logging.Formatter('%(asctime)s: %(message)s')
handler.setFormatter(monitor_format)
log_monitor.addHandler(handler)
return log_monitor
现在可以安全地导入此模块,您只需要确保在开始记录之前调用该函数(在创建目录之后)。
然后,您可以在整个代码中使用logging.getLogger('monitorlog')
返回函数中定义的相同记录器。
答案 1 :(得分:0)
我认为问题在于你正试图混淆" import"使用" init",您希望API调用者在导入库或模块后,日志对象可用,这种行为将导致混淆理解。 我认为最好的做法是提供一个" init"方法,来电者呼叫" init"方法,使对象可用。 但是,您也可以在文件中提供隐式初始化方法,或者只是创建日志文件(如果它不存在)。