Python模块的正确日志记录实现

时间:2015-05-30 23:26:35

标签: python logging

有没有人知道有很好的日志记录实现的模块的任何好例子?

我一直在记录几种不同的方法,但我不确定哪种方式最像Pythonic。

对于脚本,这就是我一直在做的事情:

import logging

LOGGER = logging.getLogger(__program__)
STREAM = logging.StreamHandler()
FORMATTER = logging.Formatter('(%(name)s) %(levelname)s: %(message)s')
STREAM.setFormatter(FORMATTER)
LOGGER.addHandler(STREAM)

def main():
    LOGGER.warning('This is a warning message.')

这是在全局命名空间中执行的,我可以从任何地方调用LOGGER

上述解决方案对于模块来说并不是一个好主意,因为代码是在导入时执行的。所以对于模块,我一直在调用这个_logging()函数来设置日志记录。

def _logging():
    import logging

    global logger
    logger = logging.getLogger(__program__)
    stream = logging.StreamHandler()
    formatter = logging.Formatter('(%(name)s) %(levelname)s: %(message)s')
    stream.setFormatter(formatter)
    logger.addHandler(stream)

def main():
    _logging()
    logger.warning('This is a warning message.')

由于logger是全局的,我可以在任何需要的地方调用它。但是pylint会发出全局变量未定义的警告。它被定义为全局变量logger在模块级别未定义当通过“global”语句定义变量但变量未在模块范围中定义时使用但我不确定为什么这是一个问题。

或者我应该尽早调用_logger()函数(减去全局),然后在需要的地方创建记录器?

def _logging():
    import logging

    logger = logging.getLogger(__program__)
    stream = logging.StreamHandler()
    formatter = logging.Formatter('(%(name)s) %(levelname)s: %(message)s')
    stream.setFormatter(formatter)
    logger.addHandler(stream)

def main():
    _logging()
    logger = logging.getLogger(__program__)
    logger.warning('This is a warning message.')

最后一种技术似乎是最干净的,尽管是最乏味的,特别是因为我经常从几十个小类,函数,方法等中进行记录。那些已经在这片领域开辟道路的人/模块是否有任何例子?

0 个答案:

没有答案