1. 概述

在这个教程中,我们将探讨如何使用Apache Log4j2库将日志信息记录到文件和控制台。在非生产环境中,这非常有用,我们可以在控制台上看到调试消息,同时将更高级别的日志保存到文件中供后续分析。

2. 项目设置

首先,让我们创建一个Java项目。我们将添加log4j2依赖项,并了解如何配置和使用日志记录器。

2.1. Log4j2依赖

让我们向项目中添加log4j2的依赖。我们需要添加Apache Log4J核心库Apache Log4J API库

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.19.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.19.0</version>
    </dependency>
</dependencies>

2.2. 应用程序类

现在,让我们使用log4j2库在应用程序中添加一些日志记录:

public class Log4j2ConsoleAndFile {

    private static final Logger logger = LogManager.getLogger(Log4j2ConsoleAndFile.class);

    public static void main(String[] args) {
        logger.info("Hello World!");
        logger.debug("Hello World!");
    }
}

3. Log4j2配置

为了自动配置日志记录器,我们需要在类路径上有一个配置文件。它可以是JSON、XML、YAML或properties格式。文件名应为"log4j2"。 对于我们的示例,我们将使用名为log4j2.properties的配置文件。

3.1. 记录到控制台

要将日志记录到任何目的地,我们首先需要定义一个附加器,它将日志写入控制台。让我们看看如何配置:

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

理解每个配置组件:

  • appender.console.type - 这里指定将使用的附加器类型。 类型Console表示附加器仅会写入控制台。请注意,键名称中的"console"只是约定,不是强制性的。
  • appender.console.name - 我们可以给一个唯一的名称,以便稍后引用这个附加器。
  • appender.console.layout.type - 这决定了用于格式化日志消息的布局类的名称。
  • appender.console.layout.pattern - 这是用于格式化日志消息的模式。

为了启用控制台日志记录器,我们需要将控制台附加器添加到根日志记录器中。我们可以使用上面指定的名称来做到这一点:

rootLogger=debug, STDOUT

使用此配置,我们将记录所有debug及以上的消息到控制台。对于本地环境中的控制台,debug级别的日志很常见。

3.2. 记录到文件

同样,我们可以配置日志记录器将日志记录到文件。这对于持久化日志通常很有用。让我们定义一个文件附加器:

appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=logs/log4j.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
appender.file.filter.threshold.type = ThresholdFilter
appender.file.filter.threshold.level = info

对于文件附加器,必须也指定文件名。

此外,我们还需要设置阈值级别。由于我们要将日志记录到文件,我们不想记录所有消息,因为这可能会占用大量的持久存储空间。我们只想记录级别为info或以上的消息。我们可以使用过滤器ThresholdFilter并设置其级别为*info*

为了启用文件日志记录器,我们需要将文件附加器添加到根日志记录器中。我们需要更改rootLogger配置以包含文件附加器:

rootLogger=debug, STDOUT, LOGFILE

即使我们在根级别使用了debug级别,文件日志记录器也只会记录info及以上级别的消息。

4. 测试

现在运行应用程序,检查控制台输出:

12:43:47,891 INFO  Application:8 - Hello World!
12:43:47,892 DEBUG Application:9 - Hello World!

正如预期的那样,我们可以看到控制台上的日志消息。如果我们在路径log4j.log下的日志文件中查看,我们可以看到只有info级别的日志消息:

12:43:47,891 INFO  Application:8 - Hello World!

5. 总结

在这篇文章中,我们学习了如何将日志信息记录到控制台和文件。我们创建了一个Java项目,使用properties文件配置Log4j2,并测试了消息被打印到控制台和文件。

如往常一样,完整的源代码可在GitHub上获取。