summaryrefslogtreecommitdiff
path: root/src/main/cpp/timebasedrollingpolicy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/cpp/timebasedrollingpolicy.cpp')
-rw-r--r--src/main/cpp/timebasedrollingpolicy.cpp193
1 files changed, 193 insertions, 0 deletions
diff --git a/src/main/cpp/timebasedrollingpolicy.cpp b/src/main/cpp/timebasedrollingpolicy.cpp
new file mode 100644
index 0000000..5214a31
--- /dev/null
+++ b/src/main/cpp/timebasedrollingpolicy.cpp
@@ -0,0 +1,193 @@
+/*
+ * 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;
+}