【发布时间】:2017-05-02 21:15:14
【问题描述】:
这个问题在不同的情况下被问过几次,但没有一个足够笼统,让我无法理解实际发生的情况。
我的想法是我想要设置 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.
第一个示例有效,但它只是用日志语句填充设置文件,直到该文件变得太大而无法处理。
但是当我添加一个 RotatingFileHandler 处理程序时,它现在不能接受来自导入模块的日志输出。它仍然从 logging_test.py 记录器中记录,但是我在不接受导入的日志输出的情况下丢失了很多信息。 我能想到的唯一解决方案是使用某种辅助脚本来检查“test.log”文件的大小,如果文件太大则删除臃肿的文件......但这似乎太多了为标准模块应该轻松完成的事情所做的努力。我是否需要为每个导入添加处理程序? 请指教?
【问题讨论】:
-
仅供参考,有更多支持stackoverflow.com/questions/345991/…
-
万一有人来这里找这个stackoverflow.com/q/44188270/1581226