Fork me on GitHub

spring-boot集成Log4j2

前言

在企业级项目里,日志框架种类杂乱不一,尤其是接手一些有些年头的老项目时,各种各样的日志框架依赖和使用让人看的头大。

如何解决各种各样日志框架的大一统呢?神器Slf4j

spring-boot如何利用Slf4j集成其他日志框架?本文将以Log4j2为例。

Slf4j简单介绍

Slf4j官网瞧一瞧:

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.

Slf4j:Simple Logging Facade for Java.
它并不是一个类似java.util.logging, logback, log4j等的日志框架实现,而是作为一个门面服务于这些各种日志框架。如同字面含义,类似外观设计模式,提供了一组简单统一的API接口,隐藏了各种日志不一致的复杂性。

日志框架选型

几种日志框架简单对比:

  • log4j:元老级日志框架。它定义的Logger、Appender、Level等概念如今已经被广泛使用,里程碑式的日志框架
  • java.util.logging:简称j.u.l。java1.4版本引入,功能不如log4j,性能和可用性有限。
  • logbacklog4j升级版。它比log4j增加了不少功能,比如:原生实现了Slf4J,支持XML、Groovy方式配置等,主要是性能比log4j提升不少。
  • log4j2:同样是log4j升级版。也比log4j添加不少功能,比如多线程下的异步日志等。性能也提升不少。

至于logbacklog4j2性能比对,可以参考网上博文:

根据官方推荐是Slf4j+logback,此处我使用Slf4j2+log4j2来集成日志框架。

集成Log4j2

三步完成Log4j2的集成:

  1. maven依赖
  2. 配置日志文件
  3. 测试日志

maven依赖

pom.xml:

<!-- 需要排除logback -->
<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>

<!-- log4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

配置日志文件

classpath下添加log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <properties>
        <property name="LOG_HOME">../logs/</property>
        <property name="STDOUT_FILE_NAME">stdout</property>
    </properties>

    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <RollingRandomAccessFile name="stdout-log"
                                 fileName="${LOG_HOME}/${STDOUT_FILE_NAME}.log"
                                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/${STDOUT_FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout
                    pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingRandomAccessFile>
    </appenders>

    <loggers>
        <root level="error">
            <AppenderRef ref="stdout-log"/>
            <AppenderRef ref="Console"/>
        </root>

        <logger name="com.crw" level="info" additivity="false">
            <AppenderRef ref="stdout-log"/>
            <AppenderRef ref="Console"/>
        </logger>
    </loggers>

</configuration>

修改应用日志文件路径,application.yml:

logging.config: classpath:log4j2.xml

测试日志

增加一个EchoController:

@RestController
@Slf4j
public class EchoController {

    @GetMapping("/echo/hello")
    public String echo(String msg) {
        log.debug("DEBUG ----> echo:{}", msg);
        log.info("INFO  ----> echo:{}", msg);
        log.warn("WARN  ----> echo:{}", msg);
        log.error("ERROR  ----> echo:{}", msg);
        return "hello, " + msg;
    }
}

调用接口地址:

curl http://127.0.0.1:8080/echo/hello?msg=world  

页面输出:

hello, world

stdout.log文件输出:

2018-07-12 22:56:04.023 INFO [http-nio-8080-exec-3][EchoController.java:17] - INFO  ----> echo:world
2018-07-12 22:56:04.024 WARN [http-nio-8080-exec-3][EchoController.java:18] - WARN  ----> echo:world
2018-07-12 22:56:04.024 ERROR [http-nio-8080-exec-3][EchoController.java:19] - ERROR  ----> echo:world

debug级别的日志并未输出和打印在控制台,info级别以上日志打印并输出控制台。可见日志测试成功。

结束语

本文简单介绍了日志框架的种类已经统一日志API框架Slf4j,除此之外,apache下也有与Slf4j同一职能的框架commons-logging。之后可自行研究一下。

-------------本文结束,感谢您的阅读-------------
贵在坚持,如果您觉得本文还不错,不妨打赏一下~
0%