原文地址: How to use Log4j 2 with Spring Boot
Apache Log4j2 是 Log4j 1.x 的下一代产品
Log4j2在性能上有了很大的提升,拥有日志异步输出的功能,还支持众多接口,包括SLF4J、commons logging 和 java.util.logging。
这里,我们讲述怎么在 Spring Boot 程序中集成和配置 Log4j2。我们会配置 RollingFile 和 SMTP 等不同类型的 appender,也会学习到怎么使用 Log4j2 提供的异步模式。
我们打算通过编写一个简单的 Spring Boot 程序来演示怎么集成和配置 Log4j2。
我们开始吧。
创建项目
我们使用Spring Boot CLI 来生成项目,如果你没有安装Spring Boot CLI,我强烈建议你安装一下,安装可以参考这里
打开你的终端,输入一下命令来生成项目:
spring init --name=log4j2-demo --dependencies=web log4j2-demo
生成完成后,导入到你的IDE中,项目结构如下:
添加 Log4j2
所有的Sprint Boot starters 依赖 spring-boot-starter-logging
, 默认使用Logback ,如果使用Log4j2,你需要排除 spring-boot-starter-logging
,添加spring-boot-starter-log4j2
的依赖。
打开 pox.xml
文件,添加以下代码到 <dependencies>
节点下:
<!-- 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>
配置 Log4j2
Spring Boot 在classpath中发现 log4j2.xml
、 log4j2.json
或者 log4j2.yaml
文件后,会自动配置Log4j。
这里我们使用 xml 来配置 Log4j2。在 src/main/resources
下创建 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>
我们定义了一个简单的 ConsoleAppender
和两个 logger
(一个app相关的logger,一个根logger)
在app中使用 Log4j2
我们添加一些日志相关的代码,来验证下我们的配置。打开Log4j2DemoApplication.java
,替换文件内的代码:
package com.example.log4j2demo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@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.");
}
}
我们添加了5级别的日志输出。运行app,日志会打印输出到控制台。
添加Rolling File Appender
如果你想将日志写入到文件中,你可以使用 RollingFile
appender,当日志文件大小到达配置的临界值时,会创建一个新的文件。
它会使用 filePattern
参数中的配置来命名历史日志文件。
<!-- Rolling File Appender -->
<RollingFile name="FileAppender" fileName="logs/log4j2-demo.log"
filePattern="logs/log4j2-demo-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
在上面的配置中,我设置了一个 10MB 大小的 SizeBasedTriggeringPolicy
。<DeffaultRollOverStrategy max="10">
代表我们最多保留10个文件。
你可以将上述配置添加到 Appenders
节点,logger 配置如下所示:
<Root level="info">
<AppenderRef ref="ConsoleAppender"/>
<AppenderRef ref="FileAppender"/>
</Root>
添加SMTP Appender
在生产环境中,当系统系统发生错误,需要通过邮件提醒时,使用 SMTP appender 是非常有效的。
你可以配置 SMTP appender 使用 SMTP server 发送错误日志的邮件给你。
<!-- SMTP Appender -->
<SMTP name="MailAppender"
subject="Log4j2 Demo [PROD]"
to="youremail@example.com"
from="log4j2-demo-alerts@example.com"
smtpHost="yourSMTPHost"
smtpPort="587"
smtpUsername="yourSMTPUsername"
smtpPassword="yourSMTPPassword"
bufferSize="1">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
</SMTP>
需要注意的是,需要添加 spring-boot-starter-mail
依赖,SMTP appender才能正常工作
<!-- Needed for SMTP appender -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
异步日志
Log4j2 支持异步日志记录,相比之前的同步方式,性能上有非常大的提升。
Log4j2 使用了 Disruptor 来实现内部的异步日志。
使用异步日志时,需要引入 Disruptor 的依赖。添加以下代码到你的 pom.xml
中:
<!-- Needed for Async Logging with Log4j 2 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.6</version>
</dependency>
现在你可以使所有的Logger异步工作,或者混合使用同步和异步的方式。
1. 修改所有的Logger为异步模式
修改所有的 Logger 为异步模式是很容易的,你只需要修改系统属性 Log4jContextSelector
为 org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
。
在运行时:
mvn spring-boot:run -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
在使用打包的jar文件时:
mvn clean package
java -jar target/log4j2-demo-0.0.1-SNAPSHOT.jar -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
2.使用同步和异步混合模式
使用同步和异步的混合配置,可以使用 配置节点
在下面的示例中,app相关的日志配置为异步模式,其他根日志是同步模式:
<Loggers>
<AsyncLogger name="com.example.log4j2demo" level="debug" additivity="false">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender" />
</AsyncLogger>
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender" />
</Root>
</Loggers>
使用以上方式,你不需要添加任何系统属性。
总结
祝贺大家!在本文中,我们已经学习了如何在Spring Boot中集成和配置Log4j2。我们也配置了各种类型的Appender,最后我们学习了如何使用Log4j2提供的异步模式。
你可以到 这里 下载本文中的代码。
感谢你的阅读,欢迎继续关注我的文章。Happy coding! :)