Spring Boot中log4j的配置
阿新 • • 發佈:2018-12-19
上篇文章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實現日誌集中管理