记录器无法找到处理程序(基本示例)

时间:2016-12-17 03:40:58

标签: python logging

这个问题在不同的情况下被问过几次,而且这些问题都不足以让我理解实际发生的事情。

我的想法是我想要设置BasicConfig()的功能,以及RotatingFileHandler的旋转文件处理......但我似乎无法得到它。当我尝试添加自定义处理程序时,它不再记录sub_modules。我实际上得到错误No handlers could be found for logger "sub_log1"

这是一个简化的,功能齐全的版本:

logging_test.py(“主要”):

import logging
from logging.handlers import RotatingFileHandler
import sub_log1
import sub_log2

LOG_LVL = logging.INFO
LOG_FILENAME = 'test.log'
LOG_FORMAT = "[%(levelname)s] %(name)s %(asctime)s %(message)s"

logger = logging.getLogger(__name__)
logging.basicConfig(filename=LOG_FILENAME, format=LOG_FORMAT, level=LOG_LVL)

def main():
    logger.debug('testing debug')
    logger.info('testing info')
    logger.warning('testing warning')
    logger.error('testing error')

    sub_log1.logging_test1()
    sub_log2.logging_test2()

    logger.critical('DONE.')

if __name__ == '__main__':
    main()

sub_log1.py文件:

import logging
logger = logging.getLogger(__name__)

def logging_test1():
    logger.debug('testing debug')
    logger.info('testing info')
    logger.warning('testing warning')
    logger.error('testing error')

sub_log2.py文件:

import logging
logger = logging.getLogger(__name__)

def logging_test2():
    logger.debug('testing debug')
    logger.info('testing info')
    logger.warning('testing warning')
    logger.error('testing error')

在此配置中,'test.log'文件的输出具有预期输出:

[INFO] __main__ 2016-12-16 19:06:01,531 testing info
[WARNING] __main__ 2016-12-16 19:06:01,531 testing warning
[ERROR] __main__ 2016-12-16 19:06:01,532 testing error
[INFO] sub_log1 2016-12-16 19:06:01,532 testing info
[WARNING] sub_log1 2016-12-16 19:06:01,533 testing warning
[ERROR] sub_log1 2016-12-16 19:06:01,533 testing error
[INFO] sub_log2 2016-12-16 19:06:01,533 testing info
[WARNING] sub_log2 2016-12-16 19:06:01,533 testing warning
[ERROR] sub_log2 2016-12-16 19:06:01,533 testing error
[CRITICAL] __main__ 2016-12-16 19:06:01,534 DONE.

但是,如果我在logging_test.py

中交换日志记录部分

来自:

logger = logging.getLogger(__name__)
logging.basicConfig(filename=LOG_FILENAME, format=LOG_FORMAT, level=LOG_LVL)

到此:

# # Set up a specific logger with our desired output level
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# # Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
              LOG_FILENAME, maxBytes=1 * 1024 * 1024, backupCount=5)
# # Set the handler's level
handler.setLevel(LOG_LVL)

# # Add a formatter
formatter = logging.Formatter(LOG_FORMAT)
handler.setFormatter(formatter)

# # add the handler to the logger
logger.addHandler(handler)

我不再从sub_logging模块获取日志记录。 test.log的输出现在看起来像这样:

[INFO] __main__ 2016-12-16 19:20:32,485 testing info
[WARNING] __main__ 2016-12-16 19:20:32,485 testing warning
[ERROR] __main__ 2016-12-16 19:20:32,485 testing error
[CRITICAL] __main__ 2016-12-16 19:20:32,485 DONE.

第一个示例有效,但它只是使用logging语句填充set文件,直到该文件太大而无法处理。

但是当我添加一个RotatingFileHandler处理程序时,现在它无法接受导入模块的日志输出。它仍然从logging_test.py记录器记录,但是我丢失了很多信息而没有接受来自导入的记录输出。 我能想到的唯一解决方案是使用某种辅助脚本来检查'test.log'文件的大小,如果它变得太大则删除膨胀的文件......但这看起来太过分了为标准模块应该轻松做的事情。我是否需要为每个导入添加处理程序? 请指教?

1 个答案:

答案 0 :(得分:3)

在第一个示例中,使用

全局配置日志记录
logging.basicConfig(...)

在第二个示例中,您只配置特定于主模块的记录器的日志记录。因此,sub_log1sub_log2中的记录器仍然未配置。

您可以通过不带参数调用logging.getLogger()来访问全局(或根)记录器:

rootLogger = logging.getLogger()
rootLogger.setLevel(...)
rootLogger.addHandler(...)
...