章
目
录
学习如何配置log4j2.properties文件,以便将日志语句输出到控制台、滚动文件等,并学习如何配置log4j2的附加器、级别和模式。
1.Log4j2依赖项
请注意,使用带有SLF4J的Log4j2是推荐的方法。
1.1 Maven
要包含Log4j2,请包括最新版本的log4j-core和log4j-api依赖项。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
1.2 Gradle
dependencies {
implementation 'org.apache.logging.log4j:log4j-api:2.19.0'
implementation 'org.apache.logging.log4j:log4j-core:2.19.0'
}
2.默认的日志行为
默认行为会在以下情况下启动:
- 没有在启动参数中指定log4j.configurationFile属性,或者此属性未指向有效的配置文件。
- 类路径中没有有效的log4j2-test.[xml|properties|yaml|json]文件。
- 类路径中没有log4j2.[xml|properties|yaml|json]文件。
默认情况下,Log4j2将使用ConsoleAppender将日志消息写入控制台。
此外,根记录器默认定义为ERROR级别。这意味着只有ERROR日志语句才会显示,而INFO,DEBUG,TRACE级别的日志消息将不可见。
3.配置log4j2.properties以进行控制台日志记录
我们可以使用以下log4j2.properties文件将日志输出到控制台。请注意,如果没有找到配置文件,将使用DefaultConfiguration,这也将记录到控制台。
log4j2.properties:
# 设置日志4j初始化失败时是否进行调试或跟踪
status = warn
# 配置名称
name = ConsoleLogConfigDemo
# 控制台 appender 配置
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
# 根记录器引用控制台appender
rootLogger.appenderRef.stdout.ref = consoleLogger
4.配置log4j2.properties以进行滚动日志文件记录
我们可以使用以下log4j2.properties文件将日志输出到基于时间和大小滚动文件。
log4j2.propertiesstatus = warn
name= RollingFileLogConfigDemo
# Log 日志文件存放位置
property.basePath = c:/temp/logs
# RollingFileAppender 名称、模式、路径和滚动策略
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 轮转策略
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
# 删除所有超过 30 天的文件
appender.rolling.strategy.delete.ifLastModified.age = 30d
# 配置root logger
rootLogger.level = debug
rootLogger.appenderRef.rolling.ref = fileLogger
5.在类路径中扫描log4j2.properties文件
我们应该将log4j2.properties放在应用程序类路径的任何位置。 Log4j2将扫描所有类路径位置以查找此文件并加载它。
如果我们使用外部的log4j2配置文件,则可以使用应用程序启动参数或系统属性log4j2.configurationFile指定配置文件的路径。请注意,此属性值不仅限于本地文件系统上的位置,还可能包含URL。
-Dlog4j2.configurationFile=file:/home/lokesh/log4j2.properties
常见的方法是在junit测试类中注解@BeforeAll方法中设置log4j2.configurationFile属性。这将允许在测试期间使用任意命名的文件。
6.Demo
让我们编写一个Java类和一些日志语句来验证日志是否出现在控制台和日志文件中。
要记录这些语句,我们通过使用SLF4J LoggerFactory类及其getLogger()方法获取Logger实例。然后,我们使用Logger的各种方法来记录日志记录,例如info()、error()和debug()。
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/:?]