【问题标题】:python: modify level of logs from a modulepython:从模块修改日志级别
【发布时间】:2021-11-24 19:40:42
【问题描述】:

TLDR

如果一个模块使用

log.error("something happened")

我们希望看到这些日志,但作为警告,这样对我们的最终效果将与使用该模块时相同

log.warning("something happened")

更多详情

当与 confluent.cloud 的连接出现问题时,我们使用aiokafka module which logs errors。然而,这些都是暂时的问题,一段时间后连接会重新建立,所以我们希望这些日志是 warning 而不是 error,但我们不想丢失这些日志。

有没有办法“即时”修改这些日志记录,改变它们的日志级别?我知道我可以

logger = logging.getLogger("aiokafka")
logger.setLevel(logging.CRITICAL)

但是所有日志都会丢失。

【问题讨论】:

  • 能否将错误函数改写为警告函数,即logging.getLogger("aiokafka").error = logging.getLogger("aiokafka").warning

标签: python logging python-logging


【解决方案1】:

您可以将过滤功能附加到降低级别的记录器。这是一个可用于构建的工作示例:

import logging

def downgrade_filter(record):
    if record.levelno == logging.ERROR:
        record.levelno = logging.WARNING
        record.levelname = logging.getLevelName(logging.WARNING)
    return True

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s|%(name)-8s|%(message)s')
    logger = logging.getLogger('aiokafka')
    logger.setLevel(logging.WARNING)
    logger.addFilter(downgrade_filter)
    logger.debug('This should not appear')
    logger.info('This should not appear')
    logger.warning('This should appear as a warning')
    logger.error('This should appear as a warning, though logged as an error')
    logger.critical('This should appear as a critical error')

运行时应该打印

WARNING |aiokafka|This should appear as a warning
WARNING |aiokafka|This should appear as a warning, though logged as an error
CRITICAL|aiokafka|This should appear as a critical error

(这是 Python 3.x 的最新版本)

【讨论】:

  • 这会将每个错误都变成警告 - 对吧?因此,我们最好查看日志记录属性,找到仅“过滤”我们想要修改的消息的属性。
  • 不是 every 错误,只是那些记录到该记录器的错误。我们当然可以调整过滤器功能来做任何需要的事情,但这是基本的方法。
  • 同意 - 我投了赞成票。
猜你喜欢
  • 2019-11-08
  • 2016-02-20
  • 2011-03-09
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2015-01-13
  • 2020-01-19
  • 2017-08-23
相关资源
最近更新 更多