log4j升级log4j2遇到的问题及解决方式

目录
  • log4j升级log4j2的问题
    • 一、导入包
    • 二、在src/main/resources下新建一个log4j2.xml文件
  • 升级log4j2遇到的那些坑

log4j升级log4j2的问题

一、导入包

 <!-- log -->
<dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
</dependency>
<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>jcl-over-slf4j</artifactId>
     <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.2</version>
</dependency>
        <!-- 日志桥接包, 适配log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.8.2</version>
</dependency>

注意:可能有些包需要依赖log4j,但是升级后只有log4j2了,此时会报找不到类的错,如:

Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger

那么如果这些包没有使用slf4接口,而是写死了必须依赖log4j的话,如果实在不想导入log4j的包,那么只能找能代替这个包的工具包使用了

如:

<!-- 使用该报去掉log4j,后会报上述错误,所以就把这个包换了 -->
<dependency>
 <groupId>com.github.sgroschupf</groupId>
 <artifactId>zkclient</artifactId>
 <version>0.1</version>
 <exclusions>
  <exclusion>
   <artifactId>log4j</artifactId>
   <groupId>log4j</groupId>
  </exclusion>
 </exclusions>
</dependency>

替换为如下的包,就可以了:

<dependency>
 <groupId>com.101tec</groupId>
 <artifactId>zkclient</artifactId>
 <version>0.10</version>
 <exclusions>
  <exclusion>
   <artifactId>log4j</artifactId>
   <groupId>log4j</groupId>
  </exclusion>
  <exclusion>
   <artifactId>slf4j-log4j12</artifactId>
   <groupId>org.slf4j</groupId>
  </exclusion>
 </exclusions>
 </dependency>

二、在src/main/resources下新建一个log4j2.xml文件

配置如下

<?xml version="1.0" encoding="UTF-8" ?>
<configuration status="ERROR">
 <Properties>
        <Property name="PATTERN" value="[%d{HH:mm:ss.SSS} %-5level] [%t] %c{3} - %msg%n" />
     <property name="FILE_PATH" value="/mySoft/logs" />
     <property name="FILE_SIZE" value="50 MB" />
    </Properties>
 <Appenders>
<!-- 控制台日志打印 -->
  <Console name="Console" target="SYSTEM_OUT">
   <PatternLayout pattern="${PATTERN}"/>
  </Console>
  <!-- 生产环境日志打印 -->
<!-- fileName表示创建的日志文件名,filePattern表示如果日志策略按照日期与大小做限定的话,如果大小超过50m就会按该格式将之前的的日志文件重命名,并重新创建新的fileName。同理,如果日期超过限定的时间,也会进行同样的操作,下文定义一天建一个,如果想一分钟建一个则filePattern="${FILE_PATH}/demo-%d{yyyy-MM-dd HH-mm}-%i.log" 如此定义-->
  <RollingFile name="ProdFile"
   fileName="${FILE_PATH}/demo.log"
   filePattern="${FILE_PATH}/demo-%d{yyyy-MM-dd}-%i.log">
   <PatternLayout pattern="${PATTERN}" />
   <Policies>
          <TimeBasedTriggeringPolicy />
          <SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
      </Policies>
   <Filters>
             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
         </Filters>
  </RollingFile>
 </Appenders>
 <!-- root部分定义了log4j2的默认输出级别和方式 -->
 <loggers>
  <root level="error">
   <appender-ref ref="Console" />
   <appender-ref ref="ProdFile" />
  </root>
 </loggers>
</configuration>

升级log4j2遇到的那些坑

