最新要闻
- 我市举行天然气应急救援演练|世界快看点
- 7月见!华为大动作不断:将发布新款存储 面向AI大模型 世界观焦点
- 凯迪拉克格局打开!赞助节目中允许宣传理想L9 还邀请李想体验新车-天天即时
- 辣眼睛!男子鞋底塞112张《塞尔达传说:王国之泪》卡带入境被查|天天新消息
- 每日热点:董丽娜,毕业快乐!
- cad什么版本最好用_cad那个版本比较好用
- 对标苹果Studio Display!三星首款5K显示器开售:9999元还送1T SSD
- 网飞版《三体》预告播放破千万 粉丝喊话别拍砸了:国内拍技术落后?_环球新资讯
- ChatGPT假装奶奶哄睡:能免费生成Win系统激活码
- 热讯:“泡面神器”彻底凉凉!亚马逊Kindle中国电子书店明日停运
- SSD等存储要拉开涨价序幕了:有厂商财报明确!
- “泰坦”号潜水器残骸中发现“疑似人类遗骸”-天天报道
- 印度狂买俄罗斯石油:买的多到转手倒卖给欧美
- 全球热推荐:中超卧龙凤雏诞生!任航被高畠勉培养成武士了!谢晖一语杀人诛心
- 黄仁勋:NVIDIA的AI产品 已经给客户打1折了_今日看点
- RTX 4070换装暴力涡轮风扇 卖到6999元!瞬间降温21℃
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
一次日志配置未生效问题排查记录
某天排查业务问题时,在我司的日志收集平台上,未能发现相关业务服务接口访问日志。经过和相关同事确定,发现业务服务未能将接口访问日志吐到日志收集平台,由此开启一段有点漫长的排查之旅。
业务服务是典型的SpringBoot web应用,日志记录采用slf4j+log4j2组合。
通过application.propertis文件中logging.config配置项指定了日志配置文件log4j2.xml具体位置。
【资料图】
通过实现org.apache.logging.log4j.core.Appender接口实现自定义的HttpAppender,将接口访问记录发送到日志收集平台。在log4j2.xml配置文件里如下图
具体管理与日志收集平台服务连接,发送请求的是类HttpManager,HttpManager的属性url决定了接收日志信息的日志收集平台地址(来源是配置文件中HttpAppender的url属性)。
所有HttpAppender对象共享同一个HttpManager,按照单例模式创建,合理的做法应是每个HttpAppender有自己单独的HttpManager。
这会导致在有配置多个HttpAppender的情况下,只有在实例化第一个HttpAppender时,其配置的日志平台收集服务的地址会生效。其他的通通无效.
合理的办法是改动HttpAppender源代码,但是我没权限。只能从日志配置文件加载方面想办法,想办法让我们指定的日志配置文件生效。
基本情况介绍完毕,下面开始排查之旅。
在和同事确定之后没有讲日志信息发送到日志收集平台,凭直觉猜测日志收集平台地址是否正确。检查日志配置文件,发现地址配置正确。难道就这样结束了?不,你已经是一个成熟的程序员了,要学会自己排查问题了。
遇到这种情况时,我看了一下其他服务,相同的配置,却稳定正常的向日志收集平台在发送日志。那我就有理由猜测线上服务实际生效的日志收集平台地址不是我们想要的,但是如何验证了。
我们如何方便的可以查看线上服务某个类对象的字段值了,那就要亮出大杀器了,阿里巴巴开源的Arthas。使用arthas的vmtool命令查看jvm进程中的实例对象数据
看到的结果让人始料未及,线上服务使用的是日志收集平台的测试地址。现在问题变成了,是什么原因导致了线上加载了错误的配置。
在idea中全局搜索发现,在resources目录下的log4j2.xml中,含有相同的HtppAppender,url属性配置成了日志收集平台的测试地址,maven打包之后,业务jar中也会含有log4j2.xml文件。
那接下来要验证的是jar包里的log4j2.xml是否被加载,如果被加载,这样算下来就会有两份位置不同log42.xml文件被加载。
接下来就是如何进行验证了。
思路是如果加载了两份不同的位置的log4j2.xml,那么创建HttpAppender的方法就会被调用两次,如果能追踪到创建HttpAppender方法的被调用路径,那么排查起来就会轻松些了.
这次还是借助Arthas,通过其stack命令,可以查看指定方法被调用的调用路径。
因为SpringBoot应用一起动,便会在SpringApplication的prepareEnvironment方法里触发日志配置文件加载,等我通过Arthas attach到指定的jvm进程,执行stack命令的时候,日志配置加载已经结束了,为时已晚。
解决办法是通过在启动类的main方法里加上一行代码TimeUnit.SECONDS.sleep(30) 延迟应用的启动,以便有足够的时候通过Arthas attach到jvm进程,执行stack命令。结果如下两张图
通过上面这两张图得知,在LoggingApplicationListener正常加载日志配置文件之前,BootStrapApplicationListener触发LoggingApplicationListener做了一次日志配置文件加载。
接下来需要分析的是由BootStrapApplicationListener触发加载的是哪个日志配置文件。
通过分析BootStrapApplicationListener的bootstrapServiceContext方法,其新建的SpringApplication实例对象,读取的默认配置文件为bootstrap.yml。因为项目并没有配置bootstrap.yml,导致ConfigFileApplicationListener对Environment进行初始化时,没有设置logging.config。
没有设置logging.config 那ConfigFileApplicationListener是从哪里加载日志配置文件了。通过分析代码,默认的日志配置加载文件位置由org.springframework.boot.logging.AbstractLoggingSystem#getSelfInitializationConfig方法负责,如下图
通过上图可得知主要检测classpath里是否存在log4j2.xml,logj4j2.json这样的配置文件。不巧的是服务的jar里存在log4j2.xml,且配置的url是日志收集平台的测试地址。那要如何解决了这个问题了。
通过分析BootStrapApplicationListener源代码,通过在启动脚本里启动命令中添加-Dspring.cloud.bootstrap.enabled=false来禁止BootstrapApplicationListener运行.
修改完毕,再次执行vmtool命令检查日志收集平台url配置是否正确。结果显示的还是日志收集平台测试地址。那说明还有其他地方触发加载了jar包内的log4j2.xml文件。
此时瞥了一眼我们的启动类,那么大一个Logger在那杵着,之前愣是没注意。
启动类xxxApplication被加载的时候,此时会触发LOGGER的创建,虽然使用的是SLF4J,实际上创建的是log4j2的Logger,由此会触发针对日志配置文件的加载,经过google搜索,和针对log4j的源码分析,如果没有指定配置文件,默认是会加载classpath下的log4j2.xml文件。
此时想到的简单办法是把LOGGER属性注释掉,那么就会避免发生记在jar包内的log4j2.xml文件,从而只加载服务目录下的log4j2.xml。
修改完毕,进行第二次验证。不巧的是,显示的还是日志收集平台测试地址,那说明还是有其他地方触发加载了jar包内的log4j2.xml文件。
此时我们的办法还是和第一次内似,这次我们用的是watch命令,关注的是org.slf4j.LoggerFactory getLogger方法的被调用的时候入参。
通过上图,发现工程依赖的公司封装的Apollo配置服务的jar包内的ApolloApplicationContextInitializer触发了Logger的创建,进而触发加载了jar包内的log4j2.xml。
那这个ApolloApplicationContextInitializer是因为什么原因被触发了class加载,导致了Logger的创建。通过查看源码,ApolloApplicationContextInitializer实现了ApplicationListener接口。SpringApplication在构造函数中会收集当前classpath的spring.factories文件中org.springframework.context.ApplicationListener配置项中的Listener,并实例化。因此导致了ApolloApplicationContextInitializer类的初始化。
到此我们可以做一下总结,业务程序的启动过程中,按先后顺序总共做了三次日志配置文件log4j2.xml的加载。
第一次:由程序启动类XXXApplication的静态属性LOGGER触发,加载的是业务jar包内log4j2.xml。
第二次: 由org.springframework.cloud.bootstrap.BootstrapApplicationListener触发,加载的是业务jar包内log4j2.xml
第三次: 由LoggingApplicationListener负载加载application.properties指定的服务目录下的logj42.xml。
至此,问题的分析与排查可暂时告一段落,接下来的就是如何修复问题,然后进行验证。办法就两条,
1.减少日志配置文件的加载的次数,
2.让log4j2框架第一次加载日志配置文件时,便加载到正确的日志配置文件。
办法1. 通过在服务启动脚本中加入-Dspring.cloud.bootstrap.enable=false,可以避免上面提到的第二次日志文件加载。
办法2. 通过分析lo4j2源代码,在org.apache.logging.log4j.core.config.ConfigurationFactory类中可以发现通过设置名为log4j.configurationFile的sytem property指定要加载的日志配置文件。
方法都已找到,解决方法如下图所示,综合了前面提到的两条办法。
经过验证,问题得到解决,接口访问日志顺利吐到日志收集平台。一个问题的解决之旅也就此结束。
其实事后总结,还是基础不够扎实,对日志框架的了解掌握不够深入,排查分析问题不够仔细,对启动类存在的Logger熟视无睹,由此忽略了带来的日志配置加载问题。
关键词:
一次日志配置未生效问题排查记录
linux把文件压缩成.tar.gz的命令&各个压缩解压命令大全--九五小庞
MFC中使用多线程
希望所有计算机专业学生都知道这门课-世界速看
我市举行天然气应急救援演练|世界快看点
7月见!华为大动作不断:将发布新款存储 面向AI大模型 世界观焦点
凯迪拉克格局打开!赞助节目中允许宣传理想L9 还邀请李想体验新车-天天即时
辣眼睛!男子鞋底塞112张《塞尔达传说:王国之泪》卡带入境被查|天天新消息
每日热点:董丽娜,毕业快乐!
环球快播:Linux-vs-MacOS-,你更喜欢哪个系统?
世界热点评!【读财报】一季度信用卡消费者投诉透视:监管处理信用卡业务投诉超3.2万件 工商银行被投诉总量高
cad什么版本最好用_cad那个版本比较好用
对标苹果Studio Display!三星首款5K显示器开售:9999元还送1T SSD
网飞版《三体》预告播放破千万 粉丝喊话别拍砸了:国内拍技术落后?_环球新资讯
ChatGPT假装奶奶哄睡:能免费生成Win系统激活码
热讯:“泡面神器”彻底凉凉!亚马逊Kindle中国电子书店明日停运
SSD等存储要拉开涨价序幕了:有厂商财报明确!
读发布!设计与部署稳定的分布式系统(第2版)笔记15_快速失败和替换 焦点日报
“泰坦”号潜水器残骸中发现“疑似人类遗骸”-天天报道
印度狂买俄罗斯石油:买的多到转手倒卖给欧美
全球热推荐:中超卧龙凤雏诞生!任航被高畠勉培养成武士了!谢晖一语杀人诛心
pta题目集6-8_当前动态
为什么不应该给用户提示错误码-每日观察
21、MyBatis动态<if>标签的使用详解 当前快报
Blazor如何跟随“系统主题”? 环球快资讯
再次认识using 天天报资讯
黄仁勋:NVIDIA的AI产品 已经给客户打1折了_今日看点
RTX 4070换装暴力涡轮风扇 卖到6999元!瞬间降温21℃
秘鲁山谷惊现1500米长的神秘孔带:至今不知道是做什么的-全球观天下
4年亏损近30亿:美特斯邦威以3亿元出售房产自救
短讯!48GB DDR5-8200!芝奇超高频、大容量内存新增白色
热点聚焦:快餐帝国(01843.HK)年度纯利184.3万坡元 同比减少34.83%
影响43万亿美元交易!追踪美联储决策的一大利器即将消亡
阿邦拉霍:红军不能将萨拉赫卖给沙特球队,没有他球队进不了前六|全球聚看点
北方地区将继续受到40℃高温炙烤 温度远远赶超“四大火炉”
影片《消失的她》票房突破11亿元 累计2635万人观影
影帝梁朝伟迎来61岁生日 妻子刘嘉玲晒照为其庆生
《原神》枫丹地区大量内容遭泄露 米哈游将依法追究相关主体法律责任
湖南株洲一小学生暑假作业贴满免作业券 引发网友围观
环球快看:在Linux下如何使用JNI
焦点热门:python: BytesIO 中 read 用法
数码宝贝重启_数码宝贝dw6 0
全球通讯!苹果极力宣传的Apple Watch车祸检测功能频繁闹乌龙!让人头大
国外一飞机尴尬着陆:画面犹如“狗啃泥”
下月开始:Win11要强制更新了
古筝来历小故事_古筝来历
部署zabbix5.0以及使用 全球微头条
天天微速讯:Python教程(1)——python环境的下载与安装
每日焦点!郑少秋女儿辛酸成长史:8个月父亲出轨8岁患上三高,半生缺爱
【天天报资讯】有人坐吗?高级动卧票价一站8分钟420元 跟二等座差价70倍:12306回应
焦点消息!4520元贵妇级护肤品复刻版卖47元:相似度能达到99.99%
nethttp和gin 路由
文心一言 VS 讯飞星火 VS chatgpt (50)-- 算法导论6.2 2题-简讯
Golang 简单的数据对齐可提高程序速度和内存使用率_环球新消息
【前沿】尺寸接近米13!大厂新机渲染图出炉 白色打几分?|全球关注
最便宜4系来了!宝马发布i4 eDriver35四门纯电轿跑:大降4万
今日视点:胃癌几乎都是吃出来的:钟爱烧烤、熏制食物的朋友要注意
女孩用“免作业券”不写暑假作业 网友点赞:凭实力不写-要闻速递
每日聚焦:三星Galaxy S23 FE外观曝光:后置长焦三摄、边角圆润
差评第一!景区摆渡车不能兜来绕去只为钱
【Java】使用 fasterxml.jackson 进行反序列化以及部分注意事项
微动态丨可观测性是什么? 入门指南
WPF MVVM之点滴分享
Donaukit用户创建
【财经分析】东北地区国资国企改革深化推进 或迎来哪些针对性政策?
我莫得感情也莫得耳朵_我莫得感情哪里的梗
续航38小时/能水洗!万魔S50运动蓝牙耳机图赏
爸爸给女儿买RTX 4060 Ti显卡当生日礼物 小女孩表情亮了
来试试手气?《逆水寒》手游6月30日上线:官方宣布抽奖送鹤岗一套房-环球速读
每日消息!比电脑还大:24GB+1TB!今年最能打的直屏旗舰杀疯了
迅雷云盘TV版最高可领180天超级会员特权 支持4K电视超清播放-天天信息
天天微资讯!广州杨大爷退休后,喝酒不喝茅五剑,青睐三款廉价酒
强化学习从基础到进阶-常见问题和面试必知必答[8]:近端策略优化(proximal policy optimization,PPO)算法
债市日报:6月28日|全球新视野
债市日报:6月28日
农村三胞胎姐妹均高分超一本线:成绩一直很优秀
极氪001欧洲价格公布:起售价47万元 比国内贵17万
高管曾言等本土车企“烧死了”再来抢市场!起亚EV6开启盲订 每日速递
今天起 韩国人集体“年轻一两岁”:与一项法案有关
XREAL Beam投屏盒子首次亮相MWC!AR空间屏体验太酷了
一般小县城稀缺行业有哪些 今日热搜
跑得更快!华为云GaussDB以出色的性能守护“ERP的心脏”
记录--不定高度展开收起动画 css/js 实现
今日播报!Cognos教程_编程入门自学教程_菜鸟教程-免费教程分享
LRU 缓存淘汰算法
Mac反编译安卓APK
世界看点:原来是他们!退市股获举牌4个交易日翻倍,步步高系大佬要进董事会
【金融街发布】财政部:5月地方债发行规模为7554亿元 新增债券占比近四成_即时看
天天即时看!注意!天孚通信:股东朱国栋计划减持公司股份不超过约395万股
游戏主播被大额打赏后剃光头!结果被坑惨:打赏退款了
尽享丝滑!MWC现场体验领克08魅族Flyme Auto车机:流畅度爆表 环球新要闻
焦点资讯:萧敬腾求婚好多地方下雨 “雨神”真有这么神?
15万的特斯拉廉价新车Model 2跳票了:延期到2025年
今日快讯:能否追上高铁?凯迪拉克CT5-V推出全新改装套件 动力可达1000匹
js的Map数据类型
Sudo堆溢出漏洞(CVE-2021-3156)复现
Spring 赌上未来一击,推出响应式框架 WebFlux,代码更优雅,性能更强! 最新
解锁高质量文档转换:通过Java应用程序免费将PDF转换为XPS
每日看点!未来可期!农村三胞胎姐妹高分同超一本线
北交所日报:指数调整回补缺口 曙光鼎智双双大涨