这个问题在不同的情况下被问过几次,但没有一个是一般性的,足以让我理解到底发生了什么。
我的想法是要设置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”文件的大小,如果文件太大,则将其删除。。。但对于一个标准模块来说,这似乎太费劲了。我需要向每个导入添加处理程序吗? 请告知?
在第一个示例中,使用
在第二个示例中,仅为特定于主模块的记录器配置日志记录。因此,
sub_log1
和sub_log2
中的记录器保持未配置状态。您可以通过调用
logging.getLogger()
来访问全局(或根)记录器,无需参数:相关问题 更多 >
编程相关推荐