Spring-boot-自定义LogbackAppender

在spring boot中,只要我们在项目的resource文件夹中,增加了一个叫logback-spring.xml的文件,那么spring boot就会自动识别日志配置,并应用这个文件里的配置,这是由ClasspathLoggingApplicationListener类做的

appender: 是用来处理系统的日志输出到哪里的东西,比如我可以有2个appender,一个appender用来将日志打印到控制台,一个appender用来将日志打印到我电脑C盘的某个文件中,这就是appender,当然,logback自己已经定义了很多appender

假设我的logback-spring.xml文件内容如下,那么此时启动服务,则不会打印任何内容,控制台一片空白,不知道的还以为服务卡住起不来了呢,其实已经起来了,只是没有打印任何内容,当然,这是因为这个配置文件里没有配置appender的原因,尤其是没有输出到控制台的appender,所以我们在控制台看不到任何内容

<?xml version="1.0" encoding="UTF-8"?>
<configuration></configuration>

开始自定义Appender

步骤1: 因为打印日志就是appender的工作,配置文件中如果没有appender,那么就不会打印日志,所以我们自定义一个appender,需要继承AppenderBase

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;public class TestAppender extends AppenderBase<ILoggingEvent> {@Overrideprotected void append(ILoggingEvent eventObject) {// 这个eventObject就是日志信息,我们调用println方法将其打印到控制台System.out.println(eventObject);}
}

注意:其中泛型必须为ILoggingEvent,可能是由于这个API过早写的,看名字我们就知道,多说一句,大写I开头的接口,这都是以前从事C++的工作写出来的,比如在RabbitMQ源码中,很多接口都是大写I开头,因为早期C++的开发工具不能一目了然看出是接口还是实现类,而有些Java开发者不明所以,也用这种方式,这是非常不好的行为,话已至此,其实这个地方根本就不需要泛型,直接形参就可以了,如果用我们自定义的泛型(日志事件)是否可行呢?答案是不行的,当我们打印日志的时候,logback拿到ILoggingEvent,然后判断当前这个appender接收的事件是否为ILoggingEvent,如果不是,那么它不会调用append方法,例如下面的代码就是错误的

public class TestAppender extends AppenderBase<XXXEvent> {// 这个方法不会被调用,因为它的事件类型不是ILoggingEvent@Overrideprotected void append(XXXEvent eventObject) {System.out.println(eventObject);}
}

步骤2: 下面将我们自定义的appender告诉logback,这样它就会用我们的appender打印日志了

<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="hehe" class="com.example.demo.TestAppender"></appender><!-- 只打印info级别及以上的日志 --><root level="info"><appender-ref ref="hehe" /></root>
</configuration>

本文就到这里,主要阐述如何自定义appender,比如我们想将日志用flink统一收集起来然后实时分析,那么此时我们就可以自定义一个appender,当然,logback自己实现了很多appender,多数情况下我们是不需要自定义appender的

从业这么久,实际项目开发中,我只用过两次自定义appender
1.统一收集日志到kafka,然后推到flink
2.我们的devops平台日志功能不完善,所以我们统一收集日志,打到了阿里云上

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

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

相关文章

赶紧收藏!2024 年最常见 20道并发编程面试题(六)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道并发编程面试题&#xff08;五&#xff09;-CSDN博客 十一、什么是读写锁&#xff08;Reader-Writer Locks&#xff09;&#xff1f; 读写锁&#xff08;Reader-Writer Locks&#xff09;&#xff0c;也称为共享…

Kubernetes集群持久化部署实践

WordPress 网站持久化部署 要持久化MariaDB 可以把 Deployment 改成了 StatefulSet&#xff0c;修改 YAML添加“serviceName”“volumeClaimTemplates”这两个字段&#xff0c;定义网络标识和 NFS 动态存储卷&#xff0c;然后在容器部分用“volumeMounts”挂载到容器里的数据目…

八 、VS的调试技巧

--- 24.4.20 目录 1、什么是Bug&#xff1f; 2、什么是调试&#xff08;Debug&#xff09;&#xff1f; 3、Debug和Release 4、VS基础调试快捷键 4.1、环境准备 4.2、调试快捷键 5、监视和内存观察 5.1、监视窗口 5.2、内存窗口 6、调试举例1 7、调试举例2 8、调试…

旅行者1号有什么秘密?飞行240多亿公里,为什么没发生碰撞?

旅行者1号有什么秘密&#xff1f;飞行240多亿公里&#xff0c;为什么没发生碰撞&#xff1f; 自古以来&#xff0c;人类就对浩瀚无垠的宇宙充满了好奇与向往。从最初的仰望星空&#xff0c;到如今的深空探测&#xff0c;人类探测宇宙的历史发展可谓是一部波澜壮阔的史诗。 在…

缺陷 规避

1. NPE 空指针异常(Null Pointer Exception) 1)使用注解 NotNull 和 Nullable 2)用 Optional 处理链式调用 3)用 Objects.equals(a,b) 代替 a.equals(b)&#xff0c;能够避免任意对象为 null 时的 NPE。 4)使用空对象模式,空对像模式通过一个特殊对象代替不存在的情况&…

如何模拟一个元素(如一个链接 <a>)被禁用(disabled)的状态

就像表单元素&#xff08;如 <input>、<button> 等&#xff09;的 disabled 属性一样。 要模拟一个元素被禁用的状态&#xff0c;你可以使用CSS来移除或改变该元素的交互性&#xff0c;并为其添加视觉上的提示。以下是一些建议的方法&#xff1a; 移除交互性&…

