log4j2配置

log4j2依赖于

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
</dependency>

在我的项目中我是通过Slf4j注解引入日志接口的,配合intellij下的lombok插件,可以省去在各个模块中使用getLogger创建实例的麻烦。slf4j默认是使用logback,我们需要将slf4j桥接到log4j2实现上,由于spring-boot-starter-logging 中引入了logback框架,会导致冲突,需要在spring-boot-starter-web下exclude掉,所以整个日志的依赖部分如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>logback-classic</artifactId>
            <groupId>ch.qos.logback</groupId>
            </exclusion>
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<!--log-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
</dependency>

log4j2默认使用classpath下的log4j2.xml作为配置文件,自定义的文件需要在application.properties中指定

#log
logging.config=classpath:mylog4j2.xml

log4j2.xml配置文件包括三个部分<properties>, <appenders>和<loggers>, <properties>下可以定义一些变量给<appenders>和<loggers>引用,非必需。

之前参考的一个比较完整的log4j2.xml文件如下(链接):

<?xml version="1.0" encoding="UTF-8"?>
<!-- configuration 有多个属性,常用的有:name(配置名)
status(是否记录log4j2本身的event信息,默认是OFF,
可选值有: "trace", "debug", "info", "warn", "error" and "fatal")
dest(错误流输出位置,标准错误流、文件或远程邮件发送)
strict(是否使用strict xml形式,configuration支持concise(简约)和strict(严格)两种模式的xml。
简约模式下,使得文件编写起来更简洁) -->
<configuration status="OFF">
    <!-- 定义如下几个引用名,用于后面配置文件中使用 -->
    <Properties>
        <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss z} %-5level %class{36}%L%M - %msg%xEx%n
</property><!-- 日志输出格式 -->
        <property name="log-path">${web:rootDir}/logs</property><!-- ${web:rootDir}是项目根目录 -->
        <property name="every_file_size">5M</property><!-- 日志切割的最小单位 -->
        <property name="output_log_level">debug</property><!-- 日志输出级别 -->
    </Properties>

    <!-- 先定义所有的appender(日志输出位置) -->
    <appenders>

        <!-- 输出到控制台 name: 当前appender名 target: 目的位置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- ThresholdFilter: 用于定义过滤机制 -->
            <!-- level: 日志过滤级别 -->
            <!-- onMatch="ACCEPT":保留level 及以上级别的日志 -->
            <!-- onMismatch="DENY":丢掉level 以下级别的日志-->
            <!-- onMatch 和 onMissmatch 可选值为:ACCEPT DENY NEUTRAL-->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />

            <!--这个都知道是输出日志的格式 -->
            <PatternLayout pattern="${log_pattern}" />
        </Console>

        <!-- debug级别日志文件 -->
        <!-- RollingFile:日志滚动输出 -->
        <!--每次大小超过size,则这size大小的日志会自动进行压缩,作为存档 -->
        <RollingFile name="app_debug" fileName="${log-path}/debug/debug.log" 
filePattern="${log-path}/debug/debug-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="${log_pattern}" />
            <!-- SizeBasedTriggeringPolicy: 基于日志大小切分日志 -->
            <SizeBasedTriggeringPolicy size="${every_file_size}"/>
        </RollingFile>

        <!-- info级别日志文件 -->
        <RollingFile name="app_info" fileName="${log-path}/info/info.log" 
filePattern="${log-path}/info/info-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <PatternLayout pattern="${log_pattern}" />
            <SizeBasedTriggeringPolicy size="${every_file_size}"/>
        </RollingFile>

        <!-- error级别日志文件 -->
        <RollingFile name="app_error" fileName="${log-path}/error/error.log" 
filePattern="${log-path}/error/error-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <PatternLayout pattern="${log_pattern}" />
            <SizeBasedTriggeringPolicy size="${every_file_size}"/>
        </RollingFile>

    </appenders>

    <!-- 定义logger,只有定义了logger并引入之前定义的appender,appender才会生效 -->
    <loggers>
        <!--建立一个默认的root的logger,需要在root的level中指定输出的级别, -->
        <root level="${output_log_level}">
            <appender-ref ref="Console" />
            <appender-ref ref="app_debug"/>
            <appender-ref ref="app_info"/>
            <appender-ref ref="app_error"/>
        </root>
    </loggers>

</configuration>

上面的说明比较详细。但是我自己还需要对日志级别以不同的颜色高亮显示,所以在网上也找到解决方案参考,即在PatternLayout中使用highlight,一种比较好的格式如下:

<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n%throwable" disableAnsi="false" noConsoleNoAnsi="false"/>

这个方案在windows和linux测试都可以正常工作,输出的效果如下:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值