概述
文章目录
- 原因
- 步骤
- 1、清除log4j 1.x和slf4j 1.x.x相关的依赖
- 2、新增log4j2的依赖
- 3、配置新log4j2
- 4、更改原先代码中的Logger
- Log4j2的配置详解
- 根节点Configuration
- Appenders子节点
- Console节点
- File节点
- RollingFile节点
- Loggers子节点,常见的有两种:Root和Logger.
- 全异步
- 全异步配置方法:
- 推荐做法
- 全异步设定丢弃策略
原因
传统的log4j1.0和logback组件分别存在同步阻塞模型和AsyncContext异步方式,较为低效。所以有必要升级到log4j2.0,具体原因可查看另外一篇文章性能对比。
步骤
1、清除log4j 1.x和slf4j 1.x.x相关的依赖
可以先使用Maven Helper插件查看依赖树,搜索log4j和slf4j,然后要么直接删除,要么通过逐个排除。
2、新增log4j2的依赖
<properties>
<version.slf4j>2.11.2</version.slf4j>
</properties>
<!--日志包依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${version.slf4j}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${version.slf4j}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${version.slf4j}</version>
</dependency>
注意:如果有commons-logging依赖,需要手动删除,以免发生冲突,影响pom文件的编译。
springboot:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉springboot默认配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
3、配置新log4j2
-
删除原log4j.properties或者log4j.xml。
-
添加新的log4j2.xml配置(推荐)
-
在application.properties中添加
logging.congfig=classpath:log4j2.xml
-
推荐配置log4j2 全异步(all async)
新的log4j2.xml如下(具体需求可以自己改)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<properties>
<!-- 文件输出格式 -->
<property name="PATTERN">%d [%traceId] %-5p [%t] %c{1}:%L - %m%n</property>
<Property name="FILE_PATH">./logs/</Property>
</properties>
<appenders>
<!-- 输出到控制台,仅在本地开发环境使用 -->
<Console name="CONSOLE" target="system_out">
<PatternLayout pattern="${PATTERN}" />
</Console>
<!-- error -->
<!--输出到日志文件,滚动分割日志文件,自动打包gz-->
<RollingFile name="errorRollingFile"
fileName="${FILE_PATH}/exception.log"
filePattern="${FILE_PATH}/exception_%d{yyyy-MM-dd}-%i.log">
<SizeBasedTriggeringPolicy size="1000MB" />
<!-- DefaultRolloverStrategy 属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了10 -->
<DefaultRolloverStrategy max="10" />
<ThresholdFilter level="error" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout pattern="${PATTERN}"/>
</RollingFile>
<!-- INFO/WARN/DEBUG/ERROR日志输出 -->
<RollingFile name="runRollingFile"
fileName="${FILE_PATH}/run.log" filePattern="${FILE_PATH}/run_%d{yyyy-MM-dd}-%i.log">
<SizeBasedTriggeringPolicy size="1000MB" />
<!-- DefaultRolloverStrategy 属性如不设置,则默认为最多同一文件夹
下 7 个文件,这里设置了 10 -->
<DefaultRolloverStrategy max="10" />
<Filters>
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="${PATTERN}"/>
</RollingFile>
<!-- 日志异步配置,可不开启异步 -->
<Async name="infoAsync" blocking="false">
<AppenderRef ref="runRollingFile"/>
</Async>
<Async name="errorAsync" blocking="false">
<AppenderRef ref="errorRollingFile"/>
</Async>
</appenders>
<loggers>
<root level="INFO">
<appenderref ref="CONSOLE" />
<!-- 日志正常配置
<appenderref ref="runRollingFile" />
<appenderref ref="errorRollingFile" />
-->
<!-- 日志异步配置,可不开启异步 -->
<appenderref ref="infoAsync" />
<appenderref ref="errorAsync" />
</root>
</loggers>
</configuration>
具体含义可以参考
4、更改原先代码中的Logger
如果之前使用的是log4j 1.x里的logger创建的对象:
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
则需要把之前创建Logger对象的方式升级到:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
private static final Logger logger = LogManager.getLogger(Test.class)。
注意:若已经使用了slf4j-api包或使用了lombok的slf4j注解@Slf4j,则可以继续使用:private static final Logger log = LoggerFactory.getLogger(xxxx.class)不用改变(因为slf4就是日志门面)。
Log4j2的配置详解
根节点Configuration
有两个属性:
- status
- monitorinterval
有两个子节点:
- Appenders
- Loggers(表明可以定义多个Appender和Logger).
status用来指定log4j本身的打印日志的级别.
monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
Appenders子节点
常见的有三种子节点:Console、RollingFile、File
Console节点
用来定义输出到控制台的Appender.
- name:指定Appender的名字.
- target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
- PatternLayout:输出格式,不设置默认为:%m%n.
File节点
用来定义输出到指定位置的文件的Appender.
- name:指定Appender的名字.
- fileName:指定输出日志的目的文件带全路径的文件名.
- PatternLayout:输出格式,不设置默认为:%m%n.
RollingFile节点
用来定义超过指定条件自动删除旧的创建新的Appender.
- name:指定Appender的名字.
- fileName:指定输出日志的目的文件带全路径的文件名.
- PatternLayout:输出格式,不设置默认为:%m%n.
- filePattern : 指定当发生Rolling时,文件的转移和重命名规则.
- Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
- TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am.
- SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
- DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
Loggers子节点,常见的有两种:Root和Logger.
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
- Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
- level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
- name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
- AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
全异步
全异步配置方法:
-
全局启用异步Logger方案一:
JVM启动参数(boot.ini)加上“-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector”
-
全局启用异步Logger方案二:
“Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector”
-
手工指定部分Logger采用异步方式
java log4j2.xml配置文件中使用AsyncRoot/AsyncLogger替代Root/Logger
(上述3种方式任选其一即可,不要同时采用)
推荐做法
1)在Pom中依赖disruptor包:
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.1</version>
</dependency>
2)在你的启动脚本中增加一个系统变量的配置:
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
全异步设定丢弃策略
业务开发人员可以根据实际日志记录量来指定丢弃策略,在JVM启动参数新增:
-Dlog4j2.AsyncQueueFullPolicy=Default或Discard 即可。
- 默认是【Default】:异步转同步;
- 配置【Discard】后,当日志线程队列满以后,默认会丢弃INFO,DEBUG和TRACE的日志,也可以自定义丢弃的级别:配置-Dlog4j2.DiscardThreshold=【INFO/DEBUG/TRACE/ERROR】即可。
最后
以上就是优雅人生为你收集整理的日志升级为log4j2的方法的全部内容,希望文章能够帮你解决日志升级为log4j2的方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复