python的logging日志级别设置不生效
阿神
阿神 2017-04-18 10:18:05
[Python讨论组]

import logging
from logging.handlers import RotatingFileHandler

log_file = "log/log"
datetime_format = "%Y-%m-%d %H:%M:%S"
per_log_file_max_size = 10240
backup_count = 3

log_format = "%(asctime)s %(filename)sline:%(lineno)d %(message)s"

rotate_file_handler = RotatingFileHandler(log_file, maxBytes=per_log_file_max_size,
backupCount=backup_count)
rotate_file_handler.setLevel(logging.NOTSET)
formatter = logging.Formatter(log_format)
rotate_file_handler.setFormatter(formatter)
logging.getLogger('').addHandler(rotate_file_handler)

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('error')

输出:
2017-02-10 18:00:26,408 test.pyline:32 This is warning message
2017-02-10 18:00:26,408 test.pyline:33 error
2017-02-10 18:00:26,408 test.pyline:34 critical

设置的日志级别是NOSET,实际上是WARNING
求解释:

阿神
阿神

闭关修行中......

全部回复(1)
大家讲道理

因为 NOSET 日志级别的效果是这样的:

 Logger.setLevel(lvl)

    Sets the threshold for this logger to lvl. Logging messages which are less severe than lvl will be ignored. When a logger is created, the level is set to NOTSET (which causes all messages to be processed when the logger is the root logger, or delegation to the parent when the logger is a non-root logger). Note that the root logger is created with level WARNING.

    The term ‘delegation to the parent’ means that if a logger has a level of NOTSET, its chain of ancestor loggers is traversed until either an ancestor with a level other than NOTSET is found, or the root is reached.

    If an ancestor is found with a level other than NOTSET, then that ancestor’s level is treated as the effective level of the logger where the ancestor search began, and is used to determine how a logging event is handled.

    If the root is reached, and it has a level of NOTSET, then all messages will be processed. Otherwise, the root’s level will be used as the effective level.

因为 logging.getLogger('')(root logger)的默认日志级别是 WARNING 不是 NOSET,所以 rotate_file_handler 将使用这个 WARNING 的日志级别。

将 logging.getLogger('') 的日志级别也改为 NOTSET 就可以了:

logger = logging.getLogger('')
logger.setLevel(logging.NOTSET)
logger.addHandler(rotate_file_handler)
$ cat log
2017-02-10 23:04:23,583 test.pyline:20 This is debug message
2017-02-10 23:04:23,584 test.pyline:21 This is info message
2017-02-10 23:04:23,584 test.pyline:22 This is warning message
2017-02-10 23:04:23,584 test.pyline:23 error

参考:

  • https://docs.python.org/3/lib...

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号