//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.core.logging.builders;
import java.util.Arrays;
import java.util.List;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.encoder.Encoder;
import ch.qos.logback.core.filter.Filter;
/**
* Common basic implementation for {@link uk.gov.dstl.baleen.core.logging.builders.BaleenLoggerBuilder}.
*
*
*
*/
public abstract class AbstractBaleenLoggerBuilder implements BaleenLoggerBuilder {
private final String name;
private final List<Filter<ILoggingEvent>> filters;
private final String pattern;
/**
* Creates a new instance of AbstractBaleenLoggerBuilder.
*
* @param name The name of the logger
* @param pattern The pattern to use when logging
* @param filters A list of filters to be applied to logging events
*/
protected AbstractBaleenLoggerBuilder(String name, String pattern, List<Filter<ILoggingEvent>> filters) {
this.name = name;
this.pattern = pattern;
this.filters = filters;
}
/**
* Creates a new instance of AbstractBaleenLoggerBuilder.
*
* @param name The name of the logger
* @param pattern The pattern to use when logging
* @param filter A filter to be applied to logging events
*/
protected AbstractBaleenLoggerBuilder(String name, String pattern, Filter<ILoggingEvent> filter) {
this(name, pattern, Arrays.asList(filter));
}
/**
* Returns the name of the current logger
*
* @return The name of the logger
*/
@Override
public String getName() {
return name;
}
/**
* Returns the logging pattern being used by the current logger
*
* @return The logging pattern
*/
@Override
public String getPattern() {
return pattern;
}
/**
* Internal function to create a new appender, which is then called by {@link #build(LoggerContext, Encoder)}.
* Child classes should implement this in order to create and configure their specific appender.
*
* @param context The logger context
* @param encoder The encoder to use (if that is possible for the specific appender)
* @return The new appender
*/
protected abstract Appender<ILoggingEvent> createAppender(LoggerContext context, Encoder<ILoggingEvent> encoder);
/**
* Build a new appender for the specified context and encoder (where required).
*
* @param context The logger context
* @param encoder The encoder to use (if that is possible for the specific appender)
* @return The new appender
*/
@Override
public final Appender<ILoggingEvent> build(LoggerContext context, Encoder<ILoggingEvent> encoder) {
Appender<ILoggingEvent> appender = createAppender(context, encoder);
appender.setName(name);
appender.setContext(context);
if (filters != null) {
filters.forEach(f -> appender.addFilter(f));
}
return appender;
}
}