我正确使用日志记录吗?

时间:2015-07-16 17:31:48

标签: python logging

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

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

1 个答案:

答案 0 :(得分:1)

最好的方法是遵循Python logging documentation

中的建议
  

记录器名称层次结构类似于Python包   层次结构,如果您在a上组织记录器,则与它相同   每个模块使用推荐的结构   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')