Log4j
可以在初始化的时候执行自动配置。当Log4j启动的时候,会首先定位所有的ConfigurationFactory
的配置然后会根据权重进行从高到低的排序。目前的版本,Log4j
包含了四种类型的ConfigurationFactory
的实现,JSON
,YAML
,properties
,XML
。
1:Log4j
将会检查 log4j.configurationFile
的系统属性,如果已经设置了对应的属性,将会使用ConfigurationFactory
对应的属性去加载配置。
2:如果没有设置对应的系统属性,将会在classpath
中寻找log4j2-test.properties
文件。
3:如果没有找到,则会在classpath
中继续寻找log4j2-test.yaml
或者log4j2-test.yml
文件。
4:如果还是没有找到,则会在classpath
中继续寻找log4j2.json
或者log4j2-test.jsn
文件。
5:如果还是没有找到,则会在classpath
中继续寻找log4j2.xml
文件。
6:如果test文件不能classpath
中被定为,那么就会寻找log4j2.properties
文件。
7:如果properties
文件不能被定位,就会在classpath
中寻找YAML
的配置文件,log4j2.yaml
或者log4j2.yml
文件。
8:如果YAML
文件不能被定位,就会在classpath
中寻找JSON
格式的配置文件,log4j2.json
或者log4j2.jsn
文件。
9:如果JSON
文件不能被定位,就会在classpath
中寻找XML
格式的配置文件,log4j2.xml
。
10:如果依然没有配置文件被定位,那么将会使用缺省的配置DefaultConfiguration
。日志将会被直接输出到控制台。
译者附:设置log4j2的配置必然生效是哪个?就是他
log4j2-test.properties
。
例子应用MyApp
将会说明Log4j
是如何工作的。
import com.foo.Bar;
// Import log4j classes.
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class MyApp {
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static final Logger logger = LogManager.getLogger(MyApp.class);
public static void main(final String... args) {
// Set up a simple configuration that logs on the console.
logger.trace("Entering application.");
Bar bar = new Bar();
if (!bar.doIt()) {
logger.error("Didn't do it.");
}
logger.trace("Exiting application.");
}
}
MyApp
首先引用log4j
的关联类,然后定义了一个静态的变量logger
,指定了logger
的名称是MyApp.class
。
MyApp
使用的Bar
类,定义在com.foo
包的下面。
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
无法定位配置文件,那么就会使用缺省的配置。DafaultConfiguration
类定义了基本的配置,配置的内容:
ConsoleAppender
设置成root
。PatternLayout
的格式”%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n”
注意:缺省的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放到classpath中,就会得到和上面一模一样的输出(因为这个和默认配置是一样的)。
改变Root 的level为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.
请注意,当使用默认配置的时候,其他状态的日志都被禁用了.
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/113880.html