You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rm...@apache.org on 2022/10/18 02:11:30 UTC

[logging-log4cxx] branch LOGCXX-518 created (now f4efd85d)

This is an automated email from the ASF dual-hosted git repository.

rmiddleton pushed a change to branch LOGCXX-518
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


      at f4efd85d Broke out the multiprocess part of the rollingfileappender into a separate class

This branch includes the following new commits:

     new 637b6b6d Made the TimeBasedRollingPolicy ABI stable
     new 6f07ca33 Made OutputStreamWriter ABI stable
     new f4efd85d Broke out the multiprocess part of the rollingfileappender into a separate class

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[logging-log4cxx] 02/03: Made OutputStreamWriter ABI stable

Posted by rm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rmiddleton pushed a commit to branch LOGCXX-518
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit 6f07ca3328d48a8b0663dc532cdb9d312509e041
Author: Robert Middleton <ro...@rm5248.com>
AuthorDate: Sun Oct 16 11:03:15 2022 -0400

    Made OutputStreamWriter ABI stable
---
 src/main/cpp/outputstreamwriter.cpp                | 36 ++++++++++++++++------
 .../include/log4cxx/helpers/outputstreamwriter.h   | 10 ++----
 2 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/src/main/cpp/outputstreamwriter.cpp b/src/main/cpp/outputstreamwriter.cpp
index 35d7f383..703f31f8 100644
--- a/src/main/cpp/outputstreamwriter.cpp
+++ b/src/main/cpp/outputstreamwriter.cpp
@@ -27,8 +27,19 @@ using namespace log4cxx::helpers;
 
 IMPLEMENT_LOG4CXX_OBJECT(OutputStreamWriter)
 
+struct OutputStreamWriter::OutputStreamWriterPrivate{
+	OutputStreamWriterPrivate(OutputStreamPtr& out1) : out(out1), enc(CharsetEncoder::getDefaultEncoder()){}
+
+	OutputStreamWriterPrivate(OutputStreamPtr& out1,
+							  CharsetEncoderPtr& enc1)
+		: out(out1), enc(enc1){}
+
+	OutputStreamPtr out;
+	CharsetEncoderPtr enc;
+};
+
 OutputStreamWriter::OutputStreamWriter(OutputStreamPtr& out1)
-	: out(out1), enc(CharsetEncoder::getDefaultEncoder())
+	: m_priv(std::make_unique<OutputStreamWriterPrivate>(out1))
 {
 	if (out1 == 0)
 	{
@@ -38,7 +49,7 @@ OutputStreamWriter::OutputStreamWriter(OutputStreamPtr& out1)
 
 OutputStreamWriter::OutputStreamWriter(OutputStreamPtr& out1,
 	CharsetEncoderPtr& enc1)
-	: out(out1), enc(enc1)
+	: m_priv(std::make_unique<OutputStreamWriterPrivate>(out1, enc1))
 {
 	if (out1 == 0)
 	{
@@ -57,12 +68,12 @@ OutputStreamWriter::~OutputStreamWriter()
 
 void OutputStreamWriter::close(Pool& p)
 {
-	out->close(p);
+	m_priv->out->close(p);
 }
 
 void OutputStreamWriter::flush(Pool& p)
 {
-	out->flush(p);
+	m_priv->out->flush(p);
 }
 
 void OutputStreamWriter::write(const LogString& str, Pool& p)
@@ -78,24 +89,29 @@ void OutputStreamWriter::write(const LogString& str, Pool& p)
 		char rawbuf[BUFSIZE];
 		ByteBuffer buf(rawbuf, (size_t) BUFSIZE);
 #endif
-		enc->reset();
+		m_priv->enc->reset();
 		LogString::const_iterator iter = str.begin();
 
 		while (iter != str.end())
 		{
-			CharsetEncoder::encode(enc, str, iter, buf);
+			CharsetEncoder::encode(m_priv->enc, str, iter, buf);
 			buf.flip();
-			out->write(buf, p);
+			m_priv->out->write(buf, p);
 			buf.clear();
 		}
 
-		CharsetEncoder::encode(enc, str, iter, buf);
-		enc->flush(buf);
+		CharsetEncoder::encode(m_priv->enc, str, iter, buf);
+		m_priv->enc->flush(buf);
 		buf.flip();
-		out->write(buf, p);
+		m_priv->out->write(buf, p);
 #ifdef LOG4CXX_MULTI_PROCESS
 		delete []rawbuf;
 #endif
 	}
 }
 
+OutputStreamPtr OutputStreamWriter::getOutPutStreamPtr() const
+{
+	return m_priv->out;
+}
+
diff --git a/src/main/include/log4cxx/helpers/outputstreamwriter.h b/src/main/include/log4cxx/helpers/outputstreamwriter.h
index ee153b16..b3086f5f 100644
--- a/src/main/include/log4cxx/helpers/outputstreamwriter.h
+++ b/src/main/include/log4cxx/helpers/outputstreamwriter.h
@@ -34,8 +34,7 @@ namespace helpers
 class LOG4CXX_EXPORT OutputStreamWriter : public Writer
 {
 	private:
-		OutputStreamPtr out;
-		CharsetEncoderPtr enc;
+		LOG4CXX_DECLARE_PRIVATE_MEMBER_PTR(OutputStreamWriterPrivate, m_priv)
 
 	public:
 		DECLARE_ABSTRACT_LOG4CXX_OBJECT(OutputStreamWriter)
@@ -53,12 +52,7 @@ class LOG4CXX_EXPORT OutputStreamWriter : public Writer
 		virtual void write(const LogString& str, Pool& p);
 		LogString getEncoding() const;
 
-#ifdef LOG4CXX_MULTI_PROCESS
-		OutputStreamPtr getOutPutStreamPtr()
-		{
-			return out;
-		}
-#endif
+		OutputStreamPtr getOutPutStreamPtr() const;
 
 	private:
 		OutputStreamWriter(const OutputStreamWriter&);


[logging-log4cxx] 03/03: Broke out the multiprocess part of the rollingfileappender into a separate class

Posted by rm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rmiddleton pushed a commit to branch LOGCXX-518
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit f4efd85deeafed466f8cbecdcc913e37facde146
Author: Robert Middleton <ro...@rm5248.com>
AuthorDate: Sun Oct 16 12:29:35 2022 -0400

    Broke out the multiprocess part of the rollingfileappender into a separate class
---
 src/main/cpp/CMakeLists.txt                        |   1 +
 src/main/cpp/fileoutputstream.cpp                  |   4 +
 ...der.cpp => multiprocessrollingfileappender.cpp} | 120 ++++++------
 src/main/cpp/outputstream.cpp                      |  12 --
 src/main/cpp/outputstreamwriter.cpp                |   3 +-
 src/main/cpp/rollingfileappender.cpp               | 201 --------------------
 src/main/cpp/rollingpolicybase.cpp                 |   5 +-
 src/main/cpp/timebasedrollingpolicy.cpp            | 206 +++++++++++----------
 src/main/cpp/writer.cpp                            |   8 +-
 src/main/cpp/writerappender.cpp                    |   4 +
 .../include/log4cxx/helpers/fileoutputstream.h     |   8 +-
 src/main/include/log4cxx/helpers/outputstream.h    |   7 -
 .../include/log4cxx/helpers/outputstreamwriter.h   |   2 +-
 src/main/include/log4cxx/helpers/writer.h          |   3 -
 ...keleton.h => multiprocessrollingfileappender.h} |  68 +++----
 .../include/log4cxx/rolling/rollingfileappender.h  |  22 ---
 .../include/log4cxx/rolling/rollingpolicybase.h    |  10 +-
 .../log4cxx/rolling/timebasedrollingpolicy.h       |  67 +++----
 src/main/include/log4cxx/writerappender.h          |   8 +-
 19 files changed, 242 insertions(+), 517 deletions(-)

diff --git a/src/main/cpp/CMakeLists.txt b/src/main/cpp/CMakeLists.txt
index 62080106..8837f1da 100644
--- a/src/main/cpp/CMakeLists.txt
+++ b/src/main/cpp/CMakeLists.txt
@@ -128,6 +128,7 @@ target_sources(log4cxx
   messagebuffer.cpp
   messagepatternconverter.cpp
   methodlocationpatternconverter.cpp
+  multiprocessrollingfileappender.cpp
   nameabbreviator.cpp
   namepatternconverter.cpp
   ndc.cpp
diff --git a/src/main/cpp/fileoutputstream.cpp b/src/main/cpp/fileoutputstream.cpp
index a55e6adc..dcfe8384 100644
--- a/src/main/cpp/fileoutputstream.cpp
+++ b/src/main/cpp/fileoutputstream.cpp
@@ -133,3 +133,7 @@ void FileOutputStream::write(ByteBuffer& buf, Pool& /* p */ )
 	}
 }
 
+apr_file_t* FileOutputStream::getFilePtr() const{
+	return m_priv->fileptr;
+}
+
diff --git a/src/main/cpp/rollingfileappender.cpp b/src/main/cpp/multiprocessrollingfileappender.cpp
similarity index 83%
copy from src/main/cpp/rollingfileappender.cpp
copy to src/main/cpp/multiprocessrollingfileappender.cpp
index 03205071..5185ab67 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/multiprocessrollingfileappender.cpp
@@ -19,20 +19,19 @@
 	#pragma warning ( disable: 4231 4251 4275 4786 )
 #endif
 
