配置
自动配置
Log4j具有在初始化期间自配置的能力。当Log4j启动时,它将定位所有ConfigurationFactory插件,并按照从从高到低的加权顺序排列它们。交付时,Log4j包含四个ConfigurationFactory实现:一个用于JSON、一个用于YAML、一个用于属性、一个用于XML。
- Log4j将检查“log4j.configurationFile”系统属性,如果设置了,将尝试使用与文件扩展名匹配的ConfigurationFactory加载配置。
- 如果没有设置系统属性,ConfigurationFactory的属性将在类路径中查找log4j2-test.properties文件。
- 如果没有找到这样的文件,YAML ConfigurationFactory将在类路径中查找log4j2-test.yaml或log4j2-test.yml文件。
- 如果没有找到这样的文件,JSON ConfigurationFactory将在类路径中查找log4j2-test.json或log4j2-test.jsn文件。
- 如果没有找到这样的文件,XML ConfigurationFactory将在类路径中查找log4j2-test.xml文件。
- 如果无法找到测试文件,则ConfigurationFactory的属性将在类路径上查找log4j2.properties文件。
- 如果无法找到属性文件,YAML ConfigurationFactory将在类路径中查找log4j2.yaml或log4j2.yml文件。
- 如果无法找到YAML文件,JSON ConfigurationFactory将在类路径上查找log4j2.json或log4j2.jsn文件。
- 如果找不到JSON文件,XML ConfigurationFactory将尝试在类路径上找到log4j2.xml文件。
- 如果没有找到配置文件,将使用DefaultConfiguration。这将导致日志输出到控制台。
一个名为MyApp
的示例应用将展示Log4j是如何做到这些的。
import com.foo.Bar;
// 导入Log4j的类
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class MyApp {
// 定义一个静态的日志器变量,引用名为MyApp的实例
private static final Logger logger = LogManager.getLogger(MyApp.class);
public static void main(final String... args) {
// 设置一个简单的配置,日志显示在控制台中
logger.trace("Entering application.");
Bar bar = new Bar();
if (!bar.doIt()) {
logger.error("Didn't do it.");
}
logger.trace("Exiting application.");
}
}
MyApp
u别没导入Log4j相关的类。然后它定义一个名为MyApp
的静态Logger变量,这恰好是类的完全限定名。
MyApp
使用com.foo
包中定义的Bar
类。
package com.foo;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Bar {
static final Logger logger = LogManager.getLogger(Bar.class.getName());
public boolean doIt() {
logger.entry();
logger.error("Did it again!");
return logger.exit(false);
}
}
如果Log4j找不到配置文件,它将提供默认配置。DefaultConfiguration类中提供的默认配置将设置:
- 一个附加到根记录器的ConsoleAppender。
- 一个设置为“%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n”的PatternLayout,被附加到ConsoleAppender上。
注意,默认情况下Log4j将根日志记录器分配给Level.ERROR
。
MyApp的输出类似如下:
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] ERROR MyApp - Didn't do it.
如前所述,Log4j将首先尝试从配置文件配置自身。与默认配置相同的配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
一旦上述文件作为log4j2.xml放入到类路径中,你将得到与上面列出的相同结果。将根级别更改为trace将得到类似于以下的结果:
17:13:01.540 [main] TRACE MyApp - Entering application.
17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] TRACE com.foo.Bar - exit with (false)
17:13:01.540 [main] ERROR MyApp - Didn't do it.
17:13:01.540 [main] TRACE MyApp - Exiting application.
请注意,使用默认配置时,将禁用状态日志的记录。