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 文件夹中。
从参数中读取 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/:?]