Log4j2.properties 文件实例

  • 学习配置 log4j2.properties 文件以将日志语句输出到控制台、滚动文件等。
  • 学习配置 log4j2 附加程序、级别和模式。

一、 Log4j2 Maven 依赖

请注意:
这里虽然介绍 Log4j2 的单独使用方法。
但是仍然建议将 Log4j2 与 SLF4J 结合使用,请看这一篇:

1. Maven

要包含 Log4j2,请包含最新版本的 log4j-core 和 log4j-api 依赖项。

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

2. Gradle

dependencies {
    implementation 'org.apache.logging.log4j:log4j-api:2.19.0'
    implementation 'org.apache.logging.log4j:log4j-core:2.19.0'
}

二、默认日志记录行为

默认行为在以下情况下启动:

  • 启动参数中未指定: log4j.configurationFile 属性,或者此属性未指向有效的配置文件。
  • 类路径中不存在有效的 log4j2-test.[xml|properties|yaml|json] 配置文件。
  • 类路径中不存在 log4j2.[xml|properties|yaml|json] 配置文件。

默认情况下,Log4j2将使用ConsoleAppender将日志消息写入控制台。
此外,根记录器默认定义为错误级别。 这意味着只有 ERROR 日志语句可见,而 INFO、DEBUG、TRACE 级别消息将不可见。

三、配置 log4j2.properties 从控制台输出日志

我们可以使用下面的 log4j2.properties 文件将输出记录到控制台中。
请注意,如果找不到配置文件,则将使用 DefaultConfiguration,并且也会将日志输出到控制台。

# log4j2.properties

# Set to debug or trace if log4j initialization is failing
status = warn

# Name of the configuration
name = ConsoleLogConfigDemo

# Console appender configuration
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Root logger level
rootLogger.level = debug

# Root logger referring to console appender
rootLogger.appenderRef.stdout.ref = consoleLogger

四、为滚动文件配置 log4j2.properties

我们可以使用下面的 log4j2.properties 文件记录输出以及基于时间和大小的滚动文件。

# log4j2.properties

status = warn
name= RollingFileLogConfigDemo

# Log files location
property.basePath = c:/temp/logs

# RollingFileAppender name, pattern, path and rollover policy
appender.rolling.type = RollingFile
appender.rolling.name = fileLogger
appender.rolling.fileName= ${basePath}/app.log
appender.rolling.filePattern= ${basePath}/app_%d{yyyyMMdd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n
appender.rolling.policies.type = Policies

# RollingFileAppender rotation policy
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size = 10MB
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.delete.type = Delete
appender.rolling.strategy.delete.basePath = ${basePath}
appender.rolling.strategy.delete.maxDepth = 10
appender.rolling.strategy.delete.ifLastModified.type = IfLastModified

# Delete all files older than 30 days
appender.rolling.strategy.delete.ifLastModified.age = 30d

# Configure root logger
rootLogger.level = debug
rootLogger.appenderRef.rolling.ref = fileLogger

五、扫描Classpath中的log4j2.properties文件

我们应该将 log4j2.properties 放在应用程序类路径中的任何位置。
Log4j2 将扫描所有类路径位置以找出该文件,然后加载它。
我们已将文件放入 resource 文件夹中。

log4jproperties配置清理策略_配置文件

从参数中读取 log4j2 配置文件
如果我们使用外部 log4j2 配置文件,那么我们可以使用应用程序启动参数或系统属性 log4j2.configurationFile 提供配置文件的路径。 请注意,此属性值不限于本地文件系统上的位置,并且可以包含 URL。

-Dlog4j2.configurationFile=file:/home/lokesh/log4j2.properties

结合测试类使用
常见的做法是在junit测试类中用@BeforeAll注释的方法中设置log4j2.configurationFile属性。 这将允许在测试期间使用任意命名的文件。

六、例子

让我们编写一个 java 类和一些日志语句来验证日志是否出现在控制台和日志文件中。
为了记录语句,我们使用 SLF4J LoggerFactory 类及其 getLogger() 方法获取 Logger 实例。 然后我们使用Logger的各种方法来写入日志记录,例如info()、error()和debug()。

// Log4j2HelloWorldExample.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {

  public static void main(final String[] args) {
      Logger logger = LoggerFactory.getLogger(Main.class);

      logger.debug("Debug Message Logged !!!");
      logger.info("Info Message Logged !!!");
      logger.error("Error Message Logged !!!", new NullPointerException("NullError"));
  }
}

现在,当您运行上面的程序时,我们将在控制台中看到以下日志语句。

2021-12-14 14:26:32.737 DEBUG [main] [com.howtodoinjava.demo.slf4j.Main.main (Main.java:10)] - Debug Message Logged !!!
2021-12-14 14:26:32.739 INFO [main] [com.howtodoinjava.demo.slf4j.Main.main (Main.java:11)] - Info Message Logged !!!
2021-12-14 14:26:32.739 ERROR [main] [com.howtodoinjava.demo.slf4j.Main.main (Main.java:12)] - Error Message Logged !!!
java.lang.NullPointerException: NullError
	at com.howtodoinjava.demo.slf4j.Main.main (Main.java:12) [classes/:?]