Python:在哪里放置logging.getLogger

时间:2015-02-17 03:33:30

标签: python logging

我试图将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放在哪里,在这种情况下,我应该把这段代码放在哪里?

2 个答案:

答案 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"方法,使对象可用。     但是,您也可以在文件中提供隐式初始化方法,或者只是创建日志文件(如果它不存在)。