/*
* Copyright 2014, The Sporting Exchange Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.betfair.cougar.logging.handlers;
import org.apache.log4j.*;
import java.io.IOException;
/**
* Log4j implementation of an abstract log handler. delegates to an underlying DailyRollingFileAppender
* on the rollover schedule supplied
*/
public class Log4JLogHandler extends AbstractLogHandler {
private Appender appender;
public enum RolloverPolicy {
MINUTE("'.'yyyy-MM-dd-HH-mm"), HOUR("'.'yyyy-MM-dd-HH"), DAY("'.'yyyy-MM-dd"), MONTH("'.'yyyy-MM");
private String log4jDatePattern;
RolloverPolicy(String log4jDatePattern) {
this.log4jDatePattern = log4jDatePattern;
}
public String getLog4jDatePattern() {
return log4jDatePattern;
}
}
private static final String DEFAULT_LOG_PATTERN = "%m%n";
private Layout layout;
private final String fileName;
private final boolean append;
private final boolean flush;
private final RolloverPolicy policy;
private final String logPattern;
public Log4JLogHandler(String fileName, boolean flush, boolean append, RolloverPolicy policy, String logPattern, boolean abstractHandler) throws IOException {
super(abstractHandler);
this.fileName = fileName;
this.append = append;
this.policy = policy;
this.flush = flush;
this.logPattern = logPattern;
if (!abstractHandler) {
//Create a new appender for this concrete implementation
this.appender = new DailyRollingFileAppender(getLayout(), fileName, policy.getLog4jDatePattern());
}
}
public Log4JLogHandler(String fileName, boolean flush, boolean append, String policyStr, boolean abstractHandler) throws IOException {
this(fileName, flush, append, RolloverPolicy.valueOf(policyStr), DEFAULT_LOG_PATTERN, abstractHandler);
}
public Log4JLogHandler(String fileName, boolean flush, boolean append, RolloverPolicy policy, boolean abstractHandler) throws IOException {
this(fileName, flush, append, policy, DEFAULT_LOG_PATTERN, abstractHandler);
}
public Log4JLogHandler(String fileName, boolean flush, boolean append, String policyStr, String logPattern, boolean abstractHandler) throws IOException {
this(fileName, flush, append, RolloverPolicy.valueOf(policyStr), logPattern, abstractHandler);
}
private Layout getLayout() {
if (layout == null) {
layout = new PatternLayout(logPattern);
}
return layout;
}
@Override
protected AbstractLogHandler cloneHandlerToName(String logName, String serviceName, String namespace) throws IOException {
String substitutedName = fileName.replace("##NAMESPACE##", namespace == null ? "" : "-"+namespace);
substitutedName = substitutedName.replace("##NAME##", serviceName);
//Note that this clone takes the logging properties from the parent - eg the abstract logger
Log4JLogHandler eventLogHandler = new Log4JLogHandler(substitutedName, flush, append, policy, false);
eventLogHandler.associateAppenderWithLogger(logName);
return eventLogHandler;
}
public void setLayout(Layout layout) {
this.layout = layout;
}
public Appender getAppender() {
return appender;
}
public void associateAppenderWithLogger(String logName) {
Logger logger = Logger.getLogger(logName);
logger.addAppender(appender);
logger.setAdditivity(false);
}
}