Python:放在哪里 logging.getLogger

Python: Where to put logging.getLogger

我尝试将 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 甚至不存在,构建将失败。

实际上,这个记录器将在class中使用,所以我正在考虑将getLogger放入class中。但是,我觉得如果人们创建那个 class 的多个对象,那段代码将被调用多次。我想这部分代码应该只被调用一次。

我是 python 的新手。人们通常把他们的 getLogger 放在哪里,在这种情况下,我应该把这段代码放在哪里?

我认为问题在于您试图混淆 "import" 和 "init",您希望在导入库或模块后调用 API,日志对象是available,这种行为会导致混淆理解。 我认为最好的做法是提供一个"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') 到 return 函数中定义的相同记录器。