spring boot应用切换日志实现方式为log4j2

595 阅读1分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

一、选择log4j2原因

原因:性能,具体性能可以参考官网或者网络上性能对比

注:应用必须统一使用slf4j接口来打印日志,因此底层可以无缝切换成log4j2(未来如果有更好选择,也可以随时切换成其它)

二、spring boot应用切换log4j2实战

注: 以下操作在spring boot应用中进行

1. 更改依赖:pom.xml:

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version>
            <scope>provided</scope>
        </dependency>
        ...
  </dependencies>

注:
(1)这一步把原先默认日志依赖spring-boot-starter-logging(默认日志实现方式logback)替换成spring-boot-starter-log4j2
(2) lombok是为了简化日志操作,其提供的注解@Slf4j自动实现了日志实例log,有了该注解,可以在代码中直接使用log来打日志

2. 日志配置文件:src/main/resources/log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info" monitorInterval="30">
    <Properties>
        <Property name="filepath">${sys:user.home}/logs/spring-boot-log-demo</Property>
    </Properties>
    <appenders>
        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>
        <RollingFile name="RollingFileInfo" fileName="${filepath}/info.log"
                     filePattern="${filepath}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="1 MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${filepath}/warn.log"
                     filePattern="${filepath}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${filepath}/error.log"
                     filePattern="${filepath}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>

    </appenders>

    <loggers>
        <logger name="org.springframework" level="INFO">
        </logger>
        <logger name="org.mybatis" level="INFO">
        </logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

</configuration>

注:这里定义了日志格式和输出规则,具体规则参考log4j2官网

3. 日志具体使用

  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.SpringBootApplication;
  import lombok.extern.slf4j.Slf4j;
  import java.util.Random;
  @SpringBootApplication
  @Slf4j
  public class SpringBootLogDemoApplication {

      public static void main(String[] args) {
          //测试日志分文件
          new Random().ints().limit(100000).forEach( e -> log.info("number: {}",e));
          log.debug("debug");
          log.warn("warn");
          log.error("error");

          SpringApplication.run(SpringBootLogDemoApplication.class, args);
      }
  }

注:

* @Slf4j是lombok提供日志注解,有了该注解,可以在类中直接使用log实例,如:log.debug("debug"); 非常方便
* 不要用@Log注解,用@Slf4j

三、Todo

  • 日志规范
  • 对接日志系统ELK