-#ifdef LOG4CXX_MULTI_PROCESS
-	#include <apr_portable.h>
-	#include <libgen.h>
-	#include <apr_file_io.h>
-	#include <apr_atomic.h>
-	#include <apr_mmap.h>
-	#ifndef MAX_FILE_LEN
-		#define MAX_FILE_LEN 2048
-	#endif
-	#include <log4cxx/pattern/filedatepatternconverter.h>
-	#include <log4cxx/helpers/date.h>
+
+#include <apr_portable.h>
+#include <libgen.h>
+#include <apr_file_io.h>
+#include <apr_atomic.h>
+#include <apr_mmap.h>
+#ifndef MAX_FILE_LEN
+	#define MAX_FILE_LEN 2048
 #endif
+#include <log4cxx/pattern/filedatepatternconverter.h>
+#include <log4cxx/helpers/date.h>
 
-#include <log4cxx/rolling/rollingfileappender.h>
+#include <log4cxx/rolling/multiprocessrollingfileappender.h>
 #include <log4cxx/helpers/loglog.h>
 #include <log4cxx/rolling/rolloverdescription.h>
 #include <log4cxx/helpers/fileoutputstream.h>
@@ -48,9 +47,9 @@ using namespace log4cxx::rolling;
 using namespace log4cxx::helpers;
 using namespace log4cxx::spi;
 
-struct RollingFileAppender::RollingFileAppenderPriv : public FileAppenderPriv
+struct MultiprocessRollingFileAppender::MultiprocessRollingFileAppenderPriv : public FileAppenderPriv
 {
-	RollingFileAppenderPriv() :
+	MultiprocessRollingFileAppenderPriv() :
 		FileAppenderPriv(),
 		fileLength(0) {}
 
@@ -75,23 +74,23 @@ struct RollingFileAppender::RollingFileAppenderPriv : public FileAppenderPriv
 	spi::LoggingEventPtr _event;
 };
 
-#define _priv static_cast<RollingFileAppenderPriv*>(m_priv.get())
+#define _priv static_cast<MultiprocessRollingFileAppenderPriv*>(m_priv.get())
 
-IMPLEMENT_LOG4CXX_OBJECT(RollingFileAppender)
+IMPLEMENT_LOG4CXX_OBJECT(MultiprocessRollingFileAppender)
 
 
 /**
  * Construct a new instance.
  */
-RollingFileAppender::RollingFileAppender() :
-	FileAppender (std::make_unique<RollingFileAppenderPriv>())
+MultiprocessRollingFileAppender::MultiprocessRollingFileAppender() :
+	FileAppender (std::make_unique<MultiprocessRollingFileAppenderPriv>())
 {
 }
 
 /**
  * Prepare instance of use.
  */
-void RollingFileAppender::activateOptions(Pool& p)
+void MultiprocessRollingFileAppender::activateOptions(Pool& p)
 {
 	if (_priv->rollingPolicy == NULL)
 	{
@@ -174,8 +173,7 @@ void RollingFileAppender::activateOptions(Pool& p)
 	}
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-void RollingFileAppenderSkeleton::releaseFileLock(apr_file_t* lock_file)
+void MultiprocessRollingFileAppender::releaseFileLock(apr_file_t* lock_file)
 {
 	if (lock_file)
 	{
@@ -190,7 +188,7 @@ void RollingFileAppenderSkeleton::releaseFileLock(apr_file_t* lock_file)
 		lock_file = NULL;
 	}
 }
-#endif
+
 /**
    Implements the usual roll over behaviour.
 
@@ -206,13 +204,13 @@ void RollingFileAppenderSkeleton::releaseFileLock(apr_file_t* lock_file)
 
  * @return true if rollover performed.
  */
-bool RollingFileAppender::rollover(Pool& p)
+bool MultiprocessRollingFileAppender::rollover(Pool& p)
 {
 	std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
 	return rolloverInternal(p);
 }
 
-bool RollingFileAppender::rolloverInternal(Pool& p)
+bool MultiprocessRollingFileAppender::rolloverInternal(Pool& p)
 {
 	//
 	//   can't roll without a policy
@@ -221,10 +219,8 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 	{
 
 		{
-
-#ifdef LOG4CXX_MULTI_PROCESS
 			std::string fileName(getFile());
-			RollingPolicyBase* basePolicy = dynamic_cast<RollingPolicyBase* >(&(*rollingPolicy));
+			RollingPolicyBasePtr basePolicy = log4cxx::cast<RollingPolicyBase>(_priv->rollingPolicy);
 			apr_time_t n = apr_time_now();
 			ObjectPtr obj = std::make_shared<Date>(n);
 			LogString fileNamePattern;
@@ -246,7 +242,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 			memcpy(szBaseName, fileName.c_str(), fileName.size() > MAX_FILE_LEN ? MAX_FILE_LEN : fileName.size());
 			apr_uid_t uid;
 			apr_gid_t groupid;
-			apr_status_t stat = apr_uid_current(&uid, &groupid, pool.getAPRPool());
+			apr_status_t stat = apr_uid_current(&uid, &groupid, p.getAPRPool());
 
 			if (stat == APR_SUCCESS)
 			{
@@ -278,9 +274,9 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 				}
 				else
 				{
-					if (_event)
+					if (_priv->_event)
 					{
-						triggeringPolicy->isTriggeringEvent(this, *_event, getFile(), getFileLength());
+						_priv->triggeringPolicy->isTriggeringEvent(this, _priv->_event, getFile(), getFileLength());
 					}
 				}
 			}
@@ -289,7 +285,13 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 			{
 				apr_finfo_t finfo1, finfo2;
 				apr_status_t st1, st2;
-				apr_file_t* _fd = getWriter()->getOutPutStreamPtr()->getFileOutPutStreamPtr().getFilePtr();
+				const WriterPtr writer = getWriter();
+				const FileOutputStreamPtr fos = log4cxx::cast<FileOutputStream>( writer );
+				if( !fos ){
+					LogLog::error( "Can't cast writer to FileOutputStream" );
+					return false;
+				}
+				apr_file_t* _fd = fos->getFilePtr();
 				st1 = apr_file_info_get(&finfo1, APR_FINFO_IDENT, _fd);
 
 				if (st1 != APR_SUCCESS)
@@ -310,7 +312,6 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 
 			if (!bAlreadyRolled)
 			{
-#endif
 
 				try
 				{
@@ -427,9 +428,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 							writeHeader(p);
 						}
 
-#ifdef LOG4CXX_MULTI_PROCESS
 						releaseFileLock(lock_file);
-#endif
 						return true;
 					}
 				}
@@ -441,7 +440,6 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 					_priv->errorHandler->error(exmsg, ex, 0);
 				}
 
-#ifdef LOG4CXX_MULTI_PROCESS
 			}
 			else
 			{
@@ -449,34 +447,31 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 			}
 
 			releaseFileLock(lock_file);
-#endif
 		}
 	}
 
 	return false;
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
 /**
  * re-open current file when its own handler has been renamed
  */
-void RollingFileAppenderSkeleton::reopenLatestFile(Pool& p)
+void MultiprocessRollingFileAppender::reopenLatestFile(Pool& p)
 {
 	closeWriter();
-	OutputStreamPtr os = std::make_shared<FileOutputStream(getFile>(), true);
+	OutputStreamPtr os = std::make_shared<FileOutputStream>(getFile(), true);
 	WriterPtr newWriter(createWriter(os));
 	setFile(getFile());
 	setWriter(newWriter);
-	fileLength = File().setPath(getFile()).length(p);
+	_priv->fileLength = File().setPath(getFile()).length(p);
 	writeHeader(p);
 }
 
-#endif
 
 /**
  * {@inheritDoc}
 */
-void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
+void MultiprocessRollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
 {
 	// The rollover check must precede actual writing. This is the
 	// only correct behavior for time driven triggers.
@@ -503,12 +498,17 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
 		}
 	}
 
-#ifdef LOG4CXX_MULTI_PROCESS
 	//do re-check before every write
 	//
 	apr_finfo_t finfo1, finfo2;
 	apr_status_t st1, st2;
-	apr_file_t* _fd = getWriter()->getOutPutStreamPtr()->getFileOutPutStreamPtr().getFilePtr();
+	const WriterPtr writer = getWriter();
+	const FileOutputStreamPtr fos = log4cxx::cast<FileOutputStream>( writer );
+	if( !fos ){
+		LogLog::error( "Can't cast writer to FileOutputStream" );
+		return;
+	}
+	apr_file_t* _fd = fos->getFilePtr();
 	st1 = apr_file_info_get(&finfo1, APR_FINFO_IDENT, _fd);
 
 	if (st1 != APR_SUCCESS)
@@ -532,8 +532,6 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
 		reopenLatestFile(p);
 	}
 
-#endif
-
 	FileAppender::subAppend(event, p);
 }
 
@@ -541,7 +539,7 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
  * Get rolling policy.
  * @return rolling policy.
  */
-RollingPolicyPtr RollingFileAppender::getRollingPolicy() const
+RollingPolicyPtr MultiprocessRollingFileAppender::getRollingPolicy() const
 {
 	return _priv->rollingPolicy;
 }
@@ -550,7 +548,7 @@ RollingPolicyPtr RollingFileAppender::getRollingPolicy() const
  * Get triggering policy.
  * @return triggering policy.
  */
-TriggeringPolicyPtr RollingFileAppender::getTriggeringPolicy() const
+TriggeringPolicyPtr MultiprocessRollingFileAppender::getTriggeringPolicy() const
 {
 	return _priv->triggeringPolicy;
 }
@@ -559,7 +557,7 @@ TriggeringPolicyPtr RollingFileAppender::getTriggeringPolicy() const
  * Sets the rolling policy.
  * @param policy rolling policy.
  */
-void RollingFileAppender::setRollingPolicy(const RollingPolicyPtr& policy)
+void MultiprocessRollingFileAppender::setRollingPolicy(const RollingPolicyPtr& policy)
 {
 	_priv->rollingPolicy = policy;
 }
