如何在 Spring Boot 中使用 Log4j 2

x33g5p2x  于2021-10-20 转载在 Spring  
字(7.1k)|赞(0)|评价(0)|浏览(398)

Apache Log4j 2 是 Log4j 1.x 的继承者(谁能猜到?:p)。

与其前身相比,Log4j 2 提供了显着的性能改进。它包含异步记录器并支持多种 API,包括 SLF4J、commons logging 和 java.util.loggging。

在本文中,您将学习如何在 Spring Boot 应用程序中集成和配置 Log4j 2。您将配置不同类型的 appender,包括 RollingFileAppenderSMTPAppender。您还将学习如何使用 Log4j 2 提供的异步日志记录功能。

这个想法是从头开始构建一个简单的 Spring Boot 应用程序,并演示如何在应用程序中集成和配置 Log4j 2。

那么,让我们开始吧!

创建项目

让我们使用 Spring Boot CLI 来生成项目。如果您没有安装 Spring Boot CLI,我强烈建议您这样做。查看官方 Spring Boot 文档以获取有关安装的任何帮助。

启动终端并输入以下命令以生成项目 -

spring init --name=log4j2-demo --dependencies=web log4j2-demo

项目生成后,将其导入您喜欢的 IDE。项目的目录结构应该是这样的——

添加 Log4j2

所有 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

如果在类路径中找到名为 log4j2.xmllog4j2.jsonlog4j2.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 并声明了两个记录器 - 一个特定于应用程序的记录器和根记录器。

在应用程序中使用 Log4j 2

让我们添加一些日志代码来检查我们的记录器配置。打开 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 个不同日志级别的简单日志。当您运行该应用程序时,它会在控制台上记录所有内容。

添加一个滚动文件 Appender

如果您希望将日志写入文件,则可以使用 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 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>

现在,您可以使所有记录器异步,也可以创建同步和异步记录器的混合。

1. 使所有记录器异步

使所有记录器异步非常容易。您只需要将 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

2. 混合使用同步和异步记录器

您还可以使用 <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 中找到我们在本文中构建的示例项目的代码。

相关文章