Archive for the ‘log4j’ tag
Finding Log4J’s Log Files
On a few occasions lately, I’ve logged into remote machines to look at Java log files, and then spent two minutes figuring out where to find them. I wrote this bit of code to wrangle the log file locations from the Log4J API, which I use write out the file paths to a known location on startup. If you have a somewhat complex multi-environment configuration, or generate multiple log files per application, then this code snippet may prove helpful.
Since the Log4J API is still Enumeration-based, there are some ugly old-school loops in there. All types are from the java.util or org.apache.log4j packages.
@SuppressWarnings("unchecked")
private static Map<String,String> getLogLocations() {
Collection<Logger> allLoggers = new ArrayList<Logger>();
Logger rootLogger = Logger.getRootLogger();
allLoggers.add(rootLogger);
for (Enumeration<Logger> loggers =
rootLogger.getLoggerRepository().getCurrentLoggers() ;
loggers.hasMoreElements() ; ) {
allLoggers.add(loggers.nextElement());
}
Set<FileAppender> fileAppenders =
new LinkedHashSet<FileAppender>();
for (Logger logger : allLoggers) {
for (Enumeration<Appender> appenders =
logger.getAllAppenders() ;
appenders.hasMoreElements() ; ) {
Appender appender = appenders.nextElement();
if (appender instanceof FileAppender) {
fileAppenders.add((FileAppender) appender);
}
}
}
Map<String, String> locations =
new LinkedHashMap<String,String>();
for (FileAppender appender : fileAppenders) {
locations.put(appender.getName(), appender.getFile());
}
return locations;
}
The code just grabs the root logger, finds all the other loggers via its LoggerRepository, and then finds the set of all FileAppenders attached to them. It returns a Map of appender name to logfile location (both Strings), in the order they are declared in your configuration.
Not really the world’s most elegant code. Despite the clunky Log4J API, I can’t help thinking that would take no more than two or three lines in Python or Ruby.