@@ -568,7 +566,7 @@ void RollingFileAppender::setRollingPolicy(const RollingPolicyPtr& policy)
  * Set triggering policy.
  * @param policy triggering policy.
  */
-void RollingFileAppender::setTriggeringPolicy(const TriggeringPolicyPtr& policy)
+void MultiprocessRollingFileAppender::setTriggeringPolicy(const TriggeringPolicyPtr& policy)
 {
 	_priv->triggeringPolicy = policy;
 }
@@ -576,7 +574,7 @@ void RollingFileAppender::setTriggeringPolicy(const TriggeringPolicyPtr& policy)
 /**
  * Close appender.  Waits for any asynchronous file compression actions to be completed.
  */
-void RollingFileAppender::close()
+void MultiprocessRollingFileAppender::close()
 {
 	FileAppender::close();
 }
@@ -600,7 +598,7 @@ class CountingOutputStream : public OutputStream
 		/**
 		 * Rolling file appender to inform of stream writes.
 		 */
-		RollingFileAppender* rfa;
+		MultiprocessRollingFileAppender* rfa;
 
 	public:
 		/**
@@ -609,7 +607,7 @@ class CountingOutputStream : public OutputStream
 		 * @param rfa rolling file appender to inform.
 		 */
 		CountingOutputStream(
-			OutputStreamPtr& os1, RollingFileAppender* rfa1) :
+			OutputStreamPtr& os1, MultiprocessRollingFileAppender* rfa1) :
 			os(os1), rfa(rfa1)
 		{
 		}
@@ -640,20 +638,14 @@ class CountingOutputStream : public OutputStream
 
 			if (rfa != 0)
 			{
-#ifndef LOG4CXX_MULTI_PROCESS
-				rfa->incrementFileLength(buf.limit());
-#else
 				rfa->setFileLength(File().setPath(rfa->getFile()).length(p));
-#endif
 			}
 		}
 
-#ifdef LOG4CXX_MULTI_PROCESS
 		OutputStream& getFileOutPutStreamPtr()
 		{
 			return *os;
 		}
-#endif
 };
 }
 }
@@ -667,7 +659,7 @@ class CountingOutputStream : public OutputStream
  @param os output stream, may not be null.
  @return new writer.
  */
-WriterPtr RollingFileAppender::createWriter(OutputStreamPtr& os)
+WriterPtr MultiprocessRollingFileAppender::createWriter(OutputStreamPtr& os)
 {
 	OutputStreamPtr cos = std::make_shared<CountingOutputStream>(os, this);
 	return FileAppender::createWriter(cos);
@@ -677,23 +669,21 @@ WriterPtr RollingFileAppender::createWriter(OutputStreamPtr& os)
  * Get byte length of current active log file.
  * @return byte length of current active log file.
  */
-size_t RollingFileAppender::getFileLength() const
+size_t MultiprocessRollingFileAppender::getFileLength() const
 {
 	return _priv->fileLength;
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-void RollingFileAppender::setFileLength(size_t length)
+void MultiprocessRollingFileAppender::setFileLength(size_t length)
 {
 	_priv->fileLength = length;
 }
-#endif
 
 /**
  * Increments estimated byte length of current active log file.
  * @param increment additional bytes written to log file.
  */
-void RollingFileAppender::incrementFileLength(size_t increment)
+void MultiprocessRollingFileAppender::incrementFileLength(size_t increment)
 {
 	_priv->fileLength += increment;
 }
diff --git a/src/main/cpp/outputstream.cpp b/src/main/cpp/outputstream.cpp
index 2175744d..169823cf 100644
--- a/src/main/cpp/outputstream.cpp
+++ b/src/main/cpp/outputstream.cpp
@@ -31,15 +31,3 @@ OutputStream::OutputStream()
 OutputStream::~OutputStream()
 {
 }
-
-#ifdef LOG4CXX_MULTI_PROCESS
-apr_file_t* OutputStream::getFilePtr()
-{
-	throw std::logic_error("getFilePtr must be implemented in the derived class that you are using");
-}
-
-OutputStream& OutputStream::getFileOutPutStreamPtr()
-{
-	throw std::logic_error("getFileOutPutStreamPtr must be implemented in the derived class that you are using");
-}
-#endif
diff --git a/src/main/cpp/outputstreamwriter.cpp b/src/main/cpp/outputstreamwriter.cpp
index 703f31f8..90d19931 100644
--- a/src/main/cpp/outputstreamwriter.cpp
+++ b/src/main/cpp/outputstreamwriter.cpp
@@ -81,6 +81,7 @@ void OutputStreamWriter::write(const LogString& str, Pool& p)
 	if (str.length() > 0)
 	{
 #ifdef LOG4CXX_MULTI_PROCESS
+		// Why does this need to happen for multiproces??  why??
 		size_t bufSize = str.length() * 2;
 		char* rawbuf = new char[bufSize];
 		ByteBuffer buf(rawbuf, (size_t) bufSize);
@@ -110,7 +111,7 @@ void OutputStreamWriter::write(const LogString& str, Pool& p)
 	}
 }
 
-OutputStreamPtr OutputStreamWriter::getOutPutStreamPtr() const
+OutputStreamPtr OutputStreamWriter::getOutputStreamPtr() const
 {
 	return m_priv->out;
 }
diff --git a/src/main/cpp/rollingfileappender.cpp b/src/main/cpp/rollingfileappender.cpp
index 03205071..a24a8e49 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/rollingfileappender.cpp
@@ -19,19 +19,6 @@
 	#pragma warning ( disable: 4231 4251 4275 4786 )
 #endif
 
-#ifdef LOG4CXX_MULTI_PROCESS
-	#include <apr_portable.h>
-	#include <libgen.h>
-	#include <apr_file_io.h>
-	#include <apr_atomic.h>
-	#include <apr_mmap.h>
-	#ifndef MAX_FILE_LEN
-		#define MAX_FILE_LEN 2048
-	#endif
-	#include <log4cxx/pattern/filedatepatternconverter.h>
-	#include <log4cxx/helpers/date.h>
-#endif
-
 #include <log4cxx/rolling/rollingfileappender.h>
 #include <log4cxx/helpers/loglog.h>
 #include <log4cxx/rolling/rolloverdescription.h>
@@ -174,23 +161,6 @@ void RollingFileAppender::activateOptions(Pool& p)
 	}
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-void RollingFileAppenderSkeleton::releaseFileLock(apr_file_t* lock_file)
-{
-	if (lock_file)
-	{
-		apr_status_t stat = apr_file_unlock(lock_file);
-
-		if (stat != APR_SUCCESS)
-		{
-			LogLog::warn(LOG4CXX_STR("flock: unlock failed"));
-		}
-
-		apr_file_close(lock_file);
-		lock_file = NULL;
-	}
-}
-#endif
 /**
    Implements the usual roll over behaviour.
 
@@ -221,97 +191,6 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 	{
 
 		{
-
-#ifdef LOG4CXX_MULTI_PROCESS
-			std::string fileName(getFile());
-			RollingPolicyBase* basePolicy = dynamic_cast<RollingPolicyBase* >(&(*rollingPolicy));
-			apr_time_t n = apr_time_now();
-			ObjectPtr obj = std::make_shared<Date>(n);
-			LogString fileNamePattern;
-
-			if (basePolicy)
-			{
-				if (basePolicy->getPatternConverterList().size())
-				{
-					(*(basePolicy->getPatternConverterList().begin()))->format(obj, fileNamePattern, p);
-					fileName = std::string(fileNamePattern);
-				}
-			}
-
-			bool bAlreadyRolled = true;
-			char szDirName[MAX_FILE_LEN] = {'\0'};
-			char szBaseName[MAX_FILE_LEN] = {'\0'};
-			char szUid[MAX_FILE_LEN] = {'\0'};
-			memcpy(szDirName, fileName.c_str(), fileName.size() > MAX_FILE_LEN ? MAX_FILE_LEN : fileName.size());
-			memcpy(szBaseName, fileName.c_str(), fileName.size() > MAX_FILE_LEN ? MAX_FILE_LEN : fileName.size());
-			apr_uid_t uid;
-			apr_gid_t groupid;
-			apr_status_t stat = apr_uid_current(&uid, &groupid, pool.getAPRPool());
-
-			if (stat == APR_SUCCESS)
-			{
-				snprintf(szUid, MAX_FILE_LEN, "%u", uid);
-			}
-
-			const std::string lockname = std::string(::dirname(szDirName)) + "/." + ::basename(szBaseName) + szUid + ".lock";
-			apr_file_t* lock_file;
-			stat = apr_file_open(&lock_file, lockname.c_str(), APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, p.getAPRPool());
-
-			if (stat != APR_SUCCESS)
-			{
-				std::string err = "lockfile return error: open lockfile failed. ";
-				err += (strerror(errno));
-				LogLog::warn(LOG4CXX_STR(err.c_str()));
-				bAlreadyRolled = false;
-				lock_file = NULL;
-			}
-			else
-			{
-				stat = apr_file_lock(lock_file, APR_FLOCK_EXCLUSIVE);
-
-				if (stat != APR_SUCCESS)
-				{
-					std::string err = "apr_file_lock: lock failed. ";
-					err += (strerror(errno));
-					LogLog::warn(LOG4CXX_STR(err.c_str()));
-					bAlreadyRolled = false;
-				}
-				else
-				{
-					if (_event)
-					{
-						triggeringPolicy->isTriggeringEvent(this, *_event, getFile(), getFileLength());
-					}
-				}
-			}
-
-			if (bAlreadyRolled)
-			{
-				apr_finfo_t finfo1, finfo2;
-				apr_status_t st1, st2;
-				apr_file_t* _fd = getWriter()->getOutPutStreamPtr()->getFileOutPutStreamPtr().getFilePtr();
-				st1 = apr_file_info_get(&finfo1, APR_FINFO_IDENT, _fd);
-
-				if (st1 != APR_SUCCESS)
-				{
-					LogLog::warn(LOG4CXX_STR("apr_file_info_get failed"));
-				}
-
-				st2 = apr_stat(&finfo2, std::string(getFile()).c_str(), APR_FINFO_IDENT, p.getAPRPool());
-
-				if (st2 != APR_SUCCESS)
-				{
-					LogLog::warn(LOG4CXX_STR("apr_stat failed."));
-				}
-
-				bAlreadyRolled = ((st1 == APR_SUCCESS) && (st2 == APR_SUCCESS)
-						&& ((finfo1.device != finfo2.device) || (finfo1.inode != finfo2.inode)));
-			}
-
-			if (!bAlreadyRolled)
-			{
-#endif
-
 				try
 				{
 					RolloverDescriptionPtr rollover1(_priv->rollingPolicy->rollover(this->getFile(), this->getAppend(), p));
@@ -426,10 +305,6 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 
 							writeHeader(p);
 						}
-
-#ifdef LOG4CXX_MULTI_PROCESS
-						releaseFileLock(lock_file);
-#endif
 						return true;
 					}
 				}
@@ -440,39 +315,12 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 					log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
 					_priv->errorHandler->error(exmsg, ex, 0);
 				}
-
-#ifdef LOG4CXX_MULTI_PROCESS
-			}
-			else
-			{
-				reopenLatestFile(p);
-			}
-
-			releaseFileLock(lock_file);
-#endif
 		}
 	}
 
 	return false;
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-/**
- * re-open current file when its own handler has been renamed
- */
-void RollingFileAppenderSkeleton::reopenLatestFile(Pool& p)
-{
-	closeWriter();
-	OutputStreamPtr os = std::make_shared<FileOutputStream(getFile>(), true);
-	WriterPtr newWriter(createWriter(os));
-	setFile(getFile());
-	setWriter(newWriter);
-	fileLength = File().setPath(getFile()).length(p);
-	writeHeader(p);
-}
-
-#endif
-
 /**
  * {@inheritDoc}
 */
