package org.apache.logging.log4j.simple;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.spi.ExtendedLogger;
import org.apache.logging.log4j.spi.LoggerContext;
import org.apache.logging.log4j.spi.LoggerRegistry;
import org.apache.logging.log4j.util.PropertiesUtil;
public class SimpleLoggerContext implements LoggerContext {
private static final String SYSTEM_OUT = "system.out";
private static final String SYSTEM_ERR = "system.err";
protected static final String DEFAULT_DATE_TIME_FORMAT = "yyyy/MM/dd HH:mm:ss:SSS zzz";
protected static final String SYSTEM_PREFIX = "org.apache.logging.log4j.simplelog.";
private final PropertiesUtil props;
private final boolean showLogName;
private final boolean showShortName;
private final boolean showDateTime;
private final boolean showContextMap;
private final String dateTimeFormat;
private final Level defaultLevel;
private final PrintStream stream;
private final LoggerRegistry<ExtendedLogger> loggerRegistry = new LoggerRegistry<>();
public SimpleLoggerContext() {
props = new PropertiesUtil("log4j2.simplelog.properties");
showContextMap = props.getBooleanProperty(SYSTEM_PREFIX + "showContextMap", false);
showLogName = props.getBooleanProperty(SYSTEM_PREFIX + "showlogname", false);
showShortName = props.getBooleanProperty(SYSTEM_PREFIX + "showShortLogname", true);
showDateTime = props.getBooleanProperty(SYSTEM_PREFIX + "showdatetime", false);
final String lvl = props.getStringProperty(SYSTEM_PREFIX + "level");
defaultLevel = Level.toLevel(lvl, Level.ERROR);
dateTimeFormat = showDateTime ? props.getStringProperty(SimpleLoggerContext.SYSTEM_PREFIX + "dateTimeFormat",
DEFAULT_DATE_TIME_FORMAT) : null;
final String fileName = props.getStringProperty(SYSTEM_PREFIX + "logFile", SYSTEM_ERR);
PrintStream ps;
if (SYSTEM_ERR.equalsIgnoreCase(fileName)) {
ps = System.err;
} else if (SYSTEM_OUT.equalsIgnoreCase(fileName)) {
ps = System.out;
} else {
try {
final FileOutputStream os = new FileOutputStream(fileName);
ps = new PrintStream(os);
} catch (final FileNotFoundException fnfe) {
ps = System.err;
}
}
this.stream = ps;
}
@Override
public ExtendedLogger getLogger(final String name) {
return getLogger(name, null);
}
@Override
public ExtendedLogger getLogger(final String name, final MessageFactory messageFactory) {
final ExtendedLogger extendedLogger = loggerRegistry.getLogger(name, messageFactory);
if (extendedLogger != null) {
AbstractLogger.checkMessageFactory(extendedLogger, messageFactory);
return extendedLogger;
}
final SimpleLogger simpleLogger = new SimpleLogger(name, defaultLevel, showLogName, showShortName, showDateTime,
showContextMap, dateTimeFormat, messageFactory, props, stream);
loggerRegistry.putIfAbsent(name, messageFactory, simpleLogger);
return loggerRegistry.getLogger(name, messageFactory);
}
@Override
public boolean hasLogger(final String name) {
return false;
}
@Override
public boolean hasLogger(final String name, final MessageFactory messageFactory) {
return false;
}
@Override
public boolean hasLogger(final String name, final Class<? extends MessageFactory> messageFactoryClass) {
return false;
}
@Override
public Object getExternalContext() {
return null;
}
}