/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* All rights reserved. This program and the accompanying materials are made available under
* the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package gov.redhawk.logging.ui.config;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import gov.redhawk.logging.ui.LogLevels;
public class Log4JConfigGenerator {
private Log4JConfigGenerator() {
}
/**
* Parses a log4j config and returns a list of the appenders for a given logger. For example, if the config had:
* <p/>
* <code>log4j.logger.com.foo=BAR,WARN,BAZ</code>
* <p/>
* then this method would return ["BAR", "BAZ"] for logger "com.foo". Any error will return an empty list.
* @param logConfig The log4j config as a string
* @param logger The logger, or null/empty for the root logger
* @return A list of appenders for the logger; empty if none
*/
public static List<String> getExistingAppenders(String logConfig, String logger) {
// Parse properties
Properties props = new Properties();
try {
props.load(new StringReader(logConfig));
} catch (IOException e) {
return Collections.emptyList();
}
// Find all appenders
String key;
if (logger == null || logger.isEmpty()) {
key = "log4j.rootLogger";
} else {
key = "log4j.logger." + logger;
}
List<String> appenders = new ArrayList<String>();
for (String element : props.getProperty(key, "").split(",")) {
element = element.trim();
if (element.isEmpty()) {
continue;
}
try {
LogLevels.valueOf(element);
} catch (IllegalArgumentException e) {
// It's not a log level; must be an appender
appenders.add(element);
}
}
return appenders;
}
/**
* Create a log4j configuration snippet that adds a Redhawk log event appender
* @param namingContext The naming context to place the event channel in (e.g. 'REDHAWK_DEV')
* @param eventChannelName The event channel name to use
* @param logger The logger to attach the appender to; null/empty for the root logger
* @param logLevel The log level to use for the logger
* @param appenders Additional appenders (besides the new event channel appender) to add
* @return the log4j configuration snippet
*/
public static String createLog4jConfig(String namingContext, String eventChannelName, String logger, LogLevels logLevel, List<String> appenders) {
String prefix = "log4j.appender." + eventChannelName;
StringBuilder sb = new StringBuilder("\n");
sb.append(createStartTag(eventChannelName));
sb.append(" - Do not modify these lines\n");
sb.append("log4j.");
if (logger == null || logger.isEmpty()) {
sb.append("rootLogger=");
} else {
sb.append("logger.");
sb.append(logger);
sb.append('=');
}
sb.append(logLevel.getLabel());
sb.append(',');
sb.append(eventChannelName);
if (appenders != null && appenders.size() > 0) {
for (String appender : appenders) {
sb.append(',');
sb.append(appender);
}
}
sb.append('\n');
sb.append(prefix);
sb.append("=org.ossie.logging.RH_LogEventAppender\n");
sb.append(prefix);
sb.append(".event_channel=" + eventChannelName);
sb.append('\n');
sb.append(prefix);
sb.append(".name_context=");
sb.append(namingContext);
sb.append('\n');
sb.append(prefix);
sb.append(".threshold=");
sb.append(logLevel.toString());
sb.append('\n');
sb.append(prefix);
sb.append(".layout=org.apache.log4j.PatternLayout\n");
sb.append(prefix);
sb.append(".layout.ConversionPattern=%c:%L - %m\n");
sb.append(createEndTag(eventChannelName));
sb.append('\n');
return sb.toString();
}
/**
* Creates a unique comment tag which precedes the IDE's changes to a logging configuration
* @param eventChannelName
* @return
*/
public static String createStartTag(String eventChannelName) {
return "### BEGIN IDE_" + eventChannelName;
}
/**
* Creates a unique comment tag which follows the IDE's changes to a logging configuration
* @param eventChannelName
* @return
*/
public static String createEndTag(String eventChannelName) {
return "### END IDE_" + eventChannelName;
}
}