0

0

Log4j 1 到 Log4j 2 迁移后仍加载旧配置:深入排查与解决方案

DDD

DDD

发布时间:2025-10-19 12:32:01

|

875人浏览过

|

来源于php中文网

原创

Log4j 1 到 Log4j 2 迁移后仍加载旧配置:深入排查与解决方案

本文针对log4j 1迁移至log4j 2后,应用仍尝试加载log4j 1配置的常见问题提供解决方案。即使表面上已移除所有log4j 1依赖和配置,某些隐蔽的旧配置(如`web.xml`中的spring log4j集成配置)仍可能导致错误。教程将指导读者识别并清除这些残留配置,确保log4j 2正常运行。

Log4j 1 到 Log4j 2 迁移中的常见陷阱

将JavaEE项目从Log4j 1.x版本迁移到Log4j 2.x是一个常见的升级任务,旨在利用Log4j 2带来的性能提升、模块化设计和更强大的功能。然而,尽管表面上对Maven pom.xml、代码和日志配置文件进行了更新,许多开发者仍会遇到应用程序在启动时尝试加载Log4j 1配置的问题。这通常表现为控制台输出Log4j 1特有的警告和错误信息,指示它正在寻找log4j.xml或解析Log4j 1的配置标签。

识别Log4j 1残留配置的症状

当Log4j 1的旧配置机制仍在运行时,通常会伴随以下类型的日志输出:

log4j:WARN Continuable parsing error 2 and column 31
log4j:WARN L'élément racine de document "Configuration" doit correspondre à  la racine DOCTYPE "null".
log4j:WARN Continuable parsing error 2 and column 31
log4j:WARN Le document nest pas valide : aucune grammaire détectée.
log4j:ERROR DOM element is - not a  element.

这些警告和错误信息明确指出,Log4j 1的XML解析器正在尝试处理一个不符合其DTD(如log4j:configuration)的配置,或者找不到预期的log4j.xml文件。这表明即使您已将log4j.xml替换为log4j2.xml,并移除了Log4j 1的依赖,某些组件仍在激活Log4j 1的初始化逻辑。

初步排查步骤

在深入挖掘潜在的隐藏配置之前,应确保已完成以下基础迁移工作:

  1. 更新Maven依赖:
    • 移除所有Log4j 1.x相关的依赖(如log4j:log4j)。
    • 添加Log4j 2.x核心依赖(org.apache.logging.log4j:log4j-api和org.apache.logging.log4j:log4j-core)。
    • 如果使用了SLF4J,确保引入Log4j 2的SLF4J桥接器(org.apache.logging.log4j:log4j-slf4j2-impl,取决于SLF4J版本)。
    • 检查是否存在传递性依赖引入Log4j 1。可以使用mvn dependency:tree命令查看依赖树,并为引入Log4j 1的依赖添加exclusion。例如:
      
          some.group
          some-artifact
          1.0.0
          
              
                  log4j
                  log4j
              
          
      
  2. 更新日志配置文件:
    • 将log4j.xml(或.properties)文件替换为log4j2.xml(或.properties、.json、.yml)。
    • 确保log4j.dtd文件已被移除,因为Log4j 2不再使用它。
  3. 代码层面更新:
    • 更新所有Log4j 1 API调用(如org.apache.log4j.Logger)为Log4j 2 API(如org.apache.logging.log4j.Logger)或SLF4J API。

发现隐藏的Log4j 1配置:web.xml

在JavaEE或Spring Web项目中,一个常见的被忽视的Log4j 1残留配置位于web.xml文件中。这些配置通常用于在Web应用程序启动时初始化Log4j 1,尤其是在与Spring框架集成时。

问题通常出在以下web.xml片段:


    log4jConfigLocation
    classpath:log4j.xml



    log4jExposeWebAppRoot
    false



    org.springframework.web.util.Log4jConfigListener

解析这些配置:

  • log4jConfigLocation:这是一个context-param,由Spring的Log4jConfigListener读取,用于指定Log4j 1配置文件的位置。当其值为classpath:log4j.xml时,它明确指示应用程序去查找并加载Log4j 1的配置文件。
  • log4jExposeWebAppRoot:另一个context-param,通常与Log4jConfigListener配合使用,用于控制是否将Web应用程序根路径暴露为系统属性,以便Log4j 1配置文件可以使用它。
  • org.springframework.web.util.Log4jConfigListener:这是Spring框架提供的一个监听器,专门用于在Web应用程序启动时初始化Log4j 1。它的存在是导致Log4j 1初始化逻辑被激活的根本原因。

解决方案:

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载

对于已迁移到Log4j 2的项目,这些web.xml中的配置是完全多余且有害的。Log4j 2有其自身的初始化机制,通常通过Log4jServletContainerInitializer(在Servlet 3.0+环境中自动发现)或直接通过类路径扫描log4j2.xml来完成。因此,直接移除web.xml中上述所有Log4j 1相关的context-param和listener配置即可解决问题。

移除后的web.xml片段将不再包含这些内容。

确保Log4j 2正确初始化

在移除Log4j 1的旧配置后,您需要确保Log4j 2能够正确初始化。

  • Servlet 3.0+环境: 如果您的Web容器支持Servlet 3.0及以上版本,并且您已正确引入log4j-web依赖,Log4j 2通常会自动通过Log4jServletContainerInitializer来初始化,无需额外的web.xml配置。
    
        org.apache.logging.log4j
        log4j-web
        2.19.0 
    
  • 非Web环境或旧版Servlet: Log4j 2默认会在类路径中查找名为log4j2.xml、log4j2.json、log4j2.yaml或log4j2.properties的配置文件。确保您的log4j2.xml文件位于src/main/resources目录下,以便它能被正确加载。

总结与注意事项

Log4j 1到Log4j 2的迁移不仅仅是替换依赖和配置文件那么简单,还需要对应用程序中所有可能引用旧日志框架的地方进行彻底检查。特别是对于复杂的JavaEE项目,web.xml中隐藏的Spring Log4j 1集成配置是导致迁移失败的一个常见原因。

关键注意事项:

  • 彻底性: 确保不仅移除Log4j 1的直接依赖,还要检查传递性依赖,并排除它们。
  • 配置文件: 确保所有旧的Log4j 1配置文件(如log4j.xml、log4j.properties)及其相关的DTD都被移除或替换。
  • Web配置: 务必检查web.xml,移除任何与Log4jConfigListener或log4jConfigLocation相关的配置。
  • 测试: 迁移后进行彻底的测试,确保日志功能正常,且没有出现Log4j 1相关的错误或警告。

通过细致的排查和清理,您可以成功地将项目迁移到Log4j 2,享受其带来的各项优势。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

115

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

30

2026.01.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

419

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

375

2023.08.08

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

16

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号