【问题标题】:Am I using logging correctly? [closed]我是否正确使用日志记录? [关闭]
【发布时间】:2015-10-06 07:00:19
【问题描述】:

我注意到,当我调用另一个函数时,即使它没有通过,它仍然可以访问记录器。例如,以下文件总是写入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')

这是应该怎么做的吗?另外,我正在做的项目分为几个模块,完成后会互相调用。每个模块是否应该有一个单独的日志文件?如果是这样,约定是否只是在创建它的脚本之后命名日志文件?

【问题讨论】:

标签: python logging


【解决方案1】:

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

记录器名称层次结构类似于 Python 包 层次结构,如果您将记录器组织在一个 使用推荐的结构以每个模块为基础 logging.getLogger(__name__)。那是因为在一个模块中,__name__ 是 Python 包命名空间中的模块名称。

这样做可以让您对日志记录进行相对细粒度的控制。默认情况下(使用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')

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 2012-10-23
    • 2011-06-07
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多