本文已参与「新人创作礼」活动.一起开启掘金创作之路。
一、选择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