log4j屬性動(dòng)態(tài)設(shè)置
Posted on 2005-12-26 21:21 Justfly Shi 閱讀(3580) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): tips這兩天在修改代碼中的log4j的配置。
log4j的配置有兩種,一種是按照屬性進(jìn)行配置,一種是使用代碼進(jìn)行配置。
1、按照屬性進(jìn)行配置
按照屬性進(jìn)行配置可以分為按照properties格式的進(jìn)行配置,一種是按照XML格式的進(jìn)行配置,后者沒(méi)有研究過(guò),在此就不寫(xiě)了。
按照properties 的設(shè)置比較簡(jiǎn)單。使用org.apache.log4j.PropertyConfigurator類(lèi)就可以了
最簡(jiǎn)單的當(dāng)時(shí)是如下所示的代碼了。
PropertyConfigurator.configure(_log4jProperties);
另外在這個(gè)類(lèi)中還有別的方法也相當(dāng)有用,如:static public void configureAndWatch(String configFilename)
2、使用代碼進(jìn)行配置
這個(gè)比較羅嗦,不過(guò)可控制性比較高
代碼示例如下:
Layout layout = new PatternLayout(logPattern);
RollingFileAppender fileAppendar = new RollingFileAppender(layout,_fileName, true);
fileAppendar.setMaximumFileSize(_fileSize * 1024 * 1024);
fileAppendar.setMaxBackupIndex(_fileNum);
ConsoleAppender consoleAppendar = new ConsoleAppender(layout, "System.out");
consoleAppendar.setLayout(layout);
Logger mainLogger = Logger.getLogger("cn.justfly");
mainLogger.setLevel(Level.toLevel(_logLevel, Level.INFO));
mainLogger.addAppender(fileAppendar);
mainLogger.addAppender(consoleAppendar);
RollingFileAppender fileAppendar = new RollingFileAppender(layout,_fileName, true);
fileAppendar.setMaximumFileSize(_fileSize * 1024 * 1024);
fileAppendar.setMaxBackupIndex(_fileNum);
ConsoleAppender consoleAppendar = new ConsoleAppender(layout, "System.out");
consoleAppendar.setLayout(layout);
Logger mainLogger = Logger.getLogger("cn.justfly");
mainLogger.setLevel(Level.toLevel(_logLevel, Level.INFO));
mainLogger.addAppender(fileAppendar);
mainLogger.addAppender(consoleAppendar);
需要分別配置Layout、Appender和Logger
然后把Layout配置給Appender,把Appender添加給Logger,于是乎就大功告成了。
3、去掉原有的屬性配置
在上面的兩種方面中只是會(huì)添加原有的配置。并不會(huì)刪除掉原先的配置項(xiàng)。
可以使用LogManager.resetConfiguration();來(lái)刪除原有的配置。
4、鎖定
在執(zhí)行配置代碼的時(shí)候,當(dāng)有Logger在干活的時(shí)候怎么辦?
比如在你去掉原有的配置項(xiàng)而還沒(méi)有來(lái)得及設(shè)置新的屬性的時(shí)候的時(shí)候
這個(gè)時(shí)候Log4j的配置是空的,如果這個(gè)時(shí)候有一個(gè)Logger正在log的話是會(huì)出錯(cuò)的。
所以我們需要一個(gè)鎖,它可以讓你在進(jìn)行配置的時(shí)候阻塞其它Logger的動(dòng)作。
這個(gè)鎖就是rootLogger。可以通過(guò)Logger.getRootLogger()獲取到。