<slf4j.version>1.7.13</slf4j.version>
<log4j2.version>2.3</log4j2.version>
<disruptor.version>3.3.2</disruptor.version>
<spring.version>3.2.4.RELEASE</spring.version>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>${disruptor.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<!--这块比较关键,Spring原生应用中需要用到commons-logging,需要把它exclude掉,另外引入jcl-over-slf4j-->
<!--你会发现jcl-over-slf4j 只是改写了commons-logging 去兼容Spring-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>
<!-- 如果代码中依赖的jar包用到了log4j1.2.X,当工程中将log4j1.2.X排除掉了之后,项目启动时会报错不成功的 -->
<!-- 把下面这个jar引入进来就OK了 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
</dependency>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 老生常谈Log4j和Log4j2的区别(推荐)

    相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程.我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代. log4j是Apache的一个开源项目,我们不去考究它的起源时间,但是据我了解,log4j 1已经不再更新了. 回顾log4j,曾给我们留下了多少的回忆,我记得早些年,那时候mybatis还是叫ibatis的时候,我为了配置ibatis控制台打印日志,纠结了多少个夜晚,最后配置出来时的那种喜悦感.废话不多说,下面我就以列举的

  • 解决springboot 2.x集成log4j2调试日志无法关闭的问题

    springboot2.x集成log4j2时,始终无法关闭log4j2自身的日志输出 已经做了如下配置: 在log4j2.xml的配置文件中,配置configuration的status属性为OFF: 确认系统所有地方无配置log4j2.debug: 如上配置都无法解决问题,只能从源码着手一探究竟. 从log4j2-api包中,找到StatusLogger,其设置日志输出level的代码如下: private StatusLogger(final String name,final Messag

  • springboot log4j2不能打印框架错误日志的解决方案

    springboot log4j2为什么不能打印框架错误日志 问题 使用springboot时老的框架使用的是log4j2,为了兼容不能够使用logback,按照网上的教程导入了log4j2但是不能够输入框架错误日志,例如bean命名重复,springmvc url映射重复,这些都是开发中所需要的友好提示 解决方案 怎么出现的问题,就不详细描述了,原因是我引入的log42是散件不是基于springboot集成配置的,导致只能够输出基本信息,原理我会在 一个月后左右探究完毕补充. 下面我说说怎么正

  • log4j升级log4j2遇到的问题及解决方式

    目录 log4j升级log4j2的问题 一.导入包 二.在src/main/resources下新建一个log4j2.xml文件 升级log4j2遇到的那些坑 log4j升级log4j2的问题 一.导入包 <!-- log --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.ver

  • flyway实现java 自动升级SQL脚本的问题及解决方法

    为什么要用Flyway 在日常开发中,我们经常会遇到下面的问题: 自己写的SQL忘了在所有环境执行: 别人写的SQL我们不能确定是否都在所有环境执行过了: 有人修改了已经执行过的SQL,期望再次执行: 需要新增环境做数据迁移: 每次发版需要手动控制先发DB版本,再发布应用版本; 其它场景... 由于项目需求的变化,或者前期设计缺陷,导致在后期需要修改数据库,这应该是一个比较常见的事情,如果项目还没上线,你可能把表删除了重新创建,但是如果项目已经上线了,就不能这样简单粗暴了,每次运维部署项目,还得

  • 浅谈Pycharm的项目文件名是红色的原因及解决方式

    今天在继续学习Python时,打开Pycharm后,发现有一个项目下的项目文件名是红色的,如下图: 刚开始我以为是我升级 Pycharm导致的,但我并没有急着去解决,因为并不会影响我执行代码等.当我修改了一点代码后,我将它add并commit到Git后,才发现问题的原因:是我以前将Word设置成了Git的一个仓库,但是当时这些文件我并没有添加到Git里,所以会显示为红色.(这倒是挺好,可以提示我记得提交) 解决方法一: 如上我说的那样,add(add后会显示成绿色)并commit到Git(或者其

  • idea +junit单元测试获取不到bean注入的解决方式

    如图,刚开始报错获取不到bean因为配置文件 1.原因一: *.properties等没有值,还是用${变量的}.获取不到,于是把所有值复制到properties文件里. 2.原因二: springmvc.xml 没有某些静态资源获取报错,把src的resources下的springmvc.xml复制到test目录的resources下,删除静态资源引用. 3.原因三: 可去掉log4j配置. 补充知识:IDEA的junit单元测试Scanner输入无效 在idea的junit单元测试中用Sca

  • Android Studio导入项目不支持的两种解决方式

    今天open项目到AS时,IDEA抛出如下错误: This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 4.1 or newer. 根本原因是该项目的gradle版本太新,但是AS不支持. 两种解决方式: 1.升级Android Studio到4.1及以上版本 2.调整该项目的gradl

  • SpringBoot项目打包war包时无法运行问题的解决方式

    目录 序 SpringBoot项目打包 jar 包 和 tomcat 包 实际问题及解决方式 问题 解决方法 end 序 现实的情况下遇见过该问题刚好记录一下! SpringBoot项目打包 首先默认创建的maven springBoot项目进行代码的clean 和 install进行项目打包的时候默认是使用jar 包的形式进行打包的,如果需要进行war 包打包部署的话就需要修改相应的 数据内容了 jar 包 和 tomcat 包 jar 包打完之后进行部署的时候使用 java -jar 的启动

  • 关于react+antd样式不生效问题的解决方式

    目录 1.添加antd组件样式不生效 2.运行yarn eject时暴露配置文件报错 3.less-loader版本过高,删除旧版本,下载低版本即可 4.项目中引入icon代码报错 补充:React中antd按需加载样式不生效解决办法 总结 1.添加antd组件样式不生效 在入口文件中引入import 'antd/dist/antd.css' 样式生效,但是生成警告 WARNING in ./node_modules/antd/dist/antd.css Failed to parse sour

  • 浏览器关闭使session失效的问题多种解决方式

    如果用户不点击网站的"退出"链接,而直接关闭浏览器(或者强制关闭浏览器进程.死机等),服务器无法处理用户退出网站的请求,解决方式如下: 方式1:在每个页面中加入隐藏的IFrame,以异步刷新的方式定期刷新iframe页面,如每隔10S刷新一次,当服务器在一定的时间内未收到用户的刷新请求,则认为用户已经退出 优点:能在短时间内判断出用户是否已经退出 缺点:增加用户请求次数,所消耗的服务器资源较大 方式2:使用cookie保存用户登录信息,不要设置cookie的过期时间,当关闭浏览器时,c

  • Javascript跨域请求的4种解决方式

    什么情况下才会出现跨域? 假设域名是:http://www.example.com.cn/ 如果所请求的域名跟这个域名不致,这种情况就是跨域,由于跨域存在漏洞,所以一般来说正常的跨域请求方式是请求不到的. 解决方式: 一.window.name 1. 服务器返回 复制代码 代码如下: <script>window.name='{"id":"3", "name":"leisure"}';</script>

随机推荐