blob: cd278639497ca231e493bfed076b66ebcae1f6bd [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.qpid.server.logging.logback;
import java.io.File;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.RollingPolicyBase;
import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP;
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.rolling.TriggeringPolicy;
import org.apache.qpid.server.configuration.IllegalConfigurationException;
public class AppenderUtils
{
public static void configureRollingFileAppender(FileLoggerSettings fileLoggerSettings,
Context loggerContext,
RollingFileAppender<ILoggingEvent> appender)
{
String fileName = fileLoggerSettings.getFileName();
File file = new File(fileName);
if (file.getParentFile() != null)
{
file.getParentFile().mkdirs();
}
validateLogFilePermissions(file);
validateMaxFileSize(fileLoggerSettings.getMaxFileSize());
appender.setFile(fileName);
appender.setAppend(true);
appender.setContext(loggerContext);
TriggeringPolicy triggeringPolicy;
RollingPolicyBase rollingPolicy;
final String maxFileSizeAsString = String.valueOf(fileLoggerSettings.getMaxFileSize()) + "MB";
if(fileLoggerSettings.isRollDaily())
{
DailyTriggeringPolicy dailyTriggeringPolicy = new DailyTriggeringPolicy(fileLoggerSettings.isRollOnRestart(), maxFileSizeAsString);
dailyTriggeringPolicy.setContext(loggerContext);
TimeBasedRollingPolicy<ILoggingEvent> timeBasedRollingPolicy = new TimeBasedRollingPolicy<>();
timeBasedRollingPolicy.setMaxHistory(fileLoggerSettings.getMaxHistory());
timeBasedRollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(dailyTriggeringPolicy);
timeBasedRollingPolicy.setFileNamePattern(fileName + ".%d{yyyy-MM-dd}.%i" + (fileLoggerSettings.isCompressOldFiles()
? ".gz"
: ""));
rollingPolicy = timeBasedRollingPolicy;
triggeringPolicy = dailyTriggeringPolicy;
}
else
{
SizeTriggeringPolicy sizeTriggeringPolicy = new SizeTriggeringPolicy(fileLoggerSettings.isRollOnRestart(), maxFileSizeAsString);
sizeTriggeringPolicy.setContext(loggerContext);
SimpleRollingPolicy simpleRollingPolicy = new SimpleRollingPolicy(fileLoggerSettings.getMaxHistory());
simpleRollingPolicy.setFileNamePattern(fileName + ".%i" + (fileLoggerSettings.isCompressOldFiles() ? ".gz" : ""));
rollingPolicy = simpleRollingPolicy;
triggeringPolicy = sizeTriggeringPolicy;
}
rollingPolicy.setContext(loggerContext);
RollingPolicyDecorator decorator = new RollingPolicyDecorator(rollingPolicy, fileLoggerSettings.getRolloverListener(), fileLoggerSettings.getExecutorService());
decorator.setParent(appender);
appender.setRollingPolicy(decorator);
appender.setTriggeringPolicy(triggeringPolicy);
decorator.start();
triggeringPolicy.start();
final PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setPattern(fileLoggerSettings.getLayout());
encoder.setContext(loggerContext);
encoder.start();
appender.setEncoder(encoder);
}
static void validateLogFilePermissions(final File file)
{
if ((file.exists() && (!file.isFile() || !file.canWrite())) || !file.getAbsoluteFile().getParentFile().canWrite())
{
throw new IllegalConfigurationException(String.format("Do not have the permissions to log to file '%s'.", file.getAbsolutePath()));
}
}
static void validateMaxFileSize(final int maxFileSize)
{
if (maxFileSize < 1)
{
throw new IllegalConfigurationException(String.format("Maximum file size must be at least 1. Cannot set to %d.", maxFileSize));
}
}
static class DailyTriggeringPolicy extends SizeAndTimeBasedFNATP<ILoggingEvent>
{
private final boolean _rollOnRestart;
private boolean _isFirst = true;
public DailyTriggeringPolicy(boolean isRollOnRestart, String maxFileSize)
{
_rollOnRestart = isRollOnRestart;
setMaxFileSize(maxFileSize);
}
@Override
protected void computeNextCheck()
{
super.computeNextCheck();
if (_rollOnRestart && _isFirst)
{
_isFirst = false;
nextCheck = 0l;
}
}
@Override
public boolean isTriggeringEvent(final File activeFile, final ILoggingEvent event)
{
if (_rollOnRestart && _isFirst)
{
_isFirst = false;
return activeFile.exists() && activeFile.length() != 0l;
}
else
{
return super.isTriggeringEvent(activeFile, event);
}
}
}
static class SizeTriggeringPolicy extends SizeBasedTriggeringPolicy<ILoggingEvent>
{
private final boolean _rollOnRestart;
private boolean _isFirst = true;
public SizeTriggeringPolicy(boolean isRollOnRestart, String maxFileSize)
{
_rollOnRestart = isRollOnRestart;
setMaxFileSize(maxFileSize);
}
@Override
public boolean isTriggeringEvent(final File activeFile, final ILoggingEvent event)
{
if (_rollOnRestart && _isFirst)
{
_isFirst = false;
return activeFile.exists() && activeFile.length() != 0l;
}
else
{
return super.isTriggeringEvent(activeFile, event);
}
}
}
static class SimpleRollingPolicy extends FixedWindowRollingPolicy
{
private int _maxFiles;
public SimpleRollingPolicy(int maxHistory)
{
_maxFiles = maxHistory;
setMaxIndex(maxHistory);
setMinIndex(1);
}
@Override
protected int getMaxWindowSize()
{
return _maxFiles;
}
}
}