我是否正确使用日志记录?

2024-06-25 22:49:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到,当我调用另一个函数时,它仍然可以访问记录器,即使它没有被传递。例如,以下文件总是写入testlogger.log

import logging
from datetime import datetime

def printHello():
    print('Hello')
    logger.info('printed hello')
    printGoodbye()

def printGoodbye():
    print('Goodbye')
    logger.info('printed goodbye')

if __name__ == "__main__":
    logger = logging.getLogger(__name__)
    FORMAT = '%(name)s - %(levelname)s - %(message)s'
    logging.basicConfig(filename='testlogger.log', level=logging.DEBUG, format=FORMAT)
    logger.info(datetime.now().strftime('%H:%M %d-%m-%Y.log'))
    logger.info('About to call function printHello')
    printHello()
    logger.info('Now exiting')

应该这样做吗?另外,我正在进行的项目被分为几个模块,完成后,这些模块将互相调用。每个模块是否应该有一个单独的日志文件?如果是这样的话,是否约定只是以创建日志文件的脚本的名称命名?你知道吗


Tags: 模块文件nameimportinfologdatetimelogging
1条回答
网友
1楼 · 发布于 2024-06-25 22:49:24

最好的方法是遵循Python logging documentation的建议:

The logger name hierarchy is analogous to the Python package hierarchy, and identical to it if you organise your loggers on a per-module basis using the recommended construction logging.getLogger(__name__). That’s because in a module, __name__ is the module’s name in the Python package namespace.

这样做将使您能够对日志进行相对细粒度的控制。默认情况下(使用logging.basicConfig),每个模块的日志记录都将以相同的方式工作:它将处于同一级别,并转到同一位置,但如果需要,现在可以为特定模块打开或关闭日志记录,或者为一个模块打开高级别日志记录。请参见Python logging to multiple handlers, at different log levels?以获取如何执行该操作的示例。你知道吗

跨函数访问logger变量的原因是,当您在顶层为它赋值时,会创建一个“全局”变量(它不是真正的全局变量,它有模块作用域)。更好的方法是在脚本顶部自己显式创建记录器:

import logging
from datetime import datetime

logger = logging.getLogger(__name__)


def printHello():
    print('Hello')
    logger.info('printed hello')
    printGoodbye()

def printGoodbye():
    print('Goodbye')
    logger.info('printed goodbye')

if __name__ == "__main__":
    FORMAT = '%(name)s - %(levelname)s - %(message)s'
    logging.basicConfig(filename='testlogger.log', level=logging.DEBUG, format=FORMAT)
    logger.info(datetime.now().strftime('%H:%M %d-%m-%Y.log'))
    logger.info('About to call function printHello')
    printHello()
    logger.info('Now exiting')

相关问题 更多 >