17 properties);
18 if (thresholdStr != null) {
19 hierarchy.setThreshold(OptionConverter.toLevel(thresholdStr,
20 (Level) Level.ALL));
21 LogLog.debug("Hierarchy threshold set to ["
22 + hierarchy.getThreshold() + "].");
23 }
24
25 }
然后分三步解析配置信息:
1. 解析Root Logger配置
首先找到log4j.rootLogger的值,它以逗号’,’分隔,其中第一个值时root的Level信息,之后是要添加到root的Appender名字。对Level信息,直接设置给root就行。对Appender名字,继续解析。
1 void parseCategory(Properties props, Logger logger, String optionKey,
2 String loggerName, String value) {
3 LogLog.debug("Parsing for [" + loggerName + "] with value=[" + value
4 + "].");
5 StringTokenizer st = new StringTokenizer(value, ",");
6 if (!(value.startsWith(",") || value.equals(""))) {
7 if (!st.hasMoreTokens())
8 return;
9 String levelStr = st.nextToken();
10 LogLog.debug("Level token is [" + levelStr + "].");
11 if (INHERITED.equalsIgnoreCase(levelStr)
12 || NULL.equalsIgnoreCase(levelStr)) {
13 if (loggerName.equals(INTERNAL_ROOT_NAME)) {
14 LogLog.warn("The root logger cannot be set to null.");
15 } else {
16 logger.setLevel(null);
17 }
18 } else {
19 logger.setLevel(OptionConverter.toLevel(levelStr,
20 (Level) Level.DEBUG));
21 }
22 LogLog.debug("Category " + loggerName + " set to "
23 + logger.getLevel());
24 }
25 logger.removeAllAppenders();
26 Appender appender;
27 String appenderName;
28 while (st.hasMoreTokens()) {
29 appenderName = st.nextToken().trim();
30 if (appenderName == null || appenderName.equals(","))
31 continue;
32 LogLog.debug("Parsing appender named \"" + appenderName + "\".");
33 appender = parseAppender(props, appenderName);
34 if (appender != null) {
35 logger.addAppender(appender);
36 }
37 }
38 }
相同的Appender可以添加到不同的Logger中,因而PropertyConfigurator对Appender做了缓存,如果能从缓存中找到相应的Appender类,则直接返回找到的Appender。
而后解析以下键值名以及对应类的属性信息:
log4j.appender.appenderName=…
log4j.appender.appenderName.layout=…
log4j.appender.appenderName.errorhandler=…
log4j.appender.appenderName.filter.filterKey.name=…
1 Appender parseAppender(Properties props, String appenderName) {
2 Appender appender = registryGet(appenderName);
3 if ((appender != null)) {
4 LogLog.debug("Appender \"" + appenderName
5 + "\" was already parsed.");
6 return appender;
7 }
8 String prefix = APPENDER_PREFIX + appenderName;
9 String layoutPrefix = prefix + ".layout";
10 appender = (Appender) OptionConverter.instantiateByKey(props, prefix,
11 org.apache.log4j.Appender.class, null);
12 if (appender == null) {
13 LogLog.error("Could not instantiate appender named \""
14 + appenderName + "\".");
15 return null;
16 }
17 appender.setName(appenderName);
18 if (appender instanceof OptionHandler) {
19 if (appender.requiresLayout()) {
20 Layout layout = (Layout) OptionConverter.instantiateByKey(
21 props, layoutPrefix, Layou