package org.apache.logging.log4j.core;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.config.ReliabilityStrategy;
import org.apache.logging.log4j.core.filter.CompositeFilter;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.util.Strings;
import org.apache.logging.log4j.util.Supplier;
public class Logger extends AbstractLogger implements Supplier<LoggerConfig> {
private static final long serialVersionUID = 1L;
protected volatile PrivateConfig privateConfig;
private final LoggerContext context;
protected Logger(final LoggerContext context, final String name, final MessageFactory messageFactory) {
super(name, messageFactory);
this.context = context;
privateConfig = new PrivateConfig(context.getConfiguration(), this);
}
protected Object writeReplace() throws ObjectStreamException {
return new LoggerProxy(getName(), getMessageFactory());
}
public Logger getParent() {
final LoggerConfig lc = privateConfig.loggerConfig.getName().equals(getName()) ? privateConfig.loggerConfig
.getParent() : privateConfig.loggerConfig;
if (lc == null) {
return null;
}
final String lcName = lc.getName();
final MessageFactory messageFactory = getMessageFactory();
if (context.hasLogger(lcName, messageFactory)) {
return context.getLogger(lcName, messageFactory);
}
return new Logger(context, lcName, messageFactory);
}
public LoggerContext getContext() {
return context;
}
public synchronized void setLevel(final Level level) {
if (level == getLevel()) {
return;
}
Level actualLevel;
if (level != null) {
actualLevel = level;
} else {
final Logger parent = getParent();
actualLevel = parent != null ? parent.getLevel() : privateConfig.loggerConfigLevel;
}
privateConfig = new PrivateConfig(privateConfig, actualLevel);
}
@Override
public LoggerConfig get() {
return privateConfig.loggerConfig;
}
@Override
public void logMessage(final String fqcn, final Level level, final Marker marker, final Message message,
final Throwable t) {
final Message msg = message == null ? new SimpleMessage(Strings.EMPTY) : message;
final ReliabilityStrategy strategy = privateConfig.loggerConfig.getReliabilityStrategy();
strategy.log(this, getName(), fqcn, marker, level, msg, t);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Throwable t) {
return privateConfig.filter(level, marker, message, t);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message) {
return privateConfig.filter(level, marker, message);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object... params) {
return privateConfig.filter(level, marker, message, params);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0) {
return privateConfig.filter(level, marker, message, p0);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1) {
return privateConfig.filter(level, marker, message, p0, p1);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1, final Object p2) {
return privateConfig.filter(level, marker, message, p0, p1, p2);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1, final Object p2, final Object p3) {
return privateConfig.filter(level, marker, message, p0, p1, p2, p3);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4) {
return privateConfig.filter(level, marker, message, p0, p1, p2, p3, p4);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5) {
return privateConfig.filter(level, marker, message, p0, p1, p2, p3, p4, p5);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5, final Object p6) {
return privateConfig.filter(level, marker, message, p0, p1, p2, p3, p4, p5, p6);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5, final Object p6,
final Object p7) {
return privateConfig.filter(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5, final Object p6,
final Object p7, final Object p8) {
return privateConfig.filter(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5, final Object p6,
final Object p7, final Object p8, final Object p9) {
return privateConfig.filter(level, marker, message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final CharSequence message, final Throwable t) {
return privateConfig.filter(level, marker, message, t);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final Object message, final Throwable t) {
return privateConfig.filter(level, marker, message, t);
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final Message message, final Throwable t) {
return privateConfig.filter(level, marker, message, t);
}
public void addAppender(final Appender appender) {
privateConfig.config.addLoggerAppender(this, appender);
}
public void removeAppender(final Appender appender) {
privateConfig.loggerConfig.removeAppender(appender.getName());
}
public Map<String, Appender> getAppenders() {
return privateConfig.loggerConfig.getAppenders();
}
public Iterator<Filter> getFilters() {
final Filter filter = privateConfig.loggerConfig.getFilter();
if (filter == null) {
return new ArrayList<Filter>().iterator();
} else if (filter instanceof CompositeFilter) {
return ((CompositeFilter) filter).iterator();
} else {
final List<Filter> filters = new ArrayList<>();
filters.add(filter);
return filters.iterator();
}
}
@Override
public Level getLevel() {
return privateConfig.loggerConfigLevel;
}
public int filterCount() {
final Filter filter = privateConfig.loggerConfig.getFilter();
if (filter == null) {
return 0;
} else if (filter instanceof CompositeFilter) {
return ((CompositeFilter) filter).size();
}
return 1;
}
public void addFilter(final Filter filter) {
privateConfig.config.addLoggerFilter(this, filter);
}
public boolean isAdditive() {
return privateConfig.loggerConfig.isAdditive();
}
public void setAdditive(final boolean additive) {
privateConfig.config.setLoggerAdditive(this, additive);
}
protected void updateConfiguration(final Configuration newConfig) {
this.privateConfig = new PrivateConfig(newConfig, this);
}
protected class PrivateConfig {
public final LoggerConfig loggerConfig;
public final Configuration config;
private final Level loggerConfigLevel;
private final int intLevel;
private final Logger logger;
public PrivateConfig(final Configuration config, final Logger logger) {
this.config = config;
this.loggerConfig = config.getLoggerConfig(getName());
this.loggerConfigLevel = this.loggerConfig.getLevel();
this.intLevel = this.loggerConfigLevel.intLevel();
this.logger = logger;
}
public PrivateConfig(final PrivateConfig pc, final Level level) {
this.config = pc.config;
this.loggerConfig = pc.loggerConfig;
this.loggerConfigLevel = level;
this.intLevel = this.loggerConfigLevel.intLevel();
this.logger = pc.logger;
}
public PrivateConfig(final PrivateConfig pc, final LoggerConfig lc) {
this.config = pc.config;
this.loggerConfig = lc;
this.loggerConfigLevel = lc.getLevel();
this.intLevel = this.loggerConfigLevel.intLevel();
this.logger = pc.logger;
}
public void logEvent(final LogEvent event) {
loggerConfig.log(event);
}
boolean filter(final Level level, final Marker marker, final String msg) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Throwable t) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, (Object) msg, t);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object... p1) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p1);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1, final Object p2) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1, p2);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1, final Object p2, final Object p3) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1, p2, p3);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1, p2, p3, p4);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5, final Object p6) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5, p6);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5, final Object p6,
final Object p7) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5, final Object p6,
final Object p7, final Object p8) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final String msg, final Object p0,
final Object p1, final Object p2, final Object p3,
final Object p4, final Object p5, final Object p6,
final Object p7, final Object p8, final Object p9) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8,
p9);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final CharSequence msg, final Throwable t) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, t);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final Object msg, final Throwable t) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, t);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
boolean filter(final Level level, final Marker marker, final Message msg, final Throwable t) {
final Filter filter = config.getFilter();
if (filter != null) {
final Filter.Result r = filter.filter(logger, level, marker, msg, t);
if (r != Filter.Result.NEUTRAL) {
return r == Filter.Result.ACCEPT;
}
}
return level != null && intLevel >= level.intLevel();
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("PrivateConfig [loggerConfig=");
builder.append(loggerConfig);
builder.append(", config=");
builder.append(config);
builder.append(", loggerConfigLevel=");
builder.append(loggerConfigLevel);
builder.append(", intLevel=");
builder.append(intLevel);
builder.append(", logger=");
builder.append(logger);
builder.append("]");
return builder.toString();
}
}
protected static class LoggerProxy implements Serializable {
private static final long serialVersionUID = 1L;
private final String name;
private final MessageFactory messageFactory;
public LoggerProxy(final String name, final MessageFactory messageFactory) {
this.name = name;
this.messageFactory = messageFactory;
}
protected Object readResolve() throws ObjectStreamException {
return new Logger(LoggerContext.getContext(), name, messageFactory);
}
}
@Override
public String toString() {
final String nameLevel = Strings.EMPTY + getName() + ':' + getLevel();
if (context == null) {
return nameLevel;
}
final String contextName = context.getName();
return contextName == null ? nameLevel : nameLevel + " in " + contextName;
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final Logger that = (Logger) o;
return getName().equals(that.getName());
}
@Override
public int hashCode() {
return getName().hashCode();
}
}