Log4j疯狂写日志问题排查

log4j,疯狂,日志,问题,排查 · 浏览次数 : 163

小编点评

**问题发现过程:** 1. Java 系统出现磁盘使用率告警,磁盘使用率超过 90% 以上。 2. 问题带来的影响是服务器磁盘被打满,导致系统正常业务日志无法打印,严重影响了系统的可靠性。 3. 怀疑日志级别问题,业务日志输出过多导致磁盘打满。 4. 通过堡垒机登陆问题服务器,发现根目录有个很大日志文件,但检查应用日志配置后,日志输出配置路径并没有配置这个日志路径。 5. 仔细检查第三方 jar 包,发现其中有一个 log4j.xml 配置文件配置的 root 日志级别为 debug,日志输出目录是系统根目录,文件名也都可以对应的上。 **解决方案:** 1. 通过 Maven 排除第三方 jar 包,发现是被其他 jar 包传递依赖进来的。 2. 对外提供第三方 jar 包的时候,不要把自己的调试代码和日志配置测试文件也打入 jar 包内。 **总结:** 问题是第三方 jar 包中的 log4j 配置文件导致了系统日志输出到系统根目录的错误配置。通过排除依赖问题并对外提供第三方 jar 包时,可以避免出现此类问题。

正文

一、问题是怎么发现的

最近有个 Java 系统上线后不久就收到了磁盘使用率告警,磁盘使用率已经超过了 90% 以上,并且磁盘使用率还在不停增长。

二、问题带来的影响

由于服务器磁盘被打满,导致了系统正常的业务日志无法继续打印,严重影响了系统的可靠性。

三、排查问题的详细过程

刚开始收到磁盘告警的时候,怀疑是日志级别问题,业务日志输出过多导致磁盘打满。但是查看我们自己的业务日志文件目录,每个日志文件内容都不是很大。

于是通过堡垒机登陆问题服务器,查看磁盘使用率很高的目录列表,发现根目录有个很大的日志文件,日志文件名称为 log4j.log。但是检查应用日志配置后,日志输出配置路径并没有配置这个日志路径。而且我们用的是 logback 日志组件和配置文件,并没有使用 log4j 来输出日志。于是便打开这个未知来源的日志文件内容,记录的日志内容确实是我们自己的 java 系统写入的日志内容,且大部分都是 debug 级别日志内容。于是猜测在系统依赖的 jar 包内也有一个 log4j 的日志配置文件。于是便把部署包下载下来,然后通过文档遍历扫描所有 jar 包内的日志配置文件,结果在一个第三方 jar 包内找到一个 log4j.xml 配置文件,里边配置的 root 日志级别为 debug,日志输出目录是系统根目录,日志文件名也都可以对应的上。

四、如何解决问题

通过上述排查过程找到了第三方 jar 包内的 log4j 配置文件,于是便排查该 jar 包的来源,发现是被其他 jar 包传递依赖进来的,并不是我们真实需要的 jar 包,所以通过 maven 排除该问题 jar 包即可。

五、总结反思

1. 以后在引入第三方 jar 包的时候一定要检查他的依赖范围,看是否会与现有系统的 jar 包有冲突或者带来其他的影响。

2. 对外提供第三方 jar 包的时候,不要把自己的调试代码和日志配置测试文件也打入 jar 包内。

作者:京东零售 曹志飞

来源:京东云开发者社区

与Log4j疯狂写日志问题排查相似的内容:

Log4j疯狂写日志问题排查

刚开始收到磁盘告警的时候,怀疑是日志级别问题,业务日志输出过多导致磁盘打满。但是查看我们自己的业务日志文件目录,每个日志文件内容都不是很大。

容易忽视的细节:Log4j 配置导致的零点接口严重超时

本文详细的记录了一次0点接口严重超时的问题排查经历。本文以作者自身视角极具代入感的描绘了从问题定位到具体的问题排查过程,并通过根因分析并最终解决问题。整个过程需要清晰的问题排查思路和丰富的问题处理经验,也离不开公司强大的调用链、和全方位的系统监控等基础设施。

Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞

JNDI注入 什么是JNDI JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。 JNDI支持的服务主要有:DNS

一文带你搞懂 Google 发布的新开源项目 GUAC

随着软件供应链攻击的显著增加,以及 Log4j 漏洞带来的灾难性后果和影响,软件供应链面临的风险已经成为网络安全生态系统共同关注的最重要话题之一。根据业内权威机构 Sonatype 发布的2022软件供应链现状报告,在过去三年中,针对上游开源代码存储库的恶意活动,旨在将恶意软件植入软件组件的攻击数量

Maven依赖管理

本文主要记录Maven依赖管理中关于依赖传递和依赖范围的知识 Maven项目示例 创建3个maven项目,分配依赖log4j 1.2.12, 1.2.13, 1.2.14版本。 com.leo project1

SpringBoot项目从0到1配置logback日志打印

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 一、写文背景 我们在写后端项目的时候,日志打印是必需的。支持SpringBoot项目的日志框架一般有log4j、logback,这二者各

Linux服务器使用Redis作为数据缓存,并用log4j2进行日志记录

前言 个人网站使用Vue作为前端,SpringBoot作为后端,MySQL作为数据库,但前端每次请求都会从MySQL数据库中读取数据,而MySQL数据库的数据是存储于服务器磁盘中,所以响应速度有一定影响。之前了解过一点Redis数据库,该数据库数据存储于内存中(也可以持久化于磁盘中),数据读取速度就

Solr Shiro Log4j2 命令执行--文件读取--反序列化--身份权限绕过--命令执行

Solr Shiro Log4j2 命令执行--文件读取--反序列化--身份权限绕过--命令执行 solr 远程命令执行 (CVE-2019-17558) 漏洞简介 Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Ap

[转帖]springboot中使用skywalking实现日志追踪

文章目录 SkyWalking分布式追踪系统介绍主要架构 环境引入依赖配置Log4j2下载编译好的8.7.0版本包使用探针实现日志追踪启动脚本启动Java服务访问服务 使用UI切换存储方式 SkyWalking分布式追踪系统 介绍 Skywalking是一个国产的开源框架,2015年有吴晟个人开源,