深入Log4J源码之LoggerRepository和Configurator(三)

2014-11-24 08:39:23 · 作者: · 浏览: 5
解析非Root Logger和ObjectRender配置

解析log4j.logger.、log4j.renderer.、log4j.throwableRenderer.等信息。

另外,PropertyConfigurator还通过PropertyWatchLog类支持每个一段时间检查一次,如果发现配置文件有改动,则自动重新加载配置信息。

DOMConfigurator类
DOMConfigurator使用DOM解析所有Log4J配置文件中的元素,并根据DOM中的元素查找对应的RootLogger、Logger、Appender、Layout等模块。另外DOMConfigurator也支持每隔一段时间检查文件是否有修改,若有,则重新载入新修改后的配置文件。这里DOMConfigurator的实现方式和PropertyConfigurator的实现方式类似,不再详细介绍。www.2cto.com

LogManager类

LogManager将Configurator和LoggerRepository整合在一起,它在初始化的时候找到Log4J配置文件,并且将其解析到LoggerRepository中。

1 static {
2 Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
3 repositorySelector = new DefaultRepositorySelector(h);
4 String override = OptionConverter.getSystemProperty(
5 DEFAULT_INIT_OVERRIDE_KEY, null);
6 if (override == null || "false".equalsIgnoreCase(override)) {
7 String configurationOptionStr = OptionConverter.getSystemProperty(
8 DEFAULT_CONFIGURATION_KEY, null);
9 String configuratorClassName = OptionConverter.getSystemProperty(
10 CONFIGURATOR_CLASS_KEY, null);
11 URL url = null;
12 if (configurationOptionStr == null) {
13 url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
14 if (url == null) {
15 url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
16 }
17 } else {
18 try {
19 url = new URL(configurationOptionStr);
20 } catch (MalformedURLException ex) {
21 url = Loader.getResource(configurationOptionStr);
22 }
23 }
24 if (url != null) {
25 LogLog.debug("Using URL [" + url
26 + "] for automatic log4j configuration.");
27 try {
28 OptionConverter.selectAndConfigure(url,
29 configuratorClassName,
30 LogManager.getLoggerRepository());
31 } catch (NoClassDefFoundError e) {
32 LogLog.warn("Error during default initialization", e);
33 }
34 } else {
35 LogLog.debug("Could not find resource: ["
36 + configurationOptionStr + "].");
37 }
38 } else {
39 LogLog.debug("Default initialization of overridden by "
40 + DEFAULT_INIT_OVERRIDE_KEY + "property.");
41 }
42 }

作者:上善若水