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?
在这里插入图片描述这个是因为启动的时候,它会扫描里面的,我这里写了一个,但是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能用的东西会更多一点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

油猴hook+内存爆破

hook方式 说明&#xff1a;来回翻页发现只有请求体的token需要逆向&#xff0c;而这个请求体是在params里&#xff0c;拼接到url里&#xff0c;可以直接用油猴hook url里的关键字token。 正常步骤 hook代码 // UserScript // name hookparams // namespace htt…

前端易遭受的六大安全威胁,以及对应解决策略。

前端遭受安全威胁可能会导致用户隐私泄露、账户被盗用、系统遭受攻击、用户体验受损等严重后果&#xff0c;所有安全防御也成了前端开发者的必须课之一&#xff0c;贝格前端工场带领大家了解下常见的安全威胁。 一、前端开发面临的安全风险 1. 跨站脚本攻击&#xff08;XSS&a…

项目实施经理岗位的工作内容(合集)

项目实施经理岗位的工作内容1 职责&#xff1a; (1)负责协调软件团队对软件产品的研发工作(包括代码开发&#xff0c;测试&#xff0c;部署实施等); (2)引导和解析客户需求&#xff0c;根据产品特点及用户个性化需求制定解决方案&#xff0c;完成客户宣讲等售前技术支持工作; (…

【CT】LeetCode手撕—141. 环形链表

目录 题目1- 思路2- 实现⭐141. 环形链表——题解思路 3- ACM实现 题目 原题连接&#xff1a;141. 环形链表 1- 思路 模式识别 模式1&#xff1a;判断链表的环 ——> 快慢指针 思路 快指针 ——> 走两步慢指针 ——> 走一步判断环&#xff1a;若快慢相遇则有环&a…

聊聊我构建SMoE模型的过程

这篇博客详细讲述了从头开始构建一个稀疏混合专家&#xff08;sparse mixture of experts&#xff09;语言模型的过程。该项目深受 Andrej Karpathy 的 “makemore” 项目启发&#xff0c;并借鉴了许多可重用的组件。与 makemore 类似&#xff0c;makeMoE 也是一种按字符顺序生…

AI与业务的结合 | 使用机器学习预测客户反应,轻松实现市场营销策略优化

01、案例说明 在实际的工作中&#xff0c;除了数据本身需要处理之外&#xff0c;同时也需要对所建立模型进行检验与了解。所以在这个过程之中我们学习2个比较进阶的功能&#xff1a;一个是关于决定属性和结果之间的关系从而判断哪些是更重要的属性&#xff1b;另外一部分则是在…

【CPP】直接选择排序、堆排序

目录 1.选择排序1.1简介1.2代码1.3分析 2.堆排序2.1简介2.2代码2.3分析 1.选择排序 1.1简介 思路&#xff1a;遍历一遍&#xff0c;选出最大值和最小值的下标&#xff0c;然后与第一个和最后一个数字交换位置。 1.2代码 1.3分析 最好复杂度&#xff1a;O(N^2) 最差复杂度&am…

Sui的Fastcrypto加密库刷新速度记录

Sui使用的加密库Fastcrypto打破了许多速度记录&#xff0c;Mysten Labs在基准测试和安全分析中的工作修复了许多安全漏洞&#xff0c;同时通过识别新的优化技巧为创新开辟了道路。 最近在伦敦帝国理工学院举行的国际性能工程会议&#xff08;ICPE&#xff09;基准测试研讨会上…

编译原理:代替LR的MP:2.遇到的问题

用指针加速 MP是multi-pass&#xff0c;多遍分析法&#xff0c;它是从“先乘除后加减”中得来的灵感。在实践中&#xff0c;发现C语言优先级有15级&#xff0c;如果将源代码处理15遍&#xff0c;每一遍都从头开始找&#xff0c;势必很慢。所以&#xff0c;有了用指针加速的想法…

开发者配置项、开发者选项自定义

devOptions.vue源码 <!-- 开发者选项 &#xff08;CtrlAltShiftD&#xff09;--> <template><div :class"$options.name" v-if"visible"><el-dialog:custom-class"sg-el-dialog":append-to-body"true":close-on…

发力采销,京东的“用户关系学”

