logback之自定义过滤器

news2025/1/7 4:05:33

logback有两种过滤器,一种是context中的过滤器叫TurboFilter,是一个全局的过滤器,会影响所有的日志记录。另一种是Appender中的过滤器,只对所在的append有效。两者大同小异,这里我们以Appender的过滤器为例。

(一)自定义一个过滤器

我们先实现一个LevelRangeFilter,目的是对日志区间进行过滤,只有在[minLevel,maxLevel)中的日志事件才允许输出到日志文件中,如下:

package com.mall.common.log;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.AbstractMatcherFilter;
import ch.qos.logback.core.spi.FilterReply;

/**
 * @author Lft
 * @since 2024/12/30 21:49
 */
public class LevelRangeFilter extends AbstractMatcherFilter<ILoggingEvent> {
    Level minLevel;
    Level maxLevel;

    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }
        if (minLevel == null) {
            if (!event.getLevel().isGreaterOrEqual(maxLevel)) {
                return onMatch;
            } else {
                return onMismatch;
            }
        } else if (maxLevel == null) {
            if (event.getLevel().isGreaterOrEqual(minLevel)) {
                return onMatch;
            } else {
                return onMismatch;
            }
        }

        if (event.getLevel().isGreaterOrEqual(minLevel) && !event.getLevel().isGreaterOrEqual(maxLevel)) {
            return onMatch;
        } else {
            return onMismatch;
        }
    }

    public void setMinLevel(Level minLevel) {
        this.minLevel = minLevel;
    }

    public void setMaxLevel(Level maxLevel) {
        this.maxLevel = maxLevel;
    }

    public void start() {
        if (this.minLevel != null || this.maxLevel != null) {
            super.start();
        }
    }
}

过滤器的过滤方法decide很简单,只是对日志事件的级别进行判断,是否在[minLevel,maxLevel)进行判断,支持[,maxLevel)以及[minLevel,)。

几个注意事项:

(1)过滤器必须实现Filter接口,这里建议继承AbstractMatcherFilter

(2)minLevel和maxLevel这两个属性是自定义的,需要在xml配置文件中配置,那么需要提供set方法,以便xml解析时能够通过隐式规则进行设置。

(3)提供start方法,更符合它的设计理念。

(二)xml配置文件配置过滤器

<configuration scan="true" scanPeriod="1 minute" debug="true">
    <!--<turboFilter class=""/>-->
    <!-- Appenders -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/logback.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 -->
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="impossible" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/impossible.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>impossible.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} %msg%n</pattern>
        </encoder>
        <filter class="com.mall.common.log.LevelRangeFilter">
            <minLevel>WARN</minLevel>
            <maxLevel>ERROR</maxLevel>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <logger name="impossible" additivity="false">
        <appender-ref ref="impossible"/>
    </logger>

    <!-- Root Logger -->
    <root level="Info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ROLLING"/>
    </root>
</configuration>

过滤器配置日志级别是[WARN,ERROR),所以只会输出WARN级别日志。

使用如上测试程序,运行如下:

ps:日志过滤器如何生效的源码,在上一篇《logback日志框架源码分析》中的第四节-打印日志中有详细介绍,想了解的可转到那篇进行了解,这里不再重复介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2271339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AcWing练习题:面积

给定三个浮点数 A&#xff0c;B 和 C。 然后&#xff0c;计算如下图形的面积&#xff1a; 底边为 A&#xff0c;高为 C 的三角形。半径 C 的圆。&#xff08;π3.14159&#xff09;底边为 A 和 B&#xff0c;高为 C 的梯形。边长为 B 的正方形。边长为 A 和 B 的长方形。 输…

三甲医院等级评审八维数据分析应用(一)--组织、制度、管理可视化篇

一、引言 1.1 研究背景与意义 在当今医疗领域,三甲医院作为医疗服务的核心载体,肩负着保障民众健康、推动医学进步的重任。随着信息技术的飞速发展,数据已成为医院运营管理、医疗质量提升以及科学决策的关键要素。三甲医院等级评审作为衡量医院综合实力与服务水平的重要标…

Spring Bean的初始化过程是怎么样的?

文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ Spring Bean 的初始化过程主…

快速上手LangChain(四)LangChain Hub和LangSmith

文章目录 快速上手LangChain&#xff08;四&#xff09;LangChain Hub和LangSmith什么是LangChain HubLangChain Hub功能 LangSmith使用 快速上手LangChain&#xff08;四&#xff09;LangChain Hub和LangSmith 什么是LangChain Hub LangChain Hub官网地址&#xff1a;https:…

无人机遥控器频率解析!

1.4GHz无人机遥控器工作核心技术 传输距离&#xff1a;1.4GHz频率的无人机遥控器具有较远的传输距离&#xff0c;这使得无人机可以在较大范围内与地面控制站或其他通信节点进行可靠的通信。这种特性特别适用于需要覆盖较大区域的任务或远距离飞行的场景。 穿透力&#xff1a;…

TypyScript从入门到精通

TypyScript从入门到精通 TypyScript 是什么&#xff1f;增加了什么环境搭建二、为何需要 TypeScript三、编译 TypeScript四、类型声明五、类型推断基本类型六、类型总览JavaScript 中的数据类型TypeScript 中的数据类型1. 上述所有 JavaScript 类型2. 六个新类型&#xff1a;3.…

RabbitMq的Java项目实践

在现代软件开发中&#xff0c;消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;作为一种重要的组件&#xff0c;承担着上下游消息传递和通信的重任。RabbitMQ作为一款流行的开源消息队列中间件&#xff0c;凭借其高可用性、可扩展性和易用性等特点&#xff0c…

