1. 程式人生 > >Spring Boot中log4j的配置

Spring Boot中log4j的配置

上篇文章Spring Boot日誌管理,我簡單講述了Spring Boot中使用預設日誌Logback進行日誌管理的配置。在上篇文章中有講到,LogBack是Log4j的改良版本,比Log4j擁有更多的特性,同時也帶來很大效能提升。但是log4j作為一款常用的日誌庫,在實際開發中還是很常用的,本片文章,我將簡單介紹一下Spring Boot中如何使用Log4J進行日誌管理。

建立Spring Boot工程時,必然會引入了spring-boot-starter,其中包含了spring-boot-starter-logging,該依賴內容就是Spring Boot預設的日誌框架Logback,所以我們在引入log4j之前,首先要先排除該包的依賴,再引入log4j的依賴:

<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>

在src/main/resuorces資料夾新增log4j配置檔案log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
        </Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.example.log4j2demo" level="debug" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
        </Logger>

        <Root level="info">
            <AppenderRef ref="ConsoleAppender"/>
        </Root>
    </Loggers>
</Configuration>

log4J也可以和SLF4J配合使用,實現執行時繫結log4J例項,使用方法與上一篇文章logback一致。

@RestController
@RequestMapping(value = "/health")
public class HealthCheckController {
    private final Logger logger = LoggerFactory.getLogger(Object.class);

    @RequestMapping(value = "/check", method = RequestMethod.GET)
    public String check(){
        logger.trace("health check controller trace……");
        logger.debug("health check controller debug……");
        logger.info("health check controller info……");
        logger.warn("health check controller warn……");
        logger.error("health check controller error……");
        return "ok";
    }
}
  • Log4j檔案輸出配置

在Logback中可以通過配置RollingFile子節點達到檔案輸出的目的,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
        </Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <RollingFile name="FileAppender" fileName="d:/log/log4j2-demo.log"
                     filePattern="d:/log/log4j2-demo-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.zhuoli.service.springboot.log4j" level="debug" additivity="false">
            <AppenderRef ref="ConsoleAppender" />
        </Logger>

        <Root level="info">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="FileAppender" />
        </Root>
    </Loggers>
</Configuration>
  • Log4j非同步日誌

log4j啟動非同步需要lmax支援,需要引入jar包:

<!-- Needed for Async Logging with Log4j 2 -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.6</version>
</dependency>

修改日誌輸出為非同步:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
        </Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <RollingFile name="FileAppender" fileName="d:/log/log4j2-demo.log"
                     filePattern="d:/log/log4j2-demo-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>

        <!--file非同步輸出-->
        <Async name="AsyncFile" buffersize="32768" blocking="false">
            <AppenderRef ref="FileAppender"/>
        </Async>

        <!--console非同步輸出-->
        <Async name="AsyncConsole" buffersize="32768" blocking="false">
            <AppenderRef ref="ConsoleAppender"/>
        </Async>
    </Appenders>
    <Loggers>
        <Logger name="org.apache.catalina.startup.DigesterFactory" level="error"/>
        <Logger name="org.apache.catalina.util.LifecycleBase" level="error"/>
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
        <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
        <Logger name="org.crsh.plugin" level="warn"/>
        <logger name="org.crsh.ssh" level="warn"/>
        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error"/>
        <Logger name="org.hibernate.validator.internal.util.Version" level="warn"/>
        <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
        <logger name="org.thymeleaf" level="warn"/>
        <logger name="org.springframework.context.support" level="warn"/>
        <logger name="org.springframework.jmx.export.annotation" level="warn"/>
        <logger name="com.zaxxer.hikari" level="warn"/>
        <logger name="org.springframework.context.annotation.AnnotationConfigApplicationContext" level="warn"/>
        <logger name="org.springframework.web.servlet.mvc.method.annotation" level="warn"/>
        <logger name="metrics_influxdb.measurements" level="off"/>

        <Root level="info">
            <AppenderRef ref="AsyncConsole" />
            <AppenderRef ref="AsyncFile" />
        </Root>
    </Loggers>
</Configuration>

上述配置實現了日誌非同步輸出,及區別包進行不同級別的log輸出,在日常開發中基本是可用的。通過本片文章可以看出,其實log4j配置和logback配置是相通的,建議想了解日誌配置的同學花時間去看一下上篇Spring Boot日誌管理的文章。另外,在生產上,通過kafaka非同步日誌輸出也是非常常見的,想了解的同學可以看一下這一篇文章Kafka+Log4j實現日誌集中管理