作者 | 曾响铃 文 | 响铃说 40多岁打扮精致的城市女性&#xff0c;在西藏那曲的偏远农村&#xff0c;坐着藏民的摩托车&#xff0c;行驶在悬崖边的烂泥路上&#xff0c;只因为受顾客的“委托”&#xff0c;要寻找最原生态的藏区某款产品。 30多岁的憨厚中年男性&#xff0c;…

【吊打面试官系列-Mysql面试题】SQL 语言包括哪几部分?每部分都有哪些操作关键字?

大家好&#xff0c;我是锋哥。今天分享关于 【SQL 语言包括哪几部分&#xff1f;每部分都有哪些操作关键字&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; SQL 语言包括哪几部分&#xff1f;每部分都有哪些操作关键字&#xff1f; SQL 语言包括数据定义(DDL)、…

[创业之路-117] :制造业企业的必备管理神器-ERP-是什么?企业经营管理与EPR的主要功能模块与全流程

目录 一、什么是EPR 1.1 跨企业的供应链思想 1.2 EPR的概念&#xff1a;企业资源管理计划 1.2.1 助力企业管理各种资源&#xff1a;人、财、物&#xff08;机、料、法、环&#xff09; 1.2.2 助力企业有效管理 1.2.3 效率的提升 1.4 应用领域 二、ERP的功能模块 三、E…

ROS2学习笔记三:话题Service

目录 前言 1 话题简介 2 常用指令 3 RCLCPP实现实现话题 3.1 创建工作空间 3.2 代码编写 3.2.1 发布端编写 3.2.2 发布端编写 前言 Service是ROS 2提供的一种通信机制&#xff0c;用于在不同节点之间进行请求和响应。 Service允许一个节点向另一个节点发送请求&#…

CSS实现文字上下滚动、间歇滚动和无限滚动

目录 1、连续滚动2、间歇性向上滚动3、任意个数向上滚动 本文主要记录了如何实现文字上下滚动效果&#xff0c;实现主要就是用到了css3的两个属性&#xff1a; framekeys和 animation 1、连续滚动 <div class"scroll-continuous"><div class"content…

计算机专业毕设-在线商城系统

1 项目介绍 在线商城系统&#xff0c;后端java语言&#xff0c;springboot&#xff0c;SSM框架。前端thymeleaf&#xff0c;前后端不分离。本项目已经隐去作者信息&#xff0c;所有代码文件均没有创建人和创建时间&#xff0c;可以放心使用。 系统用户分为两类&#xff0c;管理…

Shopee菲律宾本土店允许中途无理由退货,如何应对退货后库存混乱问题?

Shopee菲律宾本土店最近实施了一项新政策&#xff0c;自2024年6月10日起&#xff0c;允许买家在商品仍在运输途中申请退货与退款&#xff0c;此即“在途退货/退款”功能&#xff0c;主要的目的是为了提升买家的购物体验&#xff0c;增强市场竞争力。 图源&#xff1a;Shopee菲律…

关于Panabit在资产平台中类型划分问题

现场同事问了一个问题&#xff1a;Panabit能不能当做CentOS接入&#xff1f; 我第一反应是&#xff1a;Panabit是个什么鬼&#xff1f;为啥要混编接入&#xff1f;后期维护都是事啊。所以&#xff0c;我就想回答&#xff1a;不能&#xff01; 但是&#xff0c;最好要给出一个…

立讯精密:“果链一哥”怎么摆脱依赖症

AI手机创新赋能&#xff0c;隔岸苹果股价走出历史新高&#xff0c;消费电子有望迎来复苏&#xff1f; 这里我们聊聊苹果产业链代工龙头——立讯精密 作为早早入场的代工企业&#xff0c;立讯精密曾经吃足“果链”红利&#xff0c;如今摆在它面前的是增长、毛利、安全等难题。 …

Linux-PXE批量安装

一、部署 PXE 远程安装服务 在大规模的 Linux 应用环境中&#xff0c;如 Web 群集、分布式计算等&#xff0c;服务器往往并不配备光驱设备&#xff0c;在这种情况下&#xff0c;如何为数十乃至上百台服务器裸机快速安装系统呢&#xff1f;传统的 USB光驱、移动硬盘等安装方法显…