Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:将logging.getLogger放在何处_Python_Logging - Fatal编程技术网

Python:将logging.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

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

我认为问题在于,您试图将“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')
在整个代码中需要时返回函数中定义的相同记录器