python logging添加filter例子

本文介绍了三种不同的自定义日志过滤器实现方法,通过这些方法可以更灵活地控制哪些日志消息会被记录下来。例如,可以设置过滤器只允许记录特定级别以下的日志消息或者依据日志记录的名字进行过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例子一

def filter(self, record):
        """Our custom record filtering logic.

        Built-in filtering logic (via logging.Filter) is too limiting.
        """
        if not self.filters:
            return True
        matched = False
        rname = record.name # shortcut
        for name in self.filters:
            if rname == name or rname.startswith(name+'.'):
                matched = True
        return matched

例子二

def _create_log_handlers(stream):
    """Create and return a default list of logging.Handler instances.

    Format WARNING messages and above to display the logging level, and
    messages strictly below WARNING not to display it.

    Args:
      stream: See the configure_logging() docstring.

    """
    # Handles logging.WARNING and above.
    error_handler = logging.StreamHandler(stream)
    error_handler.setLevel(logging.WARNING)
    formatter = logging.Formatter("%(levelname)s: %(message)s")
    error_handler.setFormatter(formatter)

    # Create a logging.Filter instance that only accepts messages
    # below WARNING (i.e. filters out anything WARNING or above).
    non_error_filter = logging.Filter()
    # The filter method accepts a logging.LogRecord instance.
    non_error_filter.filter = lambda record: record.levelno < logging.WARNING

    non_error_handler = logging.StreamHandler(stream)
    non_error_handler.addFilter(non_error_filter)
    formatter = logging.Formatter("%(message)s")
    non_error_handler.setFormatter(formatter)

    return [error_handler, non_error_handler]

例子三

def _default_handlers(stream):
    """Return a list of the default logging handlers to use.

    Args:
      stream: See the configure_logging() docstring.

    """
    # Create the filter.
    def should_log(record):
        """Return whether a logging.LogRecord should be logged."""
        # FIXME: Enable the logging of autoinstall messages once
        #        autoinstall is adjusted.  Currently, autoinstall logs
        #        INFO messages when importing already-downloaded packages,
        #        which is too verbose.
        if record.name.startswith("webkitpy.thirdparty.autoinstall"):
            return False
        return True

    logging_filter = logging.Filter()
    logging_filter.filter = should_log

    # Create the handler.
    handler = logging.StreamHandler(stream)
    formatter = logging.Formatter("%(name)s: [%(levelname)s] %(message)s")
    handler.setFormatter(formatter)
    handler.addFilter(logging_filter)

    return [handler]


### Python Logging 实现日志去重 为了防止Python `logging`模块中的日志重复记录,在配置日志记录器时可以采取多种策略。一种常见的方式是在每次完成日志记录操作后,通过移除处理器(`Handler`)来避免后续的日志再次被该处理器处理[^4]。 然而更优雅的做法可能是利用过滤器(`Filter`)机制。创建自定义的过滤类,用于判断消息是否已经存在从而阻止其被多次发送给同一个目标。下面是一个简单的例子展示如何实现这一点: ```python import logging class SingleLevelFilter(logging.Filter): def __init__(self, passlevel=logging.INFO, reject=False): self.passlevel = passlevel self.reject = reject def filter(self, record): if self.reject: return (record.levelno != self.passlevel) else: return (record.levelno == self.passlevel) # 创建 logger 对象 logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 设置控制台输出 handler 并添加单次级别过滤器实例 ch = logging.StreamHandler() filter_instance = SingleLevelFilter(reject=True) # 这设置为 True 表示拒绝指定级别的日志 ch.addFilter(filter_instance) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) logger.addHandler(ch) try: raise ValueError("A custom value error.") except Exception as e: logger.error(e, exc_info=True) finally: ch.flush() # 移除 handler 来防止可能的日志重复打印 logger.removeHandler(ch) ``` 上述代码片段展示了怎样构建一个能够有效减少冗余信息量的系统;它不仅可以通过调整`SingleLevelFilter`内部逻辑达到更加精细粒度上的控制,而且还可以结合其他技术手段如数据库存储已有的错误指纹等进一步增强功能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值