聊聊logback的DuplicateMessageFilter
序
本文主要研究一下logback的DuplicateMessageFilter
TurboFilter
ch/qos/logback/classic/turbo/TurboFilter.java
public abstract class TurboFilter extends ContextAwareBase implements LifeCycle {private String name;boolean start = false;/*** Make a decision based on the multiple parameters passed as arguments. The* returned value should be one of <code>{@link FilterReply#DENY}</code>,* <code>{@link FilterReply#NEUTRAL}</code>, or* <code>{@link FilterReply#ACCEPT}</code>.* * @param marker* @param logger* @param level* @param format* @param params* @param t* @return*/public abstract FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params,Throwable t);public void start() {this.start = true;}public boolean isStarted() {return this.start;}public void stop() {this.start = false;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
TurboFilter继承了ContextAwareBase,声明实现LifeCycle接口,它定义了decide方法由子类实现
DuplicateMessageFilter
ch/qos/logback/classic/turbo/DuplicateMessageFilter.java
public class DuplicateMessageFilter extends TurboFilter {/*** The default cache size.*/public static final int DEFAULT_CACHE_SIZE = 100;/*** The default number of allows repetitions.*/public static final int DEFAULT_ALLOWED_REPETITIONS = 5;public int allowedRepetitions = DEFAULT_ALLOWED_REPETITIONS;public int cacheSize = DEFAULT_CACHE_SIZE;private LRUMessageCache msgCache;@Overridepublic void start() {msgCache = new LRUMessageCache(cacheSize);super.start();}@Overridepublic void stop() {msgCache.clear();msgCache = null;super.stop();}@Overridepublic FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {int count = msgCache.getMessageCountAndThenIncrement(format);if (count <= allowedRepetitions) {return FilterReply.NEUTRAL;} else {return FilterReply.DENY;}}public int getAllowedRepetitions() {return allowedRepetitions;}/*** The allowed number of repetitions before* * @param allowedRepetitions*/public void setAllowedRepetitions(int allowedRepetitions) {this.allowedRepetitions = allowedRepetitions;}public int getCacheSize() {return cacheSize;}public void setCacheSize(int cacheSize) {this.cacheSize = cacheSize;}}
DuplicateMessageFilter继承了TurboFilter,它使用了LRUMessageCache(
默认大小100)来缓存format,decide方法会执行getMessageCountAndThenIncrement,若超出allowedRepetitions(默认5)则返回FilterReply.DENY,否则返回FilterReply.NEUTRAL
LRUMessageCache
ch/qos/logback/classic/turbo/LRUMessageCache.java
class LRUMessageCache extends LinkedHashMap<String, Integer> {private static final long serialVersionUID = 1L;final int cacheSize;LRUMessageCache(int cacheSize) {super((int) (cacheSize * (4.0f / 3)), 0.75f, true);if (cacheSize < 1) {throw new IllegalArgumentException("Cache size cannot be smaller than 1");}this.cacheSize = cacheSize;}int getMessageCountAndThenIncrement(String msg) {// don't insert null elementsif (msg == null) {return 0;}Integer i;// LinkedHashMap is not LinkedHashMap. See also LBCLASSIC-255synchronized (this) {i = super.get(msg);if (i == null) {i = 0;} else {i = i + 1;}super.put(msg, i);}return i;}// called indirectly by get() or put() which are already supposed to be// called from within a synchronized blockprotected boolean removeEldestEntry(Map.Entry<String, Integer> eldest) {return (size() > cacheSize);}@Overridesynchronized public void clear() {super.clear();}
}
LRUMessageCache继承了LinkedHashMap,其初始size为
cacheSize * (4.0f / 3),getMessageCountAndThenIncrement方法内部通过synchronized加锁获取指定msg的次数,不存在则设置为0,存在则递增;其removeEldestEntry方法判断size() > cacheSize
小结
DuplicateMessageFilter继承了TurboFilter,它使用了LRUMessageCache(默认大小100)来缓存format,decide方法会执行getMessageCountAndThenIncrement,若超出allowedRepetitions(默认5)则返回FilterReply.DENY,否则返回FilterReply.NEUTRAL。
相关文章:
聊聊logback的DuplicateMessageFilter
序 本文主要研究一下logback的DuplicateMessageFilter TurboFilter ch/qos/logback/classic/turbo/TurboFilter.java public abstract class TurboFilter extends ContextAwareBase implements LifeCycle {private String name;boolean start false;/*** Make a decision …...
WordPress 文档主题模板Red Line -v0.2.2
此主题作为框架,做承载第三方页面之用,例如飞书文档等, 您可以将视频图片等资源放第三方文档上,通过使用此主题做目录用。 此主题使用前后端分离开发,也使用了一些技术尽量不影响正常的SEO,还望注意。 源码…...
网络和Linux网络_1(网络基础)网络概念+协议概念+网络通信原理
目录 1. 网络简介 1.1 独立模式和互联网络模式 1.2 局域网LAN和广域网WAN 2. 协议和协议分层 2.1 协议的作用 2.2 协议分层 2.3 OSI七层模型 3.2 TCP/IP四层(五层)模型 3. 网络通信原理 3.1 协议报头 3.2 局域网和解包分用 3.3 广域网和跨网络 4. 网络中的地址 4…...
AI生成PPT工具——Gamma,结合GPT生成不错的效果
AI生成PPT工具——Gamma,结合GPT生成不错的效果 先告诉GPT我现在要参加一个比赛,请他帮忙梳理一下内容。当然整个过程需要不断调整,GPT生成的内容也不是一次就是最好的 不断调整之后让其列出提纲即可,如下: 紧接着我们…...
DcatAdmin使用模版文件时模板标签不生效
伪源码 PHP代码如下 public function 方法名(){return view(view_dir.view_name,[key1>value1]); }模版代码如下 <tr><td>键名</td> </tr> <tr><td>{{ $key1 }}</td> </tr>现象: 页面htmlt元素正常展示&…...
【算法】算法题-20231114
这里写目录标题 一、LCR 181. 字符串中的单词反转二、557. 反转字符串中的单词 III三、344. 反转字符串四、给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。五、力扣第49题:字母异位词分组 一、LCR 181. 字符串中的单词反转 …...
时序数据库 TDengine + 高级分析软件 Seeq,助力企业挖掘时序数据潜力
作为一款制造业和工业互联网(IIOT)高级分析软件,Seeq 支持在工艺制造组织中使用机器学习创新的新功能。这些功能使组织能够将自己或第三方机器学习算法部署到前线流程工程师和主题专家使用的高级分析应用程序,从而使单个数据科学家…...
【Rust 日报】2023-11-12 socketioxide
gosub.io正在尝试用Rust构建一个Web浏览器 一个html5的分词器/解析器,正在成为浏览器的项目。 GoSub是Gateway to Optimized Searching and Unlimited Browsing的简称,目前还处于极早期阶段。 GitHub: https://github.com/gosub-browser socketioxide 0.…...
Redis快速入门(基础篇)
简介: 是一个高性能的 key-value数据库。 存在内存中 与其他 key-value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类…...
(三)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…...
SpringBoot--中间件技术-3:整合mongodb,整合ElasticSearch,附案例含代码(简单易懂)
SpringBoot整合mongodb 实现步骤: pom文件导坐标 <!--mongo--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency&g…...
matlab 二自由度操纵稳定性汽车模型
1、内容简介 略 19-可以交流、咨询、答疑 二自由度操纵稳定性汽车模型 二自由度、操纵稳定性、操纵动力学 2、内容说明 1 模型假设 忽略转向系的影响,以前、后轮转角作为输入;汽车只进行平行于地面的平面运动,而忽略悬架的作用…...
超越任务调度的极致:初探分布式定时任务 XXL-JOB 分片广播
XXL-JOB 是一个分布式任务调度平台,支持分片任务执行。 1. 依赖引入 在项目中引入 XXL-JOB 的相关依赖。通常,你需要在项目的 pom.xml 文件中添加如下依赖: <dependency><groupId>com.xuxueli</groupId><artifactId&…...
设计模式-备忘录模式(Memento)
设计模式-备忘录模式(Memento) 一、备忘录模式概述1.1 什么是备忘录模式1.2 简单实现备忘录模式1.3 使用备忘录模式的注意事项 二、备忘录模式的用途三、备忘录模式实现方式3.1 基于数组的备忘录实现方式3.2 基于集合的备忘录实现方式3.3 基于HashMap的备…...
【机器学习】正则化到底是什么?
先说结论:机器学习中的正则化主要解决模型过拟合问题。 如果模型出现了过拟合,一般会从两个方面去改善,一方面是训练数据,比如说增加训练数据量,另一方面则是从模型角度入手,比如,降低模型复杂…...
Rust5.2 Generic Types, Traits, and Lifetimes
Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 10: Generic Types, Traits, and Lifetimes lib.rs use std::fmt::Display;//Traits: …...
c 实用化的摄像头生成avi视频程序(加入精确的时间控制)
I时间控制是指:生成了n张图片帧用了多少时间m。帧率等于n/m。对应于头文件,m等于scale, n等于rate.为了精确,采用微秒计时。 I此程序生成的视频远好于ffmpeg,可能是此程序没有压缩数据原因吧。 现在的帧率不高,是因…...
Web后端开发_01
Web后端开发 请求响应 SpringBoot提供了一个非常核心的Servlet 》DispatcherServlet,DispatcherServlet实现了servlet中规范的接口 请求响应: 请求(HttpServletRequest):获取请求数据响应(HttpServletRe…...
二十、泛型(6)
本章概要 问题 任何基本类型都不能作为类型参数实现参数化接口转型和警告重载基类劫持接口 自限定的类型 古怪的循环泛型自限定参数协变 问题 本节将阐述在使用 Java 泛型时会出现的各类问题。 任何基本类型都不能作为类型参数 正如本章早先提到的,Java 泛型的…...
Java18新增特性
前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16、Java17 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
