nacos配置变更导致logback日志异常

问题背景:

        线上的服务突然内存爆满,查服务器突然发现,日志全部打印到了/tmp/tomcat.xxx.port目录下,后来对应操作时间,和nacos修改配置是同一时间发生的,但是疑惑的点是,nacos配置变更为什么会引起logback的日志打印目录突然切换,以下是分析结论和原理。

原理分析:

总结简述:

初始化logsystem的配置会发生在两个阶段或者说两次,按照启动顺序依次讲述:

        1.第一次是在服务启动的时候,初始化配置时对logback的xml配置进行流读取后saxParser解析,此时因为服务还处于未完全启动的阶段,读取变量catalina.home时候,不管是当前上下文还是系统变量中都是null,所以NodeToStringTransformer类在handleVariable方法中赋值了默认值(下面有具体表示)UNDEFINED_PROPERTY_SUFFIX = "_IS_UNDEFINED";也就造成了日志系统根目录都在这个目录下,即catalina.home_IS_UNDIFINED。

        2.而完全启动服务后,tomcat会默认在临时路径下(linux 是/tmp。windows是C:\Users\Administrator\AppData\Local\Temp)创建tomcat.随机数字.port的文件夹,目的是为了存储临时缓存和一些文件上传(multipartFile)时候使用。也会随之将catalina.home变量赋值为新建的这个临时目录。

        3.在后续nacos配置变更时,触发日志系统配置重置后,再次读取logback.xml并解析变量时,变量的值和刚启动时已经不同,也就导致之后的日志全部输出到变量赋值后的临时目录下,随后临时目录磁盘较小(3G),在写满之后,日志在缓存中,导致后续内存飙升。

源码分析:

1.服务启动过程中,LoggingApplicationListener监听器监听事件进行环境参数初始化配置:

图片.png

图片.png

准备读取logginSystemProperties配置

图片.png

初始化配置

图片.png

加载配置文件,读取到配置文件logback.xml的全路径

图片.png

图片.png

根据文件全路径进行IO流读取文件内容:

图片.png

图片.png

接下来处理xml文件中的每个节点,进入到了NodeToStringTransformer类(这个类是具体针对节点变量进行读取操作)

图片.png

读取到catalina.home打断点查看,可以看到不管是从系统变量还是上下文中获取都是null,随后赋予了默认值 UNDEFINED_PROPERTY_SUFFIX = "_IS_UNDEFINED";所以日志文件会写在catalina.home_IS_UNDIFINED下。

2b9c27fcbb0f5230f73768b488166a77.png

eb24c6f6edfccf2ddb62236ceac8f3c5.png

=================================================================== 服务启动后修改nacos配置,通过spi插件机制触发springcloud的配置类初始化:

图片.png

和服务启动时一样,进入LogbackLoggingSystem这个类的初始化配置值方法。

图片.png

同样在catalina.home变量处打断点:

5cf5c4ae173ed573c3d11276330e6fd8.png

从lookupKey方法调用获取系统变量方法中已经能获取到服务启动后创建的tomcat临时目录。

图片.png

2e7197713e8ebbeecc07f8e66ea28d12.png

也就直接返回,不在走下一步逻辑中的赋默认值操作。

a8fb2f0492122dc6c00f8536fee9603a.png

到这里之后,catalina.home变量赋值已经改变,后续的日志也会往新的路径打印。

处理方法:

将${catalina.home}变量赋值,或者去掉,总之变为固定路径。避免在服务启动过程中日志路径的变化。

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

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

相关文章

Git 是一种分布式版本控制系统常用指令

Git 是一种分布式版本控制系统,用于跟踪文件的变化并协同多人在同一个项目中进行开发。以下是一些常用的 Git 指令和它们的使用介绍: 1. 初始化一个新仓库 git init 用途:在当前目录初始化一个新的 Git 仓库。使用:在项目根目录执…

BLIoTLink软网关,一键解决OT层与IT层的通信

在工业自动化领域,协议转换一直是一个重要的问题。不同的设备、系统往往使用不同的通信协议,这给数据采集、设备接入等带来很大的困扰。为了解决这个问题,各种协议转换软件应运而生。其中,BLIoTLink作为一款功能强大的嵌入式工业协…

