Apache Log4j 2 是 Log4j 1.x 的继承者(谁能猜到?:p)。
与其前身相比,Log4j 2 提供了显着的性能改进。它包含异步记录器并支持多种 API,包括 SLF4J、commons logging 和 java.util.loggging。
在本文中,您将学习如何在 Spring Boot 应用程序中集成和配置 Log4j 2。您将配置不同类型的 appender,包括 RollingFileAppender
和 SMTPAppender
。您还将学习如何使用 Log4j 2 提供的异步日志记录功能。
这个想法是从头开始构建一个简单的 Spring Boot 应用程序,并演示如何在应用程序中集成和配置 Log4j 2。
那么,让我们开始吧!
让我们使用 Spring Boot CLI 来生成项目。如果您没有安装 Spring Boot CLI,我强烈建议您这样做。查看官方 Spring Boot 文档以获取有关安装的任何帮助。
启动终端并输入以下命令以生成项目 -
spring init --name=log4j2-demo --dependencies=web log4j2-demo
项目生成后,将其导入您喜欢的 IDE。项目的目录结构应该是这样的——
所有 Spring Boot 启动器都依赖于 spring-boot-starter-logging
,它默认使用 Logback。要使用 Log4j2,您需要排除 spring-boot-starter-logging
并添加 spring-boot-starter-log4j2
依赖项。
打开 pom.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.xml
或 log4j2.json
或 log4j2.yaml
的文件,Spring Boot 会自动配置 Log4j。
在本文中,我们将使用 XML 配置 log4j 2。在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 并声明了两个记录器 - 一个特定于应用程序的记录器和根记录器。
让我们添加一些日志代码来检查我们的记录器配置。打开 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 个不同日志级别的简单日志。当您运行该应用程序时,它会在控制台上记录所有内容。
如果您希望将日志写入文件,则可以使用 RollingFile 附加程序。每当日志文件达到触发策略指定的某个阈值时,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>
在上面的 RollingFile
配置中,我指定了一个 SizeBasedTriggeringPolicy
,它会在文件大小达到 10MB 时进行滚动。 <DefaultRollOverStrategy max="10" />
元素指定将保留的最大日志文件数。
还有另一个常见的触发策略叫做 TimeBasedTriggeringPolicy
,它在 Log4j2 中很常用。您可以使用 TimeBasedTriggeringPolicy
来指定根据 filePattern
属性中指定的日期/时间模式中最具体的时间单位发生翻转的频率。
以下是如何使用上述示例中的 TimeBasedTriggeringPolicy
每天滚动文件 -
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
interval
属性指定翻转的频率。所以如果你想每周滚动文件,你可以指定 interval="7"
。
在上面的例子中,文件的日期/时间模式是{yyy-MM-dd}
,其中最具体的时间单位是dd
(日期)。因此 TimeBasedTriggeringPolicy
根据日期滚动文件。如果日期/时间模式是 yyy-MM-dd-HH
,则翻转将基于小时发生。
最后,要使用 RollingFile
appender,您需要将上述 RollingFile
配置添加到 log4j2.xml
内的 <Appenders>
部分,并配置您的一个记录器像这样使用它 -
<Root level="info">
<AppenderRef ref="ConsoleAppender"/>
<AppenderRef ref="FileAppender"/>
</Root>
当您希望通过电子邮件收到有关应用程序中任何错误的通知时,SMTP appender 在生产系统中非常有用。
您可以配置 SMTP appender 使用 SMTP 服务器向您发送 ERROR 电子邮件,如下所示 -
<!-- 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>
请注意,要使 SMTP appender 正常工作,您需要将 spring-boot-starter-mail
依赖项包含到 pom.xml
文件中 -
<!-- Needed for SMTP appender -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
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>
现在,您可以使所有记录器异步,也可以创建同步和异步记录器的混合。
使所有记录器异步非常容易。您只需要将 SystemProperty 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
您还可以使用 <AsyncLogger>
配置元素将同步和异步记录器与 Log4j 2 混合使用。
在以下示例中,所有特定于应用程序的日志都将是异步的,其他根日志将是同步的 -
<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>
当您使用 <AsyncLogger>
元素时,您不需要添加任何 SystemProperty。 只需将上述记录器添加到您的 log4j2.xml
文件中,您就可以开始使用了。
在本文中,我们学习了如何在 Spring Boot 应用程序中集成和配置 Log4j 2。 我们还配置了不同类型的 appender,如 ConsoleAppender、RollingFile Appender 和 SMTP Appender。 最后,我们学习了如何使用 Log4j 2 提供的异步记录器。
您可以在 my github repository 中找到我们在本文中构建的示例项目的代码。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.callicoder.com/spring-boot-log4j-2-example/
内容来源于网络,如有侵权,请联系作者删除!