blob: 5214a31908d4975e4922bb6a64ba94d1c8e6e665 [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.
*/
#if defined(_MSC_VER)
#pragma warning ( disable: 4231 4251 4275 4786 )
#endif
#include <log4cxx/logstring.h>
#include <log4cxx/rolling/timebasedrollingpolicy.h>
#include <log4cxx/pattern/filedatepatternconverter.h>
#include <log4cxx/helpers/date.h>
#include <log4cxx/rolling/filerenameaction.h>
#include <log4cxx/helpers/loglog.h>
#include <log4cxx/helpers/exception.h>
#include <log4cxx/rolling/gzcompressaction.h>
#include <log4cxx/rolling/zipcompressaction.h>
#ifndef INT64_C
#define INT64_C(x) x ## LL
#endif
#include <apr_time.h>
using namespace log4cxx;
using namespace log4cxx::rolling;
using namespace log4cxx::helpers;
using namespace log4cxx::pattern;
IMPLEMENT_LOG4CXX_OBJECT(TimeBasedRollingPolicy)
TimeBasedRollingPolicy::TimeBasedRollingPolicy() {
}
void TimeBasedRollingPolicy::addRef() const {
TriggeringPolicy::addRef();
}
void TimeBasedRollingPolicy::releaseRef() const {
TriggeringPolicy::releaseRef();
}
void TimeBasedRollingPolicy::activateOptions(log4cxx::helpers::Pool& pool) {
// find out period from the filename pattern
if (getFileNamePattern().length() > 0) {
parseFileNamePattern();
} else {
LogLog::warn(
LOG4CXX_STR("The FileNamePattern option must be set before using TimeBasedRollingPolicy. "));
throw IllegalStateException();
}
PatternConverterPtr dtc(getDatePatternConverter());
if (dtc == NULL) {
throw IllegalStateException();
}
apr_time_t n = apr_time_now();
LogString buf;
ObjectPtr obj(new Date(n));
formatFileName(obj, buf, pool);
lastFileName = buf;
suffixLength = 0;
if (lastFileName.length() >= 3) {
if (lastFileName.compare(lastFileName.length() - 3, 3, LOG4CXX_STR(".gz")) == 0) {
suffixLength = 3;
} else if (lastFileName.length() >= 4 && lastFileName.compare(lastFileName.length() - 4, 4, LOG4CXX_STR(".zip")) == 0) {
suffixLength = 4;
}
}
}
#define RULES_PUT(spec, cls) \
specs.insert(PatternMap::value_type(LogString(LOG4CXX_STR(spec)), (PatternConstructor) cls ::newInstance))
log4cxx::pattern::PatternMap TimeBasedRollingPolicy::getFormatSpecifiers() const {
PatternMap specs;
RULES_PUT("d", FileDatePatternConverter);
RULES_PUT("date", FileDatePatternConverter);
return specs;
}
/**
* {@inheritDoc}
*/
RolloverDescriptionPtr TimeBasedRollingPolicy::initialize(
const LogString& currentActiveFile,
const bool append,
Pool& pool) {
apr_time_t n = apr_time_now();
nextCheck = ((n / APR_USEC_PER_SEC) + 1) * APR_USEC_PER_SEC;
LogString buf;
ObjectPtr obj(new Date(n));
formatFileName(obj, buf, pool);
lastFileName = buf;
ActionPtr noAction;
if (currentActiveFile.length() > 0) {
return new RolloverDescription(
currentActiveFile, append, noAction, noAction);
} else {
return new RolloverDescription(
lastFileName.substr(0, lastFileName.length() - suffixLength), append,
noAction, noAction);
}
}
RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
const LogString& currentActiveFile,
Pool& pool) {
apr_time_t n = apr_time_now();
nextCheck = ((n / APR_USEC_PER_SEC) + 1) * APR_USEC_PER_SEC;
LogString buf;
ObjectPtr obj(new Date(n));
formatFileName(obj, buf, pool);
LogString newFileName(buf);
//
// if file names haven't changed, no rollover
//
if (newFileName == lastFileName) {
RolloverDescriptionPtr desc;
return desc;
}
ActionPtr renameAction;
ActionPtr compressAction;
LogString lastBaseName(
lastFileName.substr(0, lastFileName.length() - suffixLength));
LogString nextActiveFile(
newFileName.substr(0, newFileName.length() - suffixLength));
//
// if currentActiveFile is not lastBaseName then
// active file name is not following file pattern
// and requires a rename plus maintaining the same name
if (currentActiveFile != lastBaseName) {
renameAction =
new FileRenameAction(
File().setPath(currentActiveFile), File().setPath(lastBaseName), true);
nextActiveFile = currentActiveFile;
}
if (suffixLength == 3) {
compressAction =
new GZCompressAction(
File().setPath(lastBaseName), File().setPath(lastFileName), true);
}
if (suffixLength == 4) {
compressAction =
new ZipCompressAction(
File().setPath(lastBaseName), File().setPath(lastFileName), true);
}
lastFileName = newFileName;
return new RolloverDescription(
nextActiveFile, false, renameAction, compressAction);
}
bool TimeBasedRollingPolicy::isTriggeringEvent(
Appender* /* appender */,
const log4cxx::spi::LoggingEventPtr& /* event */,
const LogString& /* filename */,
size_t /* fileLength */) {
return apr_time_now() > nextCheck;
}