CK40N或CK24标准成本发布出现标记不到物料的情况:评估视图中允许的成本核算变式选择错误

用户打电话反馈标准成本发布在标记环节出现错误&#xff1a; 检查&#xff1a; 1、MM03已经维护了税价1。 2、CK13N&#xff1a; 没有成本没本滚算。 用户是用CK40N处理的&#xff0c; 我让他用CK11N/CK24再处理一次。 仍然报错. 我也试了一个也是报错。 准备CRK1删除原来的…

【HENU】河南大学计院2024 计算机体系结构 期末复习知识点

和光同尘_我的个人主页 一直游到海水变蓝。 体系结构 第一章&#xff1a;计算机系统基础知识计算机系统的实质计算机系统的设计的4个定量原理Amdahl定律CPU性能公式程序的局部性原理: 第二章&#xff1a;指令系统的设计指令系统结构的分类通用寄存器型结构 哈夫曼编码MIPS指令…

Docker 远程访问完整配置教程以及核心参数理解

Docker 远程访问完整配置教程 以下是配置 Docker 支持远程访问的完整教程&#xff0c;包括参数说明、配置修改、云服务器安全组设置、主机防火墙配置&#xff0c;以及验证远程访问的详细步骤。 1. 理解 -H fd:// 参数的作用&#xff08;理解了以后容易理解后面的操作&#xff…

如何在不丢失数据的情况下从 IOS 14 回滚到 IOS 13

您是否后悔在 iPhone、iPad 或 iPod touch 上安装 iOS 14&#xff1f;如果你这样做&#xff0c;你并不孤单。许多升级到 iOS 14 beta 的 iPhone、iPad 和 iPod touch 用户不再适应它。 如果您在正式发布日期之前升级到 iOS 14 以享受其功能&#xff0c;但您不再适应 iOS 14&am…

vue3 css实现文字输出带光标显示,文字输出完毕,光标消失的效果

Vue实现过程如下&#xff1a; <template><div ><p ref"dom_element" class"typing" :class"{over_fill: record_input_over}"></p></div> </template> <script setup> import {onMounted, ref} from…

Postman测试big-event

报错500。看弹幕&#xff0c;知道可能是yml或sql有问题。 所以检查idea工作台&#xff0c; 直接找UserMapper检查&#xff0c;发现完全OK。 顺着这个error发现可能是sql有问题。因为提示是sql问题&#xff0c;而且是有now()的那个sql。 之后通过给的课件&#xff0c;复制课件…

Wonder Dynamics技术浅析(八):实拍与虚拟合成

该模块旨在将实拍视频与计算机生成的虚拟场景无缝融合&#xff0c;生成具有高度真实感的视觉效果。 一、实拍视频与虚拟场景合成概述 实拍视频与虚拟场景合成的主要目标是将实拍视频中的元素与计算机生成的虚拟场景进行无缝融合&#xff0c;生成具有高度真实感的最终影像。 …

Javascript算法——回溯算法(子集和全排列问题)

子集问题 思路 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话&#xff0c;那么组合问题和分割问题都是收集树的叶子节点&#xff0c;而子集问题是找树的所有节点&#xff01; 78.子集 相比组合问题&#xff0c;此子集问题题目更为简单&#xff0c;收集的是树的所有…

网络安全系统学习实验1:RDP远程登录配置

准备工作&#xff1a; 0、准备好虚拟机 1、服务器侧&#xff08;虚拟机Windows 2003-01&#xff09;IP地址&#xff1a; # 获得服务器的IP地址192.168.58.223 ipconfig /all2、客户端侧(虚拟机Win7 pte_czj)IP地址&#xff1a; # 客户端侧IP地址192.168.58.222 ipconfig /al…

SMMU软件指南之系统架构考虑

安全之安全(security)博客目录导读 目录 5.1 I/O 一致性 5.2 客户端设备 5.2.1 地址大小 5.2.2 缓存 5.3 PCIe 注意事项 5.3.1 点对点通信 5.3.2 No_snoop 5.3.3 ATS 5.4 StreamID 分配 5.5 MSI 本博客介绍与 SMMU 相关的一些系统架构注意事项。 5.1 I/O 一致性 如…

[网络安全]sqli-labs Less-3 解题详析

判断注入类型 GET1 and 11&#xff0c;回显如下&#xff1a;GET1 and 12&#xff1a;没有回显&#xff0c;说明该漏洞类型为GET型单引号字符型注入 判断注入点个数 GET1 order by 2 --&#xff0c;回显如下&#xff1a;由上图可知&#xff0c;sql语法中给$id加上了() 猜测后…

vulnhub Earth靶机

搭建靶机直接拖进来就行 1.扫描靶机IP arp-scan -l 2.信息收集 nmap -sS -A -T4 192.168.47.132 得到两个DNS; 在443端口处会让我们加https dirb https://earth.local/ dirb https://terratest.earth.local/ #页面下有三行数值 37090b59030f11060b0a1b4e0000000000004312170a…

AWS 申请证书、配置load balancer、配置域名

申请AWS证书 点击 request 申请完证书&#xff0c;AWS 会验证你对于域名的所有权&#xff0c;有两种方式&#xff0c;DSN 验证和邮箱验证。 这里说一下DSN 验证&#xff0c;上图中 Domains 中有CNAME name 和 CNAME value 。 在domain 网站中添加一个CNAME DSN 项&#xff0c;…