码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • log4j升级到log4j2 spring


    目录

    基础知识

    日志系统对应的jar包和推荐依赖

    pom.xml

    代码可能要修改的地方

    log4j2的配置文件

    个人问题杂记

    去掉父工程的依赖

    log4j2异步日志包缺失时报错

    mybatis-spring 从1.0.1 升级到 1.3.2 mybatis 3.0.6 -> 3.4.6问题

    升级了,log4j2.xml和log4j2.properties却没有生效

    项目中用到的MDC也需要升级


    为什么要升级,因为log4j不支持高并发,有让服务变慢的风险(本文可能不是升级的最优解,欢迎大家指出交流)

    基础知识

    日志框架组成,日志在项目中的组合有很多种方式,例如slf4j+log4j log4j+log4j2 等等,一般来说会使用桥接去转换为某一个框架上,找好对应要升级的包和需要去掉的包

    日志系统对应的jar包和推荐依赖

    详细的日志框架桥接逻辑可见下文博文所描述

    https://www.jianshu.com/p/d7b0e981868d

    这里直接说结论,利用桥接包,将项目日志用log4j2实现进行输出(出于配置方便的角度考虑,原项目有使用log4j和slf4j)

    1.log4j->log4j2 

    去掉 log4j 1.x jar,添加log4j-1.2-api.jar,配合 log4j-api-2.x.x.jar 和 log4j-core-2.x.x.jar 即可,依赖如下

    1. log4j-1.2-api-2.x.x.jar
    2. log4j-api-2.x.x.jar
    3. log4j-core-2.x.x.jar

    2.slf4j->log4j2

    将slf4j日志,采用log4j2实现进行输出,需要如下jar包

    1. slf4j-api-x.x.x.jar
    2. log4j-slf4j-impl-x.x.x.jar
    3. log4j-api-x.x.x.jar
    4. log4j-core-x.x.x.jar

    pom.xml

    已在上线项目使用的版本推荐

    1. <properties>
    2. <slf4j.version>1.7.6</slf4j.version>
    3. <log4j.version>2.17.1</log4j.version>
    4. <disruptor.version>3.3.4</disruptor.version>
    5. </properties>
    6. <dependencies>
    7. <!-- log4j2 start -->
    8. <!-- log4j-1.2-api必须放在最前面,否则出错 这是log4j2 兼容1 的api 升级必备 可以平滑不改代码升级 -->
    9. <dependency>
    10. <groupId>org.apache.logging.log4j</groupId>
    11. <artifactId>log4j-1.2-api</artifactId>
    12. <version>${log4j.version}</version>
    13. </dependency>
    14. <!-- Listener和Filter相关的配置在Servlet 3.0以上(也就是tomcat7.0以上) 被log4j-web.jar“自动”的初始化了-->
    15. <dependency>
    16. <groupId>org.apache.logging.log4j</groupId>
    17. <artifactId>log4j-web</artifactId>
    18. <version>${log4j.version}</version>
    19. </dependency>
    20. <!-- log4j2的核心包-->
    21. <dependency>
    22. <groupId>org.apache.logging.log4j</groupId>
    23. <artifactId>log4j-core</artifactId>
    24. <version>${log4j.version}</version>
    25. </dependency>
    26. <!-- log4j2的api接口包-->
    27. <dependency>
    28. <groupId>org.apache.logging.log4j</groupId>
    29. <artifactId>log4j-api</artifactId>
    30. <version>${log4j.version}</version>
    31. </dependency>
    32. <!-- slf4j对应log4j2日志框架的驱动包-->
    33. <dependency>
    34. <groupId>org.apache.logging.log4j</groupId>
    35. <artifactId>log4j-slf4j-impl</artifactId>
    36. <version>${log4j.version}</version>
    37. </dependency>
    38. <!-- slf4j的接口包 -->
    39. <dependency>
    40. <groupId>org.slf4j</groupId>
    41. <artifactId>slf4j-api</artifactId>
    42. <version>${slf4j.version}</version>
    43. </dependency>
    44. <!-- <dependency>
    45. <groupId>log4j</groupId>
    46. <artifactId>log4j</artifactId>
    47. <version>1.2.17</version>
    48. </dependency> -->
    49. <!-- log4j2的异步日志功能包 -->
    50. <dependency>
    51. <groupId>com.lmax</groupId>
    52. <artifactId>disruptor</artifactId>
    53. <version>${disruptor.version}</version>
    54. </dependency>

    代码可能要修改的地方

    如果原项目有引用的桥接包,一般来说可以不动代码,但如果更换依赖过程中报错了,建议更改为log4j2的实例

    1. //Log4j实例:
    2. import org.apache.log4j.Logger;
    3. private static final Logger LOGGER = Logger.getLogger(X.class);
    4. //Slf4j实例:
    5. import org.slf4j.Logger;
    6. import org.slf4j.LoggerFactory;
    7. private static final Logger logger = LoggerFactory.getLogger(X.class);
    8. //Log4j2实例:
    9. import org.apache.logging.log4j.LogManager;
    10. import org.apache.logging.log4j.Logger;
    11. private static final Logger logger = LogManager.getLogger(X.class);

    log4j2的配置文件

    spring项目,配置文件推荐使用log4j2.xml  因为低版本log4j2中不支持 log4j2.properties文件(log4j2有默认配置,即使没有配置文件依然不会报错)

    配置文件 on the classpath 即可实现(也就是放在resources下),可以不在web.xml再配置监听

    log4j2.xml完美配置_清风雪的技术博客_51CTO博客

    个人问题杂记

    记一下自己项目中因为还要兼容一些其他框,在升级过程中遇到的问题

    去掉父工程的依赖

    结论:在pom.xml中引用父工程的包,再用<scope>来实现打包中不使用

    方案来源 maven巧妙排除父pom的依赖_高粱的博客-CSDN博客_maven排除父类依赖 

    1. <!-- 剔除父工程包,scope 为test不参与打包 -->
    2. <dependency>
    3. <groupId>org.slf4j</groupId>
    4. <artifactId>slf4j-log4j12</artifactId>
    5. <version>1.7.12</version>
    6. <scope>test</scope>
    7. </dependency>
    8. <dependency>
    9. <groupId>log4j</groupId>
    10. <artifactId>log4j</artifactId>
    11. <version>1.2.17</version>
    12. <scope>test</scope>
    13. </dependency>

    什么是scope 

    Maven依赖中的scope详解_kimy的博客-CSDN博客_maven scope

    用<exclusion>去排除它,(不是本人的解决方案)看上去可信度比较高存一下

    https://www.csdn.net/tags/MtTaAg4sMDA3MjU1LWJsb2cO0O0O.html

    如果项目的pom和<parent>有相同的<groupId> <artifactId>的话 会使用子项目的版本

    1. <dependency>
    2. <groupId>org.slf4j</groupId>
    3. <artifactId>slf4j-log4j12</artifactId>
    4. <version>1.7.12</version>
    5. <exclusions>
    6. <exclusion>
    7. <groupId>org.slf4j</groupId>
    8. <artifactId>slf4j-log4j12</artifactId>
    9. </exclusion>
    10. </exclusions>
    11. </dependency>

    log4j2异步日志包缺失时报错

    引入以下依赖

    1. <dependency>
    2. <groupId>com.lmax</groupId>
    3. <artifactId>disruptor</artifactId>
    4. <version>3.4.2</version>
    5. </dependency>

    mybatis-spring 从1.0.1 升级到 1.3.2 mybatis 3.0.6 -> 3.4.6问题

     因为其他依赖包的原因,需升级mybatis,对应的的mybaits-spring版本也要升级

    升级mybaits-spring到1.3.2过后遇到的问题

    Cannot load JDBC driver class '${jdbc.mysql.driverClassName}',继承mybatis,读取属性配置文件失败。_恶善的博客-CSDN博客

    java方法名中画了一条横线 - 简书

    升级了,log4j2.xml和log4j2.properties却没有生效

    本人是由于activemq-all这个包导致的,详细推导逻辑见下博文

    在Tomcat的VM参数里添加-Dlog4j.debug参数来显示log4j的有关信息

    解决log4j2配置文件失效的问题_汇编语言不会编的博客-CSDN博客_log4j2配置文件不生效

    要排除一些框架内置日志包导致的冲突,例如:

    以zookeeper和kafka为例,删除lib目录下的这三个jar包:slf4j-log4j12、slf4j-api和log4

    项目中用到的MDC也需要升级

    log4j MDC NDC详解_星技传阅的技术博客_51CTO博客

    借鉴博文

    log4j升级到log4j2 - Windy心梦无痕 - 博客园

    spring引入log4j2日志框架_逍遥壮士的博客-CSDN博客_spring使用log4j2

    日志组件slf4j介绍及配置详解_cc-cf的博客-CSDN博客_slf4j配置

    apche的log4j.properties和log4j2.xml的配置和使用_HopeOneToYou的博客-CSDN博客_log4j.properties下载

  • 相关阅读:
    C语言的文件读取------C语言
    布隆过滤器及其用法
    (55、56)性能分析命令
    Elasticsearch中object类型与nested类型之间的区别
    Java Web 学习笔记(三) —— Maven 基础
    刚来公司就接了一个不发版直接改代码的需求
    quarkus依赖注入之十二:禁用类级别拦截器
    Spark GC日志分析
    【TypeScript】深入学习TypeScript函数
    Jenkins使用笔记
  • 原文地址:https://blog.csdn.net/qq_42320804/article/details/123781464
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号