Python:将logging.getLogger放在何处
我尝试将getLogger置于模块级别。然而,它也有一些缺点。以下是我的例子:Python:将logging.getLogger放在何处,python,logging,Python,Logging,我尝试将getLogger置于模块级别。然而,它也有一些缺点。以下是我的例子: from logging.handlers import TimeRotatingFileHandler log_monitor = logging.getLogger('monitorlog') log_monitor.setLevel(logging.DEBUG) log_monitor.propagate = False handler = TimedRotatingFileHandler('somedire
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
放在哪里?在这种情况下,我应该将这段代码放在哪里?我认为问题在于,您试图将“import”与“init”混为一谈,您希望API调用程序在导入库或模块后,日志对象可用,这种行为将导致理解混乱。
我认为最佳实践是提供一个“init”方法,调用方调用“init”方法,使对象可用。
但是,您也可以在文件中提供隐式init方式,或者如果日志文件不存在,则只创建日志文件。简短回答,您只需要确保在创建目录后进行日志记录器设置 如果要导入上述内容,然后才创建文件,一种方法是将代码放入函数中
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')
在整个代码中需要时返回函数中定义的相同记录器