@@ -503,37 +351,6 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
 		}
 	}
 
-#ifdef LOG4CXX_MULTI_PROCESS
-	//do re-check before every write
-	//
-	apr_finfo_t finfo1, finfo2;
-	apr_status_t st1, st2;
-	apr_file_t* _fd = getWriter()->getOutPutStreamPtr()->getFileOutPutStreamPtr().getFilePtr();
-	st1 = apr_file_info_get(&finfo1, APR_FINFO_IDENT, _fd);
-
-	if (st1 != APR_SUCCESS)
-	{
-		LogLog::warn(LOG4CXX_STR("apr_file_info_get failed"));
-	}
-
-	st2 = apr_stat(&finfo2, std::string(getFile()).c_str(), APR_FINFO_IDENT, p.getAPRPool());
-
-	if (st2 != APR_SUCCESS)
-	{
-		std::string err = "apr_stat failed. file:" + std::string(getFile());
-		LogLog::warn(LOG4CXX_STR(err.c_str()));
-	}
-
-	bool bAlreadyRolled = ((st1 == APR_SUCCESS) && (st2 == APR_SUCCESS)
-			&& ((finfo1.device != finfo2.device) || (finfo1.inode != finfo2.inode)));
-
-	if (bAlreadyRolled)
-	{
-		reopenLatestFile(p);
-	}
-
-#endif
-
 	FileAppender::subAppend(event, p);
 }
 
@@ -640,20 +457,9 @@ class CountingOutputStream : public OutputStream
 
 			if (rfa != 0)
 			{
-#ifndef LOG4CXX_MULTI_PROCESS
 				rfa->incrementFileLength(buf.limit());
-#else
-				rfa->setFileLength(File().setPath(rfa->getFile()).length(p));
-#endif
 			}
 		}
-
-#ifdef LOG4CXX_MULTI_PROCESS
-		OutputStream& getFileOutPutStreamPtr()
-		{
-			return *os;
-		}
-#endif
 };
 }
 }
@@ -682,13 +488,6 @@ size_t RollingFileAppender::getFileLength() const
 	return _priv->fileLength;
 }
 
-#ifdef LOG4CXX_MULTI_PROCESS
-void RollingFileAppender::setFileLength(size_t length)
-{
-	_priv->fileLength = length;
-}
-#endif
-
 /**
  * Increments estimated byte length of current active log file.
  * @param increment additional bytes written to log file.
diff --git a/src/main/cpp/rollingpolicybase.cpp b/src/main/cpp/rollingpolicybase.cpp
index 3e409dfd..c22a36a4 100644
--- a/src/main/cpp/rollingpolicybase.cpp
+++ b/src/main/cpp/rollingpolicybase.cpp
@@ -183,4 +183,7 @@ void RollingPolicyBase::setCreateIntermediateDirectories(bool createIntermediate
 	m_priv->createIntermediateDirectories = createIntermediate;
 }
 
-
+PatternConverterList RollingPolicyBase::getPatternConverterList() const
+{
+	return m_priv->patternConverters;
+}
diff --git a/src/main/cpp/timebasedrollingpolicy.cpp b/src/main/cpp/timebasedrollingpolicy.cpp
index eadf2b0c..cf32329d 100644
--- a/src/main/cpp/timebasedrollingpolicy.cpp
+++ b/src/main/cpp/timebasedrollingpolicy.cpp
@@ -18,10 +18,6 @@
 	#pragma warning ( disable: 4231 4251 4275 4786 )
 #endif
 
-#ifdef LOG4CXX_MULTI_PROCESS
-	#include <libgen.h>
-#endif
-
 #include <log4cxx/logstring.h>
 #include <log4cxx/rolling/timebasedrollingpolicy.h>
 #include <log4cxx/pattern/filedatepatternconverter.h>
@@ -31,7 +27,11 @@
 #include <log4cxx/helpers/exception.h>
 #include <log4cxx/rolling/gzcompressaction.h>
 #include <log4cxx/rolling/zipcompressaction.h>
-#include<iostream>
+#include <log4cxx/helpers/stringhelper.h>
+#include <log4cxx/helpers/optionconverter.h>
+#include <log4cxx/fileappender.h>
+#include <iostream>
+#include <libgen.h>
 
 using namespace log4cxx;
 using namespace log4cxx::rolling;
@@ -41,6 +41,13 @@ using namespace log4cxx::pattern;
 IMPLEMENT_LOG4CXX_OBJECT(TimeBasedRollingPolicy)
 
 struct TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
+	TimeBasedRollingPolicyPrivate() :
+		_mmap(nullptr),
+		_file_map(nullptr),
+		_lock_file(nullptr),
+		bAlreadyInitialized(false),
+		bRefreshCurFile(false){}
+
 		/**
 		 * Time for next determination if time for rollover.
 		 */
@@ -59,7 +66,7 @@ struct TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
 		/*
 		 * pool for mmap handler
 		 * */
-		log4cxx::helpers::Pool* _mmapPool;
+		log4cxx::helpers::Pool _mmapPool;
 
 		/**
 		 * mmap file descriptor
@@ -100,9 +107,11 @@ struct TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
 		 * Length of any file type suffix (.gz, .zip).
 		 */
 		int suffixLength;
+
+		bool multiprocess = false;
 };
 
-#ifdef LOG4CXX_MULTI_PROCESS
+
 #define MMAP_FILE_SUFFIX ".map"
 #define LOCK_FILE_SUFFIX ".maplck"
 #define MAX_FILE_LEN 2048