双指针练习:有效三角形的个数

题目链接&#xff1a;611.有效三角形的个数 题目描述&#xff1a; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 解法一&#xff08;暴力求解&#xff09;&#xff08;会超时&#xff09;&#xff1a; 算法思路&#xff1a; 三层…

Chromium源码阅读:从页面加载到元素展示(1)

​ 从&#xff1c;p&#xff1e;hello world&#xff1c;/p&#xff1e;.html到界面上的hello world 今天&#xff0c;我们一起来看看一个html元素&#xff0c;是如何绘制到界面上。我们选择了最简单的场景&#xff0c;便于快速掌握总体的流程&#xff0c;加深之前阅读知识的…

yolo模型评估指标相关概念

mAP&#xff08;mean Average Precision 平均精度&#xff09;&#xff0c;是一个经常被用来衡量目标 检测模型是否具有较好性能的指标。 计算mAP需要先计算每一类物体的AP&#xff0c;然后取平均值&#xff0c;所以下面介绍的 TP,FP,FN,TN都是针对某一类物体&#xff08;目标&…

Java课程设计:基于Javaweb的超市商品管理系统

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 管理员用户&#xff1a;需要能够添加商品类型以及商品&#xff0c;能够对商品进行管理&#xff0c;能够查询用户信息&#xff0c;能够查询出售记录&#xff1b;普通用户&#xff1a;需要能够搜索商品…

搜维尔科技:【应用】人形机器人将成为引领产业新浪潮的尖兵

特斯拉纷纷发表人形机器人计划&#xff0c;预示这项先进科技将成为下一个颠覆性的殖民地。人形机器人被视为继电脑、智能手机和电车之后,又一个将改变世界的创新产品。 全球人口结构正在快速老化&#xff0c;至2050年60岁以上人口将达22%,是现今的两倍。劳动人口短缺迫在眉睫&…

NewspaceAi之GPT使用新体验

GPT功能 使用地址&#xff1a;https://newspace.ai0.cn/ 上车 挂挡 踩油门&#xff0c;一脚到底&#xff0c;开始你的表演 问题1&#xff1a;你能做什么详细告诉我&#xff1f; 下面内容是GPT的回答 当然&#xff01;作为一个基于GPT-4架构的AI&#xff0c;我能够在许多方面为…

cocomap计算原理

### 计算 mAP 的过程 1. **初始化和准备工作&#xff1a;** - 加载并初始化评估参数和结果&#xff0c;包括类别、IoU 阈值、召回率阈值、面积范围和最大检测数等。 - 初始化用于存储精度、召回率、得分和 F1 分数的数组。 2. **遍历每个类别、面积范围和最大检测数量&…

关于FPGA对 DDR4 (MT40A256M16)的读写控制 2

关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 2 语言 &#xff1a;Verilg HDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 2一、引言二、DDR4的简介四、DDR4 SDRAM状态框图 关键词&#x…

mysql5.7安装后未要求输入密码就能使用mysql登录原因

ubuntu20安装mysql5.7后&#xff0c;在root用户下直接运行mysql就能进入数据库。在其它用户下却无法登录&#xff0c;提示以下错误&#xff1a; Access denied for user ‘root’localhost’ 原因是root用户默认使用socket认证&#xff1a; mysql> select user,plugin fro…

Java 泛型与集合的深入解析:原理、应用与实践

泛型的基本原理 为什么需要泛型 在Java 5之前&#xff0c;Java的集合类只能存储Object类型的对象。这意味着&#xff0c;存储在集合中的对象在取出时需要进行类型转换&#xff0c;这不仅繁琐&#xff0c;而且容易出错。泛型通过在编译时进行类型检查&#xff0c;确保类型安全…

使用canvas制作一个无人机旋转特效

​ 使用HTML5的Canvas API来制作一个无人机旋转特效。这个特效将包括一个无人机图标&#xff08;你可以使用任何你喜欢的图标&#xff09;&#xff0c;它会在一个固定的位置旋转。 首先&#xff0c;我们需要创建一个HTML文件&#xff0c;然后在其中添加一个canvas元素。canvas…

用Unity创造自己的绿洲

“谢谢你能玩我的游戏&#xff01;” 希望将来我也能做出一款影响全世界的游戏&#xff0c;就比如现在的《英雄联盟》&#xff0c;或是电影里的《绿洲》&#xff01;然后也说出这么一句话&#xff1a;谢谢你能玩我的游戏&#xff01; 阶段性的总结一下 那就展示一下最近完成的…

【Hachker News】如果你不需要钱,你会干什么?

Hachker News上的一个问题&#xff0c;标题是“如果你不需要钱&#xff0c;你会做什么&#xff1f;” 回答摘要 问题链接&#xff1a;What would you spend your time working on if you didn’t need money? A1&#xff1a; 我会把时间投入到城市周围的农村地区&#xff0c…

Matlab使用Simulink仿真实现AM和BPSK信号的解调

前言 本篇实现了基于AM和BPSK调制的通信系统&#xff0c;采用Bernoulli Binary Generator生成随机二元序列&#xff0c;码元速率为0.5秒/个。AM调制使用Sine Wave模块生成载波&#xff0c;频率40Hz&#xff0c;相位π/2。BPSK调制通过Switch模块切换相位0和π的载波。信号传输…