动态规划:解决复杂问题的利器(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

量子计算:探索未来的计算技术

量子计算:探索未来的计算技术 引言 在过去的几十年里,我们见证了计算机技术从简单的计算和存储发展到复杂的数据处理和人工智能的飞速进步。然而,随着我们进一步探索科技的前沿,传统的计算方法开始显示出其局限性。在这种情况下,量子计算——一种基于量子力学原理的新型计…

一文读懂Asyncio

什么是Asyncio asyncio 是用来编写并发代码的库,使用async/await语法。 asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。 asyncio 往往是构建 IO 密集型和高层级结构化…

值得收藏的15 个好用的 iPad/iPhone 数据恢复工具

有时您需要从移动或平板设备恢复关键数据。 许多人已经开始在手机上存储重要文件,因为他们可以在旅途中或现在几乎在任何情况下轻松访问数据。 不言而喻; 您只需在手机上轻轻一按,即可轻松访问电子邮件、共享图片、编辑和共享文档、支付账单等。一般来…

《数据结构、算法与应用C++语言描述》-优先级队列-大根堆的C++实现

优先级队列 完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_25Priority queue 定义 优先级队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权或值,对优先级队列执行…

智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

华天动力-OA8000 MyHttpServlet 文件上传漏洞复现

0x01 产品简介 华天动力OA是一款将先进的管理思想、 管理模式和软件技术、网络技术相结合,为用户提供了低成本、 高效能的协同办公和管理平台。 0x02 漏洞概述 华天动力OA MyHttpServlet 存在任意文件上传漏洞,未经身份认证的攻击者可上传恶意的raq文件…

【前端系列】前端存档术之keep-alive

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Kubernetes技术与架构-安全性

本文主要从不同层面与多个维度描述Kubernetes技术与架构的安全性。 云原生的安全性 从系统分层架构的角度分析,自底向上,云原生的安全性主要包括云、集群、容器以及代码四个层面,简称云原生4C安全,其架构图如下所示:…

万宾科技水环境综合治理监测系统的融合与应用

随着社会经济的快速发展,我国的水环境污染问题日益凸显,这不仅对生态环境造成了严重破坏,也严重威胁到人民群众的健康和生活质量。为了解决这一问题,城市生命线与水环境综合治理监测系统应运而生,二者的结合将为水环境…

【Linux】Linux中git的基本使用(三板斧)

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和Linux还有算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 …

MySQL 中的锁(一)

MySQL 中的锁 按照 MySQL 官方的说法,InnoDB 中锁可以分为: 可见,InnoDB 中锁非常多,总的来说,可以如下分类: 这些锁都是做什么的?具体含义是什么?我们现在来一一学习。 8.1. 解…

基于YOLOv8深度学习的生活垃圾分类目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

数据结构-选择排序(简单选择、堆)

简单选择排序 基本思想 非常基础的算法,假设有N个数据,比较N-1轮,每轮选出当前剩余数据的最大(最小)放到数据 的开头,之后重复即可获得答案。 示例 代码 void SelectSort(OrderList *L) {RecordType t…

MySQL与其他数据库产品的比较,优势在哪里?

作为数据库管理领域的博主作家,我深知数据库在软件开发和数据管理中的重要性。在当今众多的数据库产品中,MySQL作为一种流行的开源关系型数据库管理系统,具有许多优势和特点。下面,我将通过对与其他数据库产品的比较以及MySQL的优…

Ubuntu22.04 server版本关闭DHCP,手动设置ip

在Ubuntu 22.04 中,网络配置已迁移到 Netplan,因此可以使用 Netplan 配置文件来手动设置 IP 地址并关闭 DHCP。 以下是在 Ubuntu 22.04 上手动设置 IP 地址并禁用 DHCP 的步骤: 打开终端,使用 root 权限或 sudo 执行以下命令&…

JavaScript图片处理大揭秘!掌握文件流处理方法

说在前面 💻作为一名前端开发,我们平时也少不了对文件流数据进行处理,今天简单整理一下日常开发中比较常见的一些处理文件流的场景及处理方法,希望可以帮助到大家,挤出多一点的摸鱼学习时间。 常见场景 一、input框上…

计算机网络 一到二章 PPT 复习

啥币老师要隔段时间测试,我只能说坐胡狗吧旁边 第一章 这nm真的会考,我是绷不住的 这nm有五种,我一直以为只有三种 广播帧在后面的学习中经常遇到 虽然老师在上课的过程中并没有太过强调TCP/IP的连接和断开,但我必须强调一下&…