找不到记录器的处理程序(基本示例)

2024-06-16 09:13:59 发布

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

这个问题在不同的情况下被问过几次,但没有一个是一般性的,足以让我理解到底发生了什么。

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

下面是它的一个简化的、功能齐全的版本:

logging_test.py(“main”):

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)

我不再从子日志模块获取日志。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文件,直到该文件变得太大而无法处理为止。

但是,当我添加一个正在旋转filehandler的处理程序时,它现在不能接受来自导入模块的日志输出。它仍然从logging_test.py logger中进行日志记录,但是我在不接受导入的日志输出的情况下丢失了很多信息。 我能想到的唯一解决方案是,使用某种辅助脚本来检查“test.log”文件的大小,如果文件太大,则将其删除。。。但对于一个标准模块来说,这似乎太费劲了。我需要向每个导入添加处理程序吗? 请告知?


Tags: 文件nametestimportinfologmainlogging
1条回答
网友
1楼 · 发布于 2024-06-16 09:13:59

在第一个示例中,使用

logging.basicConfig(...)

在第二个示例中,仅为特定于主模块的记录器配置日志记录。因此,sub_log1sub_log2中的记录器保持未配置状态。

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

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

相关问题 更多 >