@@ -110,7 +119,7 @@ struct TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
 bool TimeBasedRollingPolicy::isMapFileEmpty(log4cxx::helpers::Pool& pool)
 {
 	apr_finfo_t finfo;
-	apr_status_t st = apr_stat(&finfo, _mapFileName.c_str(), APR_FINFO_SIZE, pool.getAPRPool());
+	apr_status_t st = apr_stat(&finfo, m_priv->_mapFileName.c_str(), APR_FINFO_SIZE, pool.getAPRPool());
 
 	if (st != APR_SUCCESS)
 	{
@@ -129,16 +138,16 @@ void TimeBasedRollingPolicy::initMMapFile(const LogString& lastFileName, log4cxx
 {
 	int iRet = 0;
 
-	if (!_mmap)
+	if (!m_priv->_mmap)
 	{
-		iRet = createMMapFile(std::string(_fileNamePattern), pool);
+		iRet = createMMapFile(std::string(m_priv->_fileNamePattern), pool);
 	}
 
 	if (!iRet && isMapFileEmpty(pool))
 	{
 		lockMMapFile(APR_FLOCK_EXCLUSIVE);
-		memset(_mmap->mm, 0, MAX_FILE_LEN);
-		memcpy(_mmap->mm, std::string(lastFileName).c_str(), std::string(lastFileName).size());
+		memset(m_priv->_mmap->mm, 0, MAX_FILE_LEN);
+		memcpy(m_priv->_mmap->mm, std::string(lastFileName).c_str(), std::string(lastFileName).size());
 		unLockMMapFile();
 	}
 }
@@ -160,40 +169,41 @@ const std::string TimeBasedRollingPolicy::createFile(const std::string& fileName
 		snprintf(szUid, MAX_FILE_LEN, "%u", uid);
 	}
 
+	// TODO this should probably be using boost::filesystem or std::filesystem
 	return std::string(::dirname(szDirName)) + "/." + ::basename(szBaseName) + szUid + suffix;
 }
 
 int TimeBasedRollingPolicy::createMMapFile(const std::string& fileName, log4cxx::helpers::Pool& pool)
 {
-	_mapFileName = createFile(fileName, MMAP_FILE_SUFFIX, pool);
+	m_priv->_mapFileName = createFile(fileName, MMAP_FILE_SUFFIX, pool);
 
-	apr_status_t stat = apr_file_open(&_file_map, _mapFileName.c_str(), APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, _mmapPool->getAPRPool());
+	apr_status_t stat = apr_file_open(&m_priv->_file_map, m_priv->_mapFileName.c_str(), APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, m_priv->_mmapPool.getAPRPool());
 
 	if (stat != APR_SUCCESS)
 	{
-		std::string err(std::string("open mmap file failed. ") + std::string(strerror(errno)) + ". Check the privilege or try to remove " + _mapFileName + " if exist.");
+		std::string err(std::string("open mmap file failed. ") + std::string(strerror(errno)) + ". Check the privilege or try to remove " + m_priv->_mapFileName + " if exist.");
 		LogLog::warn(LOG4CXX_STR(err.c_str()));
 		return -1;
 	}
 
 	if (isMapFileEmpty(pool))
 	{
-		stat = apr_file_trunc(_file_map, MAX_FILE_LEN + 1);
+		stat = apr_file_trunc(m_priv->_file_map, MAX_FILE_LEN + 1);
 
 		if (stat != APR_SUCCESS)
 		{
 			LogLog::warn(LOG4CXX_STR("apr_file_trunc failed."));
-			apr_file_close(_file_map);
+			apr_file_close(m_priv->_file_map);
 			return -1;
 		}
 	}
 
-	stat = apr_mmap_create(&_mmap, _file_map, 0, MAX_FILE_LEN, APR_MMAP_WRITE | APR_MMAP_READ, _mmapPool->getAPRPool());
+	stat = apr_mmap_create(&m_priv->_mmap, m_priv->_file_map, 0, MAX_FILE_LEN, APR_MMAP_WRITE | APR_MMAP_READ, m_priv->_mmapPool.getAPRPool());
 
 	if (stat != APR_SUCCESS)
 	{
 		LogLog::warn(LOG4CXX_STR("mmap failed."));
-		apr_file_close(_file_map);
+		apr_file_close(m_priv->_file_map);
 		return -1;
 	}
 
@@ -202,7 +212,7 @@ int TimeBasedRollingPolicy::createMMapFile(const std::string& fileName, log4cxx:
 
 int TimeBasedRollingPolicy::lockMMapFile(int type)
 {
-	apr_status_t stat = apr_file_lock(_lock_file, type);
+	apr_status_t stat = apr_file_lock(m_priv->_lock_file, type);
 
 	if (stat != APR_SUCCESS)
 	{
@@ -211,7 +221,7 @@ int TimeBasedRollingPolicy::lockMMapFile(int type)
 }
 int TimeBasedRollingPolicy::unLockMMapFile()
 {
-	apr_status_t stat = apr_file_unlock(_lock_file);
+	apr_status_t stat = apr_file_unlock(m_priv->_lock_file);
 
 	if (stat != APR_SUCCESS)
 	{
@@ -219,26 +229,13 @@ int TimeBasedRollingPolicy::unLockMMapFile()
 	}
 }
 
-#endif
-
 TimeBasedRollingPolicy::TimeBasedRollingPolicy() :
 	m_priv(std::make_unique<TimeBasedRollingPolicyPrivate>())
-#ifdef LOG4CXX_MULTI_PROCESS
-	: _mmap(NULL), _file_map(NULL), bAlreadyInitialized(false), _mmapPool(new Pool()), _lock_file(NULL), bRefreshCurFile(false)
-#endif
 {
 }
 
 TimeBasedRollingPolicy::~TimeBasedRollingPolicy(){}
 
-#ifdef LOG4CXX_MULTI_PROCESS
-TimeBasedRollingPolicy::~TimeBasedRollingPolicy()
-{
-	//no-need to delete mmap
-	delete _mmapPool;
-}
-#endif
-
 void TimeBasedRollingPolicy::activateOptions(log4cxx::helpers::Pool& pool)
 {
 	// find out period from the filename pattern
@@ -265,30 +262,29 @@ void TimeBasedRollingPolicy::activateOptions(log4cxx::helpers::Pool& pool)
 	formatFileName(obj, buf, pool);
 	m_priv->lastFileName = buf;
 
-#ifdef LOG4CXX_MULTI_PROCESS
-
-	if (getPatternConverterList().size())
-	{
-		(*(getPatternConverterList().begin()))->format(obj, _fileNamePattern, pool);
-	}
-	else
-	{
-		_fileNamePattern = lastFileName;
-	}
-
-	if (!_lock_file)
-	{
-		const std::string lockname = createFile(std::string(_fileNamePattern), LOCK_FILE_SUFFIX, *_mmapPool);
-		apr_status_t stat = apr_file_open(&_lock_file, lockname.c_str(), APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, (*_mmapPool).getAPRPool());
+	if( m_priv->multiprocess ){
+		if (getPatternConverterList().size())
+		{
+			(*(getPatternConverterList().begin()))->format(obj, m_priv->_fileNamePattern, pool);
+		}
+		else
+		{
+			m_priv->_fileNamePattern = m_priv->lastFileName;
+		}
 
-		if (stat != APR_SUCCESS)
+		if (!m_priv->_lock_file)
 		{
-			LogLog::warn(LOG4CXX_STR("open lock file failed."));
+			const std::string lockname = createFile(std::string(m_priv->_fileNamePattern), LOCK_FILE_SUFFIX, m_priv->_mmapPool);
+			apr_status_t stat = apr_file_open(&m_priv->_lock_file, lockname.c_str(), APR_CREATE | APR_READ | APR_WRITE, APR_OS_DEFAULT, m_priv->_mmapPool.getAPRPool());
+
+			if (stat != APR_SUCCESS)
+			{
+				LogLog::warn(LOG4CXX_STR("open lock file failed."));
+			}
 		}
-	}
 
-	initMMapFile(lastFileName, *_mmapPool);
-#endif
+		initMMapFile(m_priv->lastFileName, m_priv->_mmapPool);
+	}
 
 	m_priv->suffixLength = 0;
 
@@ -367,24 +363,23 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
 
 	LogString newFileName(buf);
 
-#ifdef LOG4CXX_MULTI_PROCESS
-	bAlreadyInitialized = true;
+	if( m_priv->multiprocess ){
+		m_priv->bAlreadyInitialized = true;
 
-	if (_mmap && !isMapFileEmpty(*_mmapPool))
-	{
-		lockMMapFile(APR_FLOCK_SHARED);
-		LogString mapLastFile((char*)_mmap->mm);
-		lastFileName = mapLastFile;
-		unLockMMapFile();
-	}
-	else
-	{
-		_mmap = NULL;
-		initMMapFile(lastFileName, *_mmapPool);
+		if (m_priv->_mmap && !isMapFileEmpty(m_priv->_mmapPool))
+		{
+			lockMMapFile(APR_FLOCK_SHARED);
+			LogString mapLastFile((char*)m_priv->_mmap->mm);
+			m_priv->lastFileName = mapLastFile;
+			unLockMMapFile();
+		}
+		else
+		{
+			m_priv->_mmap = NULL;
+			initMMapFile(m_priv->lastFileName, m_priv->_mmapPool);
+		}
 	}
 
-#endif
-
 	//
 	//  if file names haven't changed, no rollover
 	//
@@ -430,25 +425,23 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
 					File().setPath(lastBaseName), File().setPath(m_priv->lastFileName), true);
 	}
 
-#ifdef LOG4CXX_MULTI_PROCESS
-
-	if (_mmap && !isMapFileEmpty(*_mmapPool))
-	{
-		lockMMapFile(APR_FLOCK_EXCLUSIVE);
-		memset(_mmap->mm, 0, MAX_FILE_LEN);
-		memcpy(_mmap->mm, std::string(newFileName).c_str(), std::string(newFileName).size());
-		unLockMMapFile();
-	}
-	else
-	{
-		_mmap = NULL;
-		initMMapFile(newFileName, *_mmapPool);
+	if( m_priv->multiprocess ){
+		if (m_priv->_mmap && !isMapFileEmpty(m_priv->_mmapPool))
+		{
+			lockMMapFile(APR_FLOCK_EXCLUSIVE);
+			memset(m_priv->_mmap->mm, 0, MAX_FILE_LEN);
+			memcpy(m_priv->_mmap->mm, std::string(newFileName).c_str(), std::string(newFileName).size());
+			unLockMMapFile();
+		}
+		else
+		{
+			m_priv->_mmap = NULL;
+			initMMapFile(newFileName, m_priv->_mmapPool);
+		}
+	}else{
+		m_priv->lastFileName = newFileName;
 	}
 
-#else
-	m_priv->lastFileName = newFileName;
-#endif
-
 	return std::make_shared<RolloverDescription>(nextActiveFile, append, renameAction, compressAction);
 }
 
@@ -458,23 +451,38 @@ bool TimeBasedRollingPolicy::isTriggeringEvent(
 	const LogString&  filename,
 	size_t /* fileLength */)
 {
-#ifdef LOG4CXX_MULTI_PROCESS
-
-	if (bRefreshCurFile && _mmap && !isMapFileEmpty(*_mmapPool))
-	{
-		lockMMapFile(APR_FLOCK_SHARED);
-		LogString mapCurrent((char*)_mmap->mm);
-		unLockMMapFile();
-		LogString mapCurrentBase(mapCurrent.substr(0, mapCurrent.length() - suffixLength));
+	if( m_priv->multiprocess ){
 
-		if (!mapCurrentBase.empty() && mapCurrentBase != filename)
+		if (m_priv->bRefreshCurFile && m_priv->_mmap && !isMapFileEmpty(m_priv->_mmapPool))
 		{
-			dynamic_cast<FileAppender*>(appender)->setFile(mapCurrentBase);
+			lockMMapFile(APR_FLOCK_SHARED);
+			LogString mapCurrent((char*)m_priv->_mmap->mm);
+			unLockMMapFile();
+			LogString mapCurrentBase(mapCurrent.substr(0, mapCurrent.length() - m_priv->suffixLength));
+
+			if (!mapCurrentBase.empty() && mapCurrentBase != filename)
+			{
+				const FileAppender* fappend = reinterpret_cast<const FileAppender*>(appender->cast(FileAppender::getStaticClass()));
+				if( fappend ){
+					const_cast<FileAppender*>(fappend)->setFile(mapCurrentBase);
+				}
+			}
 		}
+
+		return ( Date::currentTime() > m_priv->nextCheck) || (!m_priv->bAlreadyInitialized);
 	}
 
-	return ((apr_time_now()) > nextCheck) || (!bAlreadyInitialized);
-#else
 	return Date::currentTime() > m_priv->nextCheck;
-#endif
+}
+
+void TimeBasedRollingPolicy::setOption(const LogString& option,
+									   const LogString& value){
+	if (StringHelper::equalsIgnoreCase(option,
+			LOG4CXX_STR("MULTIPROCESS"),
+			LOG4CXX_STR("multiprocess")))
+	{
+		m_priv->multiprocess = OptionConverter::toBoolean(value, false);
+	}
+
+	RollingPolicyBase::setOption(option, value);
 }
diff --git a/src/main/cpp/writer.cpp b/src/main/cpp/writer.cpp
index 312aa527..42f197be 100644
--- a/src/main/cpp/writer.cpp
+++ b/src/main/cpp/writer.cpp
@@ -17,6 +17,7 @@
 
 #include <log4cxx/logstring.h>
 #include <log4cxx/helpers/writer.h>
+#include <log4cxx/helpers/loglog.h>
 #include <stdexcept>
 
 using namespace log4cxx::helpers;
@@ -30,10 +31,3 @@ Writer::Writer()
 Writer::~Writer()
 {
 }
-
-#ifdef LOG4CXX_MULTI_PROCESS
-OutputStreamPtr Writer::getOutPutStreamPtr()
-{
-	throw std::logic_error("getOutPutStreamPtr must be implemented in the derived class that you are using");
-}
-#endif
diff --git a/src/main/cpp/writerappender.cpp b/src/main/cpp/writerappender.cpp
index 02fe154a..ada3bd89 100644
--- a/src/main/cpp/writerappender.cpp
+++ b/src/main/cpp/writerappender.cpp
@@ -321,3 +321,7 @@ bool WriterAppender::getImmediateFlush() const
 {
 	return _priv->immediateFlush;
 }
+
+const log4cxx::helpers::WriterPtr WriterAppender::getWriter() const{
+	return _priv->writer;
+}
diff --git a/src/main/include/log4cxx/helpers/fileoutputstream.h b/src/main/include/log4cxx/helpers/fileoutputstream.h
index 322d8a77..baacb2ba 100644
--- a/src/main/include/log4cxx/helpers/fileoutputstream.h
+++ b/src/main/include/log4cxx/helpers/fileoutputstream.h
@@ -52,12 +52,8 @@ class LOG4CXX_EXPORT FileOutputStream : public OutputStream
 		virtual void flush(Pool& p);
 		virtual void write(ByteBuffer& buf, Pool& p);
 
-#ifdef LOG4CXX_MULTI_PROCESS
-		apr_file_t* getFilePtr()
-		{
-			return fileptr;
-		}
-#endif
+		apr_file_t* getFilePtr() const;
+
 	private:
 		FileOutputStream(const FileOutputStream&);
 		FileOutputStream& operator=(const FileOutputStream&);
diff --git a/src/main/include/log4cxx/helpers/outputstream.h b/src/main/include/log4cxx/helpers/outputstream.h
index a72e45f4..d1ec12c6 100644
--- a/src/main/include/log4cxx/helpers/outputstream.h
+++ b/src/main/include/log4cxx/helpers/outputstream.h
@@ -19,9 +19,6 @@
 #define _LOG4CXX_HELPERS_OUTPUTSTREAM_H
 
 #include <log4cxx/helpers/object.h>
-#ifdef LOG4CXX_MULTI_PROCESS
-	#include <apr_file_io.h>
-#endif
 
 namespace log4cxx
 {
@@ -49,10 +46,6 @@ class LOG4CXX_EXPORT OutputStream : public Object
 		virtual void close(Pool& p) = 0;
 		virtual void flush(Pool& p) = 0;
 		virtual void write(ByteBuffer& buf, Pool& p) = 0;
-#ifdef LOG4CXX_MULTI_PROCESS
-		virtual apr_file_t* getFilePtr();
-		virtual OutputStream& getFileOutPutStreamPtr();
-#endif
 
 	private:
 		OutputStream(const OutputStream&);
diff --git a/src/main/include/log4cxx/helpers/outputstreamwriter.h b/src/main/include/log4cxx/helpers/outputstreamwriter.h
index b3086f5f..7f2a196b 100644
--- a/src/main/include/log4cxx/helpers/outputstreamwriter.h
+++ b/src/main/include/log4cxx/helpers/outputstreamwriter.h
@@ -52,7 +52,7 @@ class LOG4CXX_EXPORT OutputStreamWriter : public Writer
 		virtual void write(const LogString& str, Pool& p);
 		LogString getEncoding() const;
 
-		OutputStreamPtr getOutPutStreamPtr() const;
+		OutputStreamPtr getOutputStreamPtr() const;
 
 	private:
 		OutputStreamWriter(const OutputStreamWriter&);
diff --git a/src/main/include/log4cxx/helpers/writer.h b/src/main/include/log4cxx/helpers/writer.h
index a7c054d2..8c95d5d5 100644
--- a/src/main/include/log4cxx/helpers/writer.h
+++ b/src/main/include/log4cxx/helpers/writer.h
@@ -46,9 +46,6 @@ class LOG4CXX_EXPORT Writer : public Object
 		virtual void close(Pool& p) = 0;
 		virtual void flush(Pool& p) = 0;
 		virtual void write(const LogString& str, Pool& p) = 0;
-#ifdef LOG4CXX_MULTI_PROCESS
-		virtual OutputStreamPtr getOutPutStreamPtr();
-#endif
 
 	private:
 		Writer(const Writer&);
diff --git a/src/main/include/log4cxx/rolling/rollingfileappenderskeleton.h b/src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
similarity index 78%
rename from src/main/include/log4cxx/rolling/rollingfileappenderskeleton.h
rename to src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
index 3dfa3951..717b2d5b 100644
--- a/src/main/include/log4cxx/rolling/rollingfileappenderskeleton.h
+++ b/src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
-#if !defined(_LOG4CXX_ROLLING_ROLLING_FILE_APPENDER_SKELETON_H)
-#define _LOG4CXX_ROLLING_ROLLING_FILE_APPENDER_SKELETON_H
+#if !defined(LOG4CXX_ROLLING_MULTIPROCESS_ROLLING_FILE_APPENDER_H)
+#define LOG4CXX_ROLLING_MULTIPROCESS_ROLLING_FILE_APPENDER_H
 
+#include <log4cxx/fileappender.h>
 #include <log4cxx/spi/optionhandler.h>
 #include <log4cxx/fileappender.h>
 #include <log4cxx/rolling/triggeringpolicy.h>
@@ -31,44 +32,20 @@ namespace rolling
 
 
 /**
- *  Base class for log4cxx::rolling::RollingFileAppender and log4cxx::RollingFileAppender
- * (analogues of org.apache.log4j.rolling.RFA from extras companion and
- *  org.apache.log4j.RFA from log4j 1.2, respectively).
- *
- * */
-class LOG4CXX_EXPORT RollingFileAppenderSkeleton : public FileAppender
+ * A special version of the RollingFileAppender that acts properly with multiple processes
+ */
+class LOG4CXX_EXPORT MultiprocessRollingFileAppender : public FileAppender
 {
-		DECLARE_LOG4CXX_OBJECT(RollingFileAppenderSkeleton)
+		DECLARE_LOG4CXX_OBJECT(MultiprocessRollingFileAppender)
 		BEGIN_LOG4CXX_CAST_MAP()
-		LOG4CXX_CAST_ENTRY(RollingFileAppenderSkeleton)
+		LOG4CXX_CAST_ENTRY(MultiprocessRollingFileAppender)
 		LOG4CXX_CAST_ENTRY_CHAIN(FileAppender)
 		END_LOG4CXX_CAST_MAP()
+	protected:
+		struct MultiprocessRollingFileAppenderPriv;
 
-		/**
-		 * Triggering policy.
-		 */
-		TriggeringPolicyPtr triggeringPolicy;
-
-		/**
-		 * Rolling policy.
-		 */
-		RollingPolicyPtr rollingPolicy;
-
-		/**
-		 * Length of current active log file.
-		 */
-		size_t fileLength;
-
-		/**
-		 *  save the loggingevent
-		 */
-		spi::LoggingEventPtr* _event;
 	public:
-		/**
-		 * The default constructor simply calls its {@link
-		 * FileAppender#FileAppender parents constructor}.
-		 * */
-		RollingFileAppenderSkeleton();
+		MultiprocessRollingFileAppender();
 
 		void activateOptions(log4cxx::helpers::Pool&);
 
@@ -98,7 +75,7 @@ class LOG4CXX_EXPORT RollingFileAppenderSkeleton : public FileAppender
 
 		bool rolloverInternal(log4cxx::helpers::Pool& p);
 
-	protected:
+	public:
 
 		RollingPolicyPtr getRollingPolicy() const;
 
@@ -133,16 +110,19 @@ class LOG4CXX_EXPORT RollingFileAppenderSkeleton : public FileAppender
 		log4cxx::helpers::WriterPtr createWriter(log4cxx::helpers::OutputStreamPtr& os);
 
 	public:
-
-
-
 		/**
 		 * Get byte length of current active log file.
 		 * @return byte length of current active log file.
 		 */
 		size_t getFileLength() const;
 
-#ifdef LOG4CXX_MULTI_PROCESS
+		/**
+		 * Increments estimated byte length of current active log file.
+		 * @param increment additional bytes written to log file.
+		 */
+		void incrementFileLength(size_t increment);
+
+	private:
 		/**
 		 * Set byte length of current active log file.
 		 * @return void
@@ -159,18 +139,12 @@ class LOG4CXX_EXPORT RollingFileAppenderSkeleton : public FileAppender
 		 * @return void
 		 */
 		void reopenLatestFile(log4cxx::helpers::Pool& p);
-#endif
 
-		/**
-		 * Increments estimated byte length of current active log file.
-		 * @param increment additional bytes written to log file.
-		 */
-		void incrementFileLength(size_t increment);
+		friend class CountingOutputStream;
 
 };
 
-
-LOG4CXX_PTR_DEF(RollingFileAppenderSkeleton);
+LOG4CXX_PTR_DEF(MultiprocessRollingFileAppender);
 
 }
 }
diff --git a/src/main/include/log4cxx/rolling/rollingfileappender.h b/src/main/include/log4cxx/rolling/rollingfileappender.h
index 840d03a4..603dffe4 100644
--- a/src/main/include/log4cxx/rolling/rollingfileappender.h
+++ b/src/main/include/log4cxx/rolling/rollingfileappender.h
@@ -152,34 +152,12 @@ class LOG4CXX_EXPORT RollingFileAppender : public FileAppender
 		log4cxx::helpers::WriterPtr createWriter(log4cxx::helpers::OutputStreamPtr& os);
 
 	public:
-
-
-
 		/**
 		 * Get byte length of current active log file.
 		 * @return byte length of current active log file.
 		 */
 		size_t getFileLength() const;
 
-#ifdef LOG4CXX_MULTI_PROCESS
-		/**
-		 * Set byte length of current active log file.
-		 * @return void
-		 */
-		void setFileLength(size_t length);
-
-		/**
-		 *  Release the file lock
-		 * @return void
-		 */
-		void releaseFileLock(apr_file_t* lock_file);
-		/**
-		 * re-open the latest file when its own handler has been renamed
-		 * @return void
-		 */
-		void reopenLatestFile(log4cxx::helpers::Pool& p);
-#endif
-
 		/**
 		 * Increments estimated byte length of current active log file.
 		 * @param increment additional bytes written to log file.
diff --git a/src/main/include/log4cxx/rolling/rollingpolicybase.h b/src/main/include/log4cxx/rolling/rollingpolicybase.h
index c9fdae21..0f7a4bb5 100644
--- a/src/main/include/log4cxx/rolling/rollingpolicybase.h
+++ b/src/main/include/log4cxx/rolling/rollingpolicybase.h
@@ -77,13 +77,8 @@ class LOG4CXX_EXPORT RollingPolicyBase :
 		bool getCreateIntermediateDirectories() const;
 		void setCreateIntermediateDirectories(bool createIntermediate);
 
+		PatternConverterList getPatternConverterList() const;
 
-#ifdef LOG4CXX_MULTI_PROCESS
-		PatternConverterList getPatternConverterList()
-		{
-			return patternConverters;
-		}
-#endif
 	protected:
 		RollingPolicyBase(LOG4CXX_PRIVATE_PTR(RollingPolicyBasePrivate) priv);
 		/**
@@ -104,6 +99,9 @@ class LOG4CXX_EXPORT RollingPolicyBase :
 		log4cxx::pattern::PatternConverterPtr getIntegerPatternConverter() const;
 		log4cxx::pattern::PatternConverterPtr getDatePatternConverter() const;
 };
+
+LOG4CXX_PTR_DEF(RollingPolicyBase);
+
 }
 }
 
diff --git a/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h b/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
index 60b1e200..8aaf60a7 100755
--- a/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
+++ b/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
@@ -161,39 +161,8 @@ class LOG4CXX_EXPORT TimeBasedRollingPolicy : public RollingPolicyBase,
 		virtual ~TimeBasedRollingPolicy();
 		void activateOptions(log4cxx::helpers::Pool& );
 
-#ifdef LOG4CXX_MULTI_PROCESS
-		virtual ~TimeBasedRollingPolicy();
-
-		/**
-		 * Generate mmap file
-		 */
-		int createMMapFile(const std::string& lastfilename, log4cxx::helpers::Pool& pool);
-
-		/**
-		 *  Detect if the mmap file is empty
-		 */
-		bool isMapFileEmpty(log4cxx::helpers::Pool& pool);
-
-		/**
-		 *   init MMapFile
-		 */
-		void initMMapFile(const LogString& lastFileName, log4cxx::helpers::Pool& pool);
-
-		/**
-		 *   lock MMapFile
-		 */
-		int lockMMapFile(int type);
-
-		/**
-		 *   unlock MMapFile
-		 */
-		int unLockMMapFile();
-
-		/**
-		 *   create MMapFile/lockFile
-		 */
-		const std::string createFile(const std::string& filename, const std::string& suffix, log4cxx::helpers::Pool& pool);
-#endif
+		void setOption(const LogString& option,
+					const LogString& value);
 
 		/**
 		 * {@inheritDoc}
@@ -231,6 +200,38 @@ class LOG4CXX_EXPORT TimeBasedRollingPolicy : public RollingPolicyBase,
 	protected:
 		log4cxx::pattern::PatternMap getFormatSpecifiers() const;
 
+	private:
+
+		/**
+		 * Generate mmap file
+		 */
+		int createMMapFile(const std::string& lastfilename, log4cxx::helpers::Pool& pool);
+
+		/**
+		 *  Detect if the mmap file is empty
+		 */
+		bool isMapFileEmpty(log4cxx::helpers::Pool& pool);
+
+		/**
+		 *   init MMapFile
+		 */
+		void initMMapFile(const LogString& lastFileName, log4cxx::helpers::Pool& pool);
+
+		/**
+		 *   lock MMapFile
+		 */
+		int lockMMapFile(int type);
+
+		/**
+		 *   unlock MMapFile
+		 */
+		int unLockMMapFile();
+
+		/**
+		 *   create MMapFile/lockFile
+		 */
+		const std::string createFile(const std::string& filename, const std::string& suffix, log4cxx::helpers::Pool& pool);
+
 };
 
 LOG4CXX_PTR_DEF(TimeBasedRollingPolicy);
diff --git a/src/main/include/log4cxx/writerappender.h b/src/main/include/log4cxx/writerappender.h
index e77d75ad..8b276918 100644
--- a/src/main/include/log4cxx/writerappender.h
+++ b/src/main/include/log4cxx/writerappender.h
@@ -156,12 +156,8 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
 		  <p>
 		  @param writer An already opened Writer.  */
 		void setWriter(const log4cxx::helpers::WriterPtr& writer);
-#ifdef LOG4CXX_MULTI_PROCESS
-		const log4cxx::helpers::WriterPtr getWriter()
-		{
-			return writer;
-		};
-#endif
+
+		const log4cxx::helpers::WriterPtr getWriter() const;
 
 		virtual bool requiresLayout() const;
 


[logging-log4cxx] 01/03: Made the TimeBasedRollingPolicy ABI stable

Posted by rm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rmiddleton pushed a commit to branch LOGCXX-518
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit 637b6b6d84b33b6cf28aa2b80272a5a0ae0fe4ab
Author: Robert Middleton <ro...@rm5248.com>
AuthorDate: Sun Oct 16 10:49:47 2022 -0400

    Made the TimeBasedRollingPolicy ABI stable
---
 src/main/cpp/timebasedrollingpolicy.cpp            | 111 ++++++++++++++++-----
 .../log4cxx/rolling/timebasedrollingpolicy.h       |  61 +----------
 2 files changed, 90 insertions(+), 82 deletions(-)

diff --git a/src/main/cpp/timebasedrollingpolicy.cpp b/src/main/cpp/timebasedrollingpolicy.cpp
index 34fa0980..eadf2b0c 100644
--- a/src/main/cpp/timebasedrollingpolicy.cpp
+++ b/src/main/cpp/timebasedrollingpolicy.cpp
@@ -40,6 +40,68 @@ using namespace log4cxx::pattern;
 
 IMPLEMENT_LOG4CXX_OBJECT(TimeBasedRollingPolicy)
 
+struct TimeBasedRollingPolicy::TimeBasedRollingPolicyPrivate{
+		/**
+		 * Time for next determination if time for rollover.
+		 */
+		log4cxx_time_t nextCheck;
+
+		/**
+		 * File name at last rollover.
+		 */
+		LogString lastFileName;
+
+		/**
+		 * mmap pointer
+		 */
+		apr_mmap_t* _mmap;
+
+		/*
+		 * pool for mmap handler
+		 * */
+		log4cxx::helpers::Pool* _mmapPool;
+
+		/**
+		 * mmap file descriptor
+		 */
+		apr_file_t* _file_map;
+
+		/**
+		 * mmap file name
+		 */
+		std::string _mapFileName;
+
+		/*
+		 * lock file handle
+		 * */
+		apr_file_t* _lock_file;
+
+		/**
+		 * Check nextCheck if it has already been set
+		 * Timebased rolling policy has an issue when working at low rps.
+		 * Under low rps, multiple processes will not be scheduled in time for the second chance(do rolling),
+		 * so the rolling mechanism will not be triggered even if the time period is out of date.
+		 * This results in log entries will be accumulated for serveral minutes to be rolling.
+		 * Adding this flag to provide rolling opportunity for a process even if it is writing the first log entry
+		 */
+		bool bAlreadyInitialized;
+
+		/*
+		 * If the current file name contains date information, retrieve the current writting file from mmap
+		 * */
+		bool bRefreshCurFile;
+
+		/*
+		 * mmap file name
+		 * */
+		LogString _fileNamePattern;
+
+		/**
+		 * Length of any file type suffix (.gz, .zip).
+		 */
+		int suffixLength;
+};
+
 #ifdef LOG4CXX_MULTI_PROCESS
 #define MMAP_FILE_SUFFIX ".map"
 #define LOCK_FILE_SUFFIX ".maplck"
@@ -159,13 +221,16 @@ int TimeBasedRollingPolicy::unLockMMapFile()
 
 #endif
 
-TimeBasedRollingPolicy::TimeBasedRollingPolicy()
+TimeBasedRollingPolicy::TimeBasedRollingPolicy() :
+	m_priv(std::make_unique<TimeBasedRollingPolicyPrivate>())
 #ifdef LOG4CXX_MULTI_PROCESS
 	: _mmap(NULL), _file_map(NULL), bAlreadyInitialized(false), _mmapPool(new Pool()), _lock_file(NULL), bRefreshCurFile(false)
 #endif
 {
 }
 
+TimeBasedRollingPolicy::~TimeBasedRollingPolicy(){}
+
 #ifdef LOG4CXX_MULTI_PROCESS
 TimeBasedRollingPolicy::~TimeBasedRollingPolicy()
 {
@@ -198,7 +263,7 @@ void TimeBasedRollingPolicy::activateOptions(log4cxx::helpers::Pool& pool)
 	LogString buf;
 	ObjectPtr obj = std::make_shared<Date>();
 	formatFileName(obj, buf, pool);
-	lastFileName = buf;
+	m_priv->lastFileName = buf;
 
 #ifdef LOG4CXX_MULTI_PROCESS
 
@@ -225,17 +290,17 @@ void TimeBasedRollingPolicy::activateOptions(log4cxx::helpers::Pool& pool)
 	initMMapFile(lastFileName, *_mmapPool);
 #endif
 
-	suffixLength = 0;
+	m_priv->suffixLength = 0;
 
-	if (lastFileName.length() >= 3)
+	if (m_priv->lastFileName.length() >= 3)
 	{
-		if (lastFileName.compare(lastFileName.length() - 3, 3, LOG4CXX_STR(".gz")) == 0)
+		if (m_priv->lastFileName.compare(m_priv->lastFileName.length() - 3, 3, LOG4CXX_STR(".gz")) == 0)
 		{
-			suffixLength = 3;
+			m_priv->suffixLength = 3;
 		}
-		else if (lastFileName.length() >= 4 && lastFileName.compare(lastFileName.length() - 4, 4, LOG4CXX_STR(".zip")) == 0)
+		else if (m_priv->lastFileName.length() >= 4 && m_priv->lastFileName.compare(m_priv->lastFileName.length() - 4, 4, LOG4CXX_STR(".zip")) == 0)
 		{
-			suffixLength = 4;
+			m_priv->suffixLength = 4;
 		}
 	}
 }
@@ -262,14 +327,14 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::initialize(
 {
 	Date now;
 	log4cxx_time_t n = now.getTime();
-	nextCheck = now.getNextSecond();
+	m_priv->nextCheck = now.getNextSecond();
 
 	File currentFile(currentActiveFile);
 
 	LogString buf;
 	ObjectPtr obj = std::make_shared<Date>(currentFile.exists(pool) ? currentFile.lastModified(pool) : n);
 	formatFileName(obj, buf, pool);
-	lastFileName = buf;
+	m_priv->lastFileName = buf;
 
 	ActionPtr noAction;
 
@@ -280,9 +345,9 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::initialize(
 	}
 	else
 	{
-		bRefreshCurFile = true;
+		m_priv->bRefreshCurFile = true;
 		return std::make_shared<RolloverDescription>(
-					lastFileName.substr(0, lastFileName.length() - suffixLength), append,
+					m_priv->lastFileName.substr(0, m_priv->lastFileName.length() - m_priv->suffixLength), append,
 					noAction, noAction);
 	}
 }
@@ -294,7 +359,7 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
 {
 	Date now;
 	log4cxx_time_t n = now.getTime();
-	nextCheck = now.getNextSecond();
+	m_priv->nextCheck = now.getNextSecond();
 
 	LogString buf;
 	ObjectPtr obj = std::make_shared<Date>(n);
@@ -323,7 +388,7 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
 	//
 	//  if file names haven't changed, no rollover
 	//
-	if (newFileName == lastFileName)
+	if (newFileName == m_priv->lastFileName)
 	{
 		RolloverDescriptionPtr desc;
 		return desc;
@@ -332,12 +397,12 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
 	ActionPtr renameAction;
 	ActionPtr compressAction;
 	LogString lastBaseName(
-		lastFileName.substr(0, lastFileName.length() - suffixLength));
+		m_priv->lastFileName.substr(0, m_priv->lastFileName.length() - m_priv->suffixLength));
 	LogString nextActiveFile(
-		newFileName.substr(0, newFileName.length() - suffixLength));
+		newFileName.substr(0, newFileName.length() - m_priv->suffixLength));
 
 	if(getCreateIntermediateDirectories()){
-		File compressedFile(lastFileName);
+		File compressedFile(m_priv->lastFileName);
 		File compressedParent (compressedFile.getParent(pool));
 		compressedParent.mkdirs(pool);
 	}
@@ -353,16 +418,16 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
 		nextActiveFile = currentActiveFile;
 	}
 
-	if (suffixLength == 3)
+	if (m_priv->suffixLength == 3)
 	{
 		compressAction = std::make_shared<GZCompressAction>(
-					File().setPath(lastBaseName), File().setPath(lastFileName), true);
+					File().setPath(lastBaseName), File().setPath(m_priv->lastFileName), true);
 	}
 
-	if (suffixLength == 4)
+	if (m_priv->suffixLength == 4)
 	{
 		compressAction = std::make_shared<ZipCompressAction>(
-					File().setPath(lastBaseName), File().setPath(lastFileName), true);
+					File().setPath(lastBaseName), File().setPath(m_priv->lastFileName), true);
 	}
 
 #ifdef LOG4CXX_MULTI_PROCESS
@@ -381,7 +446,7 @@ RolloverDescriptionPtr TimeBasedRollingPolicy::rollover(
 	}
 
 #else
-	lastFileName = newFileName;
+	m_priv->lastFileName = newFileName;
 #endif
 
 	return std::make_shared<RolloverDescription>(nextActiveFile, append, renameAction, compressAction);
@@ -410,6 +475,6 @@ bool TimeBasedRollingPolicy::isTriggeringEvent(
 
 	return ((apr_time_now()) > nextCheck) || (!bAlreadyInitialized);
 #else
-	return Date::currentTime() > nextCheck;
+	return Date::currentTime() > m_priv->nextCheck;
 #endif
 }
diff --git a/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h b/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
index 09ebcd7c..60b1e200 100755
--- a/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
+++ b/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
@@ -154,68 +154,11 @@ class LOG4CXX_EXPORT TimeBasedRollingPolicy : public RollingPolicyBase,
 		END_LOG4CXX_CAST_MAP()
 
 	private:
-		/**
-		 * Time for next determination if time for rollover.
-		 */
-		log4cxx_time_t nextCheck;
-
-		/**
-		 * File name at last rollover.
-		 */
-		LogString lastFileName;
-
-		/**
-		 * mmap pointer
-		 */
-		apr_mmap_t* _mmap;
-
-		/*
-		 * pool for mmap handler
-		 * */
-		log4cxx::helpers::Pool* _mmapPool;
-
-		/**
-		 * mmap file descriptor
-		 */
-		apr_file_t* _file_map;
-
-		/**
-		 * mmap file name
-		 */
-		std::string _mapFileName;
-
-		/*
-		 * lock file handle
-		 * */
-		apr_file_t* _lock_file;
-
-		/**
-		 * Check nextCheck if it has already been set
-		 * Timebased rolling policy has an issue when working at low rps.
-		 * Under low rps, multiple processes will not be scheduled in time for the second chance(do rolling),
-		 * so the rolling mechanism will not be triggered even if the time period is out of date.
-		 * This results in log entries will be accumulated for serveral minutes to be rolling.
-		 * Adding this flag to provide rolling opportunity for a process even if it is writing the first log entry
-		 */
-		bool bAlreadyInitialized;
-
-		/*
-		 * If the current file name contains date information, retrieve the current writting file from mmap
-		 * */
-		bool bRefreshCurFile;
-
-		/*
-		 * mmap file name
-		 * */
-		LogString _fileNamePattern;
-
-		/**
-		 * Length of any file type suffix (.gz, .zip).
-		 */
-		int suffixLength;
+		LOG4CXX_DECLARE_PRIVATE_MEMBER_PTR(TimeBasedRollingPolicyPrivate, m_priv)
 
 	public:
 		TimeBasedRollingPolicy();
+		virtual ~TimeBasedRollingPolicy();
 		void activateOptions(log4cxx::helpers::Pool& );
 
 #ifdef LOG4CXX_MULTI_PROCESS