Java 中比较常用的日志工具类,有 Log4j、SLF4j、Commons-logging(简称jcl)、Logback、Log4j2(Log4j 升级版)、Jdk Logging。
Spring Boot 默认使用 Logback,但相比较而言,Log4j2 在性能上面会更好。
Spring Boot(版本1.5.10.RELEASE
)中使用 Log4j2 非常简单,添加如下依赖:
<!-- Exclude Spring Boot\'s Default Logging -->
<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>
<!-- Add Log4j2 Dependency -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- Needed for Async Logging with Log4j 2 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>
<!-- 使用jsonLayout必须依赖jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.4</version>
</dependency>
然后在src/main/resources
中添加log4j2.xml
配置文件(Spring Boot 还会识别log4j2.json
和log4j2.yaml
):
<?xml version="1.0" encoding="UTF-8"?>
<!-- status表示log4j2本身的日志信息打印级别,和下面的level,不是一个概念 -->
<!--TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF-->
<Configuration status="OFF" 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>
<Property name="LOG_FILE_PATH">/var/log/spring-boot-log4j2</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!-- Rolling File Appender -->
<RollingFile name="FileAppender" fileName="${LOG_FILE_PATH}/spring-boot-log4j2-demo.log"
filePattern="${LOG_FILE_PATH}/spring-boot-log4j2-demo-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<!--<JsonLayout complete="false" compact="true">
<KeyValuePair key="timestamp" value="$${date:yyyy-MM-dd\'T\'HH:mm:ss.SSSZ}" />
</JsonLayout>-->
<Filters>
<!-- 只记录ERROR级别日志信息,程序打印的其他信息不会被记录 -->
<!-- 此level设置的日志级别,是过滤日志文件中打印出的日志信息,和Root的level有所区别 -->
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
<!-- 每天创建一个日志文件 -->
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<!-- 用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。 -->
<!--<Logger name="com.easyjijin.demo.springbootlog4j2" level="debug" additivity="false">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender"/>
</Logger>-->
<!-- AsyncRoot - 异步记录日志 - 需要LMAXDisruptor的支持 -->
<!-- <AsyncRootlevel="info" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileAppender"/>
</AsyncRoot> -->
<!-- All < Trace < Debug < Info < Warn < Error < Fatal < OFF. -->
<!-- 程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。-->
<!-- 此level设置的日志级别,是过滤项目中输出的日志信息,和ThresholdFilter的level有所区别 -->
<Root level="ERROR">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender"/>
</Root>
</Loggers>
</Configuration>
这边需要注意几个日志的级别:
Configuration status="OFF"
:这个status
配置的是,Log4j2 组件本身日志级别,指的是如果 Log4j2 本身出错,打印出的日志级别配置。Root level="ERROR"
:这个level
配置的是,程序输入的日志级别,对应log.error("this is a error")
,程序会打印高于或等于所设置级别的日志。ThresholdFilter level="ERROR"
:这个level
配置的是,输出到日志文件(或是其他)的日志日志级别,也就是在日志文件只输出ERROR
级别的日志,其他无关信息不输出。
在程序中使用 Log4j2 打印日志信息:
@SpringBootApplication
public class Log4j2DemoApplication implements ApplicationRunner {
private static final Logger logger = LogManager.getLogger(Log4j2DemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(Log4j2DemoApplication.class, args);
}
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
logger.debug("Debugging log");
logger.info("Info log");
logger.warn("Hey, This is a warning!");
logger.error("Oops! We have an Error. OK");
logger.fatal("Damn! Fatal error. Please fix me.");
}
}
或者使用Lombok
,可以更方便的使用 Log4j2,需要添加依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
使用代码:
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Log4j2
@RestController
public class HelloController {
@RequestMapping("/home")
public String home() {
log.error("Hi ! We have an Error. Hello World");
return "Hello World ----spring-boot-log4j2";
}
}
注意:如果 IDEA 报错(找不到log
),IDEA 设置中添加 Lombok 插件,即可。
参考资料: