springboot中,将某个函数的日志单独输出的方法

背景

项目中有个节点健康检查扫描功能,每10秒扫描一次节点。
如果节点挂掉,会输出健康检查失败的日志。
测试环境,虽然配置了多个节点,但并没有都启动,所以在扫描的时候,会不断的出现报错,
对于排查日志来说,神烦。
但是节点挂掉的这个日志又不能不输出,否则正式环境要是真挂了,看不出来就很麻烦了。
所以最好的方案是这个健康检查失败的日志,能够单独输出,比如单独输出到指定文件,这样既不影响看日志,又保留了健康检查失败的日志。

解决方案

在application.yml里面,有logging配置,本来想着能不能直接在这里配出单独输出的效果,查了很多资料之后,表示没戏。
然后采用配置logback-spring.xml的方式来实现:

  • 在application.yml同级目录新建logback-spring.xml
  • 写入以下内容

<configuration><include resource="org/springframework/boot/logging/logback/defaults.xml" /><appender name="healthCheck" class="ch.qos.logback.core.FileAppender"><file>D:\fy\log\healthCheck.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>${CONSOLE_LOG_CHARSET}</charset></encoder></appender><logger name="healthCheckLog" level="info" additivity="false"><appender-ref ref="healthCheck" /></logger><root level="INFO"><appender-ref ref="CONSOLE" /></root>
</configuration>
  • 在健康检查的java类中,加入以下代码
//这里的healthCheckLog对应logback-spring.xml中<logger name="healthCheckLog" >的这个logger
private static Logger healthCheckLog = LoggerFactory.getLogger("healthCheckLog");
//在需要输出日志的地方,用这个healthCheckLog来输出日志,就可以了
healthCheckLog.error("执行器{}健康检查失败:{}",exe.customGetUrl(),e.getMessage());
  • 重启服务,完事

解决过程

解决的过程其实没有那么顺利,一开始仅配置了


<configuration><appender name="healthCheck" class="ch.qos.logback.core.FileAppender"><file>D:\fy\log\healthCheck.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><logger name="healthCheckLog" level="info" additivity="false"><appender-ref ref="healthCheck" /></logger><root level="INFO"><appender-ref ref="CONSOLE" /></root>
</configuration>

结果发现服务起不来,报Could not find an appender named [CONSOLE]. Did you define it below instead of above in the configuration file?
在这里插入图片描述
这个是因为启动的时候,它会扫描<root level=“INFO”>里面的<appender-ref ref=“CONSOLE” />,我这里写了一个<appender-ref ref=“CONSOLE” />,但是logback-spring.xml中却没有配置CONSOLE相关的appender,所以它就报错了。

然后,我补上了\ ,然后去指定了输出格式(输出格式其实不是我想指定的,而是它强制要求我要指定的,没办法,拿gpt生成了一个)。不过看着格式挺整齐的,但却没有了颜色。在我配置之前,springboot默认的可是有彩色的,比黑白的好看多了。
然后我在网络上查到了可以用%clr()这种方式给日志加上颜色,像这样:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n</pattern></encoder></appender>

结果启动的时候报:Failed to create converter for [%clr] keyword
大概意思就是它不知道%clr是什么意思,%clr其实是一个自定义的日志格式解析器,springboot有默认的实现。但由于我们自己写了配置,导致它不认spring的,只认我们的。
spring既然已经写了实现,用不起来就太可惜了,后来查了多方资料,才了解到可以这么写

<!-- 在头部引用spring的默认实现xml--><include resource="org/springframework/boot/logging/logback/defaults.xml" /><!--然后就可以用里面写好的格式--><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>${CONSOLE_LOG_CHARSET}</charset>

至此,问题完美解决

原理

spring默认会扫描application.yml目录下的所有文件,所以,只要你的文件名对,在这个目录下新建的文件就会发挥作用,因此,虽然原来没有logback-spring.xml这文件,我直接新建之后,就起效了。
logback-spring.xml这个文件其实是对application.yml里面logging配置的补充,可以理解为logging是简单配置,logback-spring.xml是高级配置。
另外还有一个配置,logback.xml,也会生效,但是据说这两个的差别是logback.xml在spring初始化之前加载,logback-spring.xml在spring初始化后加载,所以logback-spring.xml能用的东西会更多一点。

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

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

相关文章

【low-ui-vue】实现原生可扩展动态表格组件

本文字数&#xff1a;3520字 预计阅读时间&#xff1a;20分钟 所谓动态列的表格&#xff0c;就是列数不固定。像广为使用的elementUI的table组件就是表头写死的&#xff0c;这种也叫列数固定的表格。 01 效果 当然&#xff0c;动态性增加了&#xff0c;当然要做出一定“牺牲”。…

【前端vue3】TypeScrip-Class类用法

类型声明 TypeScrip定义Class类 语法&#xff1a; // 定义一个名为 Person 的类 class Person {constructor () {// 构造函数&#xff1a;稍后定义}run () {// 方法&#xff1a;稍后定义} }在TypeScript是不允许直接在constructor 定义变量的 需要在constructor上面先声明 例…

csdn上传源码资源卖钱能买房买车吗?每天最高收入200-500?

csdn上传源码卖钱能买房买车吗,最高收入200-500&#xff1f; 作者收入日榜 不***孩 收益617.32元 程***妍 收益534.56元 s***n 收益323.71元 盈***客 收益315.05元 极***计 收益284.17元

2024-06-23 编译原理实验4——中间代码生成

