我是靠谱客的博主 优雅人生,最近开发中收集的这篇文章主要介绍日志升级为log4j2的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 原因
      • 步骤
        • 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中进行输出。

全异步

全异步配置方法:
  1. 全局启用异步Logger方案一:

    JVM启动参数(boot.ini)加上“-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector”
    
  2. 全局启用异步Logger方案二:

    Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
  3. 手工指定部分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的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部