文章目录 一、实验要求二、实验设计三、实验结果四、附完整代码 补录与分享本科实验&#xff0c;以示纪念。 一、实验要求 在词法分析、语法分析和语义分析程序的基础上&#xff0c;将C−−源代码翻译为中间代码。 要求将中间代码输出成线性结构&#xff08;三地址代码&#…

企业级Web项目中应该如何做单元测试、集成测试和功能测试?

先自我介绍下&#xff1a; 本人有过10年测试经验&#xff0c;也参与过公安部网络安全产品测试交付、华为4G 网络设备测试交付、腾讯QQ空间APP产品测试交付。 关于“企业级Web项目中应该如何做单元测试、集成测试和功能测试”这个问题&#xff0c;我想给大家唠唠&#xff0c;我…

38 - 换座位(高频 SQL 50 题基础版)

38 - 换座位 -- 方法一 select(casewhen id%21 and id(select max(id) from seat) then idwhen id%20 then id-1else id1end) as id, student fromseat order byid;-- 方法二selectif(id%20,id-1,if(id(select max(id) from Seat),id,id1)) as id,student fromSeat order by id…

陀螺仪LSM6DSV16X与AI集成(7)----FIFO数据读取与配置

陀螺仪LSM6DSV16X与AI集成.6--检测自由落体 概述视频教学样品申请源码下载主要内容生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置量程设置FIFO水印设置速率使用流模式设置FIFO时间戳批处理速率使能时间戳FIFO状态寄存器演示…

Django数据驾驶舱

Django数据驾驶舱 1.项目介绍2.项目结构3.库表结构3.1 appcsdn的models3.2 appssq的models3.3 appweather的models3.4 appweibo的models 4.功能展示5.解决问题5.1 路由配置5.2 后端数据与前端echarts展示5.3 长图表丝滑滚动条 6.遗留问题7.资源分享 1.项目介绍 这里介绍本人最…

阿里云发送验证码流程

目录 1. 阿里云短信服务简介 2. 阿里云验证码发送流程 2.1 申请阿里云短信服务 2.2 短信模板及阿里云秘钥 1.开发者可以在自己的应用程序中集成短信发送功能。绑定发起测试的手机号&#xff0c;需要绑定的手机号才能成功发送验证码&#xff0c;其他的用户手机号发送的验…

如何在 Ubuntu 12.04 VPS 上安装和配置基本的 LDAP 服务器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 LDAP&#xff08;轻量级目录访问协议&#xff09;是一种通过文件和目录层次结构管理相关信息的协议&#xff0c;它可以从集中位置管…

【4003】基于springboot实现的线上阅读系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

ARM裸机:基础了解

ARM的几种版本号 ARM内核版本号 ARMv7 ARM SoC版本号 Cortex-A8 芯片型号 S5PV210 ARM型号的发展历程 m microcontroller微控制器 就是单片机 a application应用级处理器 就是手机、平板、电脑的CPU r realtime实时处理器 响应速度快,主要用在工业、航天等领域 soc 、cpu、…

ubutu 18.04源码编译安装freeswitch 1.10.7支持视频通话——筑梦之路

软件版本说明 ubuntu版本18.04&#xff1a;https://releases.ubuntu.com/18.04.6/ubuntu-18.04.6-live-server-amd64.iso freeswitch 版本1.10.7&#xff1a;https://files.freeswitch.org/freeswitch-releases/freeswitch-1.10.7.-release.tar.gz spandsp包&#xff1a;https:…

VB计算圆柱体积和表面积

已知圆半径和圆柱的高&#xff0c;计算圆柱体积和表面积。 Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickConst PI 3.14159Dim r As Integer, h As IntegerDim t As Single, s As Singler Val(TextBox1.Text)h V…

免杀笔记 ---> C语言

这次的更新可能有点慢&#xff0c;因为这段时间也比较忙&#xff0c;加上C语言还得和汇编结合&#xff0c;导致小编一个知识点总是得反复揣摩&#xff08;太菜了&#xff09;&#xff0c;所以免杀的更新篇幅长度可能会达到两个月和三个月&#xff0c;但是小编能保证&#xff0c…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-24深度卷积神经网络AlexNet

24深度卷积神经网络AlexNet import torch from torch import nn import liliPytorch as lp import liliPytorch as lp import matplotlib.pyplot as pltdropout1 0.5 #Alexnet架构 net nn.Sequential(nn.Conv2d(1, 96, kernel_size11, stride4, padding1),nn.ReLU(),nn.MaxPo…

智慧校园综合管理系统的优点有哪些

在当今这个信息化飞速发展的时代&#xff0c;智慧校园综合管理系统正逐步成为教育领域的一股革新力量&#xff0c;它悄然改变着我们对传统校园管理的认知。这套系统如同一个无形的桥梁&#xff0c;将先进的信息技术与学校的日常运作紧密相连&#xff0c;展现出多维度的优势。 …

训练营第四十五天 | 435. 无重叠区间763.划分字母区间56. 合并区间738.单调递增的数字968.监控二叉树

435. 无重叠区间 力扣题目链接(opens new window) 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例 1…

6/22 第四周 python操作word

学习到了word有四个段落&#xff0c;都可以通过python来操作。 并且课程的体系&#xff0c;只是一个启蒙&#xff0c;需要在公司的项目中熟悉&#xff0c;从而具备专项测试的能力。 后续每天的学习笔记也需要侧重于理解的部分。

【CPP】归并排序

目录 1.归并排序简介代码分析归并的非递归形式 1.归并排序 归并排序&#xff08;MERGE-SORT&#xff09; 是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。 将已有序的子序列合并&#xff0c;得到…