You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2026/05/03 07:39:51 UTC

(logging-log4cxx) branch next_abi_appender created (now 609aa7d1)

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

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


      at 609aa7d1 Simplify the Appender interface in a future ABI version

This branch includes the following new commits:

     new 609aa7d1 Simplify the Appender interface in a future ABI version

The 1 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) 01/01: Simplify the Appender interface in a future ABI version

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

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

commit 609aa7d1566704d78da7b4a4d2555c265cc72759
Author: Stephen Webb <sw...@gmail.com>
AuthorDate: Sun May 3 17:10:34 2026 +1000

    Simplify the Appender interface in a future ABI version
---
 src/examples/cpp/custom-appender.cpp               |  2 +-
 src/main/cpp/CMakeLists.txt                        |  1 +
 .../vectorappender.cpp => main/cpp/appender.cpp}   | 31 ++++++---------
 src/main/cpp/appenderattachableimpl.cpp            |  4 +-
 src/main/cpp/appenderskeleton.cpp                  |  8 ++--
 src/main/cpp/asyncappender.cpp                     | 17 ++++----
 src/main/cpp/dbappender.cpp                        |  5 ++-
 src/main/cpp/fallbackerrorhandler.cpp              |  3 +-
 src/main/cpp/loader.cpp                            |  1 -
 src/main/cpp/logger.cpp                            | 46 ++++++++++------------
 src/main/cpp/multiprocessrollingfileappender.cpp   | 37 +++++++++++------
 src/main/cpp/nteventlogappender.cpp                |  7 ++--
 src/main/cpp/odbcappender.cpp                      |  4 +-
 src/main/cpp/outputdebugstringappender.cpp         |  5 ++-
 src/main/cpp/rollingfileappender.cpp               | 26 ++++++++----
 src/main/cpp/smtpappender.cpp                      |  3 +-
 src/main/cpp/syslogappender.cpp                    |  5 ++-
 src/main/cpp/telnetappender.cpp                    |  7 ++--
 src/main/cpp/writerappender.cpp                    | 13 +++---
 src/main/cpp/xmlsocketappender.cpp                 |  3 +-
 src/main/include/log4cxx/appender.h                | 19 ++++++++-
 src/main/include/log4cxx/appenderskeleton.h        |  7 ++--
 src/main/include/log4cxx/asyncappender.h           |  5 +--
 src/main/include/log4cxx/db/dbappender.h           |  2 +-
 src/main/include/log4cxx/db/odbcappender.h         |  2 +-
 .../log4cxx/helpers/appenderattachableimpl.h       |  8 ++++
 src/main/include/log4cxx/logger.h                  | 11 ++++++
 src/main/include/log4cxx/net/smtpappender.h        |  2 +-
 src/main/include/log4cxx/net/syslogappender.h      |  2 +-
 src/main/include/log4cxx/net/telnetappender.h      |  2 +-
 src/main/include/log4cxx/net/xmlsocketappender.h   |  2 +-
 src/main/include/log4cxx/nt/nteventlogappender.h   |  2 +-
 .../include/log4cxx/nt/outputdebugstringappender.h |  2 +-
 .../rolling/multiprocessrollingfileappender.h      | 10 ++++-
 .../include/log4cxx/rolling/rollingfileappender.h  |  8 +++-
 src/main/include/log4cxx/writerappender.h          |  4 +-
 src/site/doxy/Doxyfile.in                          |  7 +++-
 src/test/cpp/asyncappendertestcase.cpp             | 10 ++---
 src/test/cpp/benchmark/benchmark.cpp               |  2 +-
 src/test/cpp/loggertestcase.cpp                    |  2 +-
 src/test/cpp/nt/nteventlogappendertestcase.cpp     |  4 +-
 src/test/cpp/optionhandlertest.cpp                 |  4 +-
 src/test/cpp/vectorappender.cpp                    |  2 +-
 src/test/cpp/vectorappender.h                      |  2 +-
 44 files changed, 208 insertions(+), 141 deletions(-)

diff --git a/src/examples/cpp/custom-appender.cpp b/src/examples/cpp/custom-appender.cpp
index 598abeca..cd67f1de 100644
--- a/src/examples/cpp/custom-appender.cpp
+++ b/src/examples/cpp/custom-appender.cpp
@@ -40,7 +40,7 @@ public:
 		return false;
 	}
 
-	void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override {
+	void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override {
 		// This gets called whenever there is a valid event for our appender.
 	}
 
diff --git a/src/main/cpp/CMakeLists.txt b/src/main/cpp/CMakeLists.txt
index dcbe526d..5273700f 100644
--- a/src/main/cpp/CMakeLists.txt
+++ b/src/main/cpp/CMakeLists.txt
@@ -84,6 +84,7 @@ target_sources(log4cxx
   PRIVATE
   action.cpp
   andfilter.cpp
+  appender.cpp
   appenderattachableimpl.cpp
   appenderskeleton.cpp
   aprinitializer.cpp
diff --git a/src/test/cpp/vectorappender.cpp b/src/main/cpp/appender.cpp
similarity index 59%
copy from src/test/cpp/vectorappender.cpp
copy to src/main/cpp/appender.cpp
index aa7999a3..1e512204 100644
--- a/src/test/cpp/vectorappender.cpp
+++ b/src/main/cpp/appender.cpp
@@ -14,29 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#include <log4cxx/appender.h>
+#include <log4cxx/helpers/pool.h>
 
-#include "vectorappender.h"
-#include <log4cxx/private/appenderskeleton_priv.h>
-#include <thread>
+using namespace LOG4CXX_NS;
 
-using namespace log4cxx;
-using namespace log4cxx::helpers;
+IMPLEMENT_LOG4CXX_OBJECT(Appender)
 
-IMPLEMENT_LOG4CXX_OBJECT(VectorAppender)
-
-void VectorAppender::append(const spi::LoggingEventPtr& event, Pool& /*p*/)
+#if LOG4CXX_ABI_VERSION <= 15
+void Appender::doAppend(const spi::LoggingEventPtr& event)
 {
-	if (0 < this->appendMillisecondDelay)
-		std::this_thread::sleep_for( std::chrono::milliseconds( this->appendMillisecondDelay ) );
-	this->vector.push_back(event);
+	helpers::Pool p;
+	doAppend(event, p);
 }
-
-bool VectorAppender::isClosed() const
-{
-	return m_priv->closed;
-}
-
-void VectorAppender::close()
+#else
+void Appender::doAppend(const spi::LoggingEventPtr& event, helpers::Pool&)
 {
-	m_priv->closed = true;
+	doAppend(event);
 }
+#endif
diff --git a/src/main/cpp/appenderattachableimpl.cpp b/src/main/cpp/appenderattachableimpl.cpp
index 304b7061..be03541c 100644
--- a/src/main/cpp/appenderattachableimpl.cpp
+++ b/src/main/cpp/appenderattachableimpl.cpp
@@ -96,7 +96,7 @@ void AppenderAttachableImpl::addAppender(const AppenderPtr newAppender)
 		m_priv = std::make_unique<priv_data>(AppenderList{newAppender});
 }
 
-int AppenderAttachableImpl::appendLoopOnAppenders(const spi::LoggingEventPtr& event, Pool& p)
+int AppenderAttachableImpl::appendLoopOnAppenders(const spi::LoggingEventPtr& event)
 {
 	int result = 0;
 	if (m_priv)
@@ -104,7 +104,7 @@ int AppenderAttachableImpl::appendLoopOnAppenders(const spi::LoggingEventPtr& ev
 		auto allAppenders = m_priv->getAppenders();
 		for (auto& appender : *allAppenders)
 		{
-			appender->doAppend(event, p);
+			appender->doAppend(event);
 			++result;
 		}
 	}
diff --git a/src/main/cpp/appenderskeleton.cpp b/src/main/cpp/appenderskeleton.cpp
index 030c7572..a23ec9c0 100644
--- a/src/main/cpp/appenderskeleton.cpp
+++ b/src/main/cpp/appenderskeleton.cpp
@@ -94,14 +94,14 @@ bool AppenderSkeleton::isAsSevereAsThreshold(const LevelPtr& level) const
 	return ((level == 0) || level->isGreaterOrEqual(m_priv->threshold));
 }
 
-void AppenderSkeleton::doAppend(const spi::LoggingEventPtr& event, Pool& pool1)
+void AppenderSkeleton::doAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	std::lock_guard<std::recursive_mutex> lock(m_priv->mutex);
 
-	doAppendImpl(event, pool1);
+	doAppendImpl( LOG4CXX_APPEND_PARAMETERS );
 }
 
-void AppenderSkeleton::doAppendImpl(const spi::LoggingEventPtr& event, Pool& pool)
+void AppenderSkeleton::doAppendImpl( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	if (m_priv->closed)
 	{
@@ -110,7 +110,7 @@ void AppenderSkeleton::doAppendImpl(const spi::LoggingEventPtr& event, Pool& poo
 	}
 	else if (isAsSevereAsThreshold(event->getLevel()) && isAccepted(event))
 	{
-		append(event, pool);
+		append( LOG4CXX_APPEND_PARAMETERS );
 	}
 }
 
diff --git a/src/main/cpp/asyncappender.cpp b/src/main/cpp/asyncappender.cpp
index 9c6f5470..84056b74 100644
--- a/src/main/cpp/asyncappender.cpp
+++ b/src/main/cpp/asyncappender.cpp
@@ -104,7 +104,7 @@ class DiscardSummary
 		 *
 		 * @return the new event.
 		 */
-		LoggingEventPtr createEvent(Pool& p);
+		LoggingEventPtr createEvent();
 
 #if LOG4CXX_ABI_VERSION <= 15
 		static
@@ -340,16 +340,16 @@ void AsyncAppender::setOption(const LogString& option,
 }
 
 
-void AsyncAppender::doAppend(const spi::LoggingEventPtr& event, Pool& pool1)
+void AsyncAppender::doAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
-	doAppendImpl(event, pool1);
+	doAppendImpl( LOG4CXX_APPEND_PARAMETERS );
 }
 
-void AsyncAppender::append(const spi::LoggingEventPtr& event, Pool& p)
+void AsyncAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	if (priv->bufferSize <= 0)
 	{
-		priv->appenders.appendLoopOnAppenders(event, p);
+		priv->appenders.appendLoopOnAppenders(event);
 		return;
 	}
 
@@ -585,7 +585,7 @@ void DiscardSummary::add(const LoggingEventPtr& event)
 	++this->count;
 }
 
-LoggingEventPtr DiscardSummary::createEvent(Pool& p)
+LoggingEventPtr DiscardSummary::createEvent()
 {
 	LogString msg(LOG4CXX_STR("Discarded "));
 	StringHelper::toString(this->count, msg);
@@ -628,7 +628,6 @@ void AsyncAppender::AsyncAppenderPriv::dispatch(const LogString& appenderName)
 
 	while (isActive)
 	{
-		Pool p;
 		LoggingEventList events;
 		events.reserve(this->bufferSize);
 		for (int count = 0; count < 2 && this->dispatchedCount == this->commitCount; ++count)
@@ -658,7 +657,7 @@ void AsyncAppender::AsyncAppenderPriv::dispatch(const LogString& appenderName)
 			producerBlockedCount += this->blockedCount;
 			for (auto& discardItem : this->discardMap)
 			{
-				events.push_back(discardItem.second.createEvent(p));
+				events.push_back(discardItem.second.createEvent());
 				discardCount += discardItem.second.getCount();
 			}
 			this->discardMap.clear();
@@ -668,7 +667,7 @@ void AsyncAppender::AsyncAppenderPriv::dispatch(const LogString& appenderName)
 		{
 			try
 			{
-				this->appenders.appendLoopOnAppenders(item, p);
+				this->appenders.appendLoopOnAppenders(item);
 			}
 			catch (std::exception& ex)
 			{
diff --git a/src/main/cpp/dbappender.cpp b/src/main/cpp/dbappender.cpp
index 971b7f21..7bf72c52 100644
--- a/src/main/cpp/dbappender.cpp
+++ b/src/main/cpp/dbappender.cpp
@@ -223,7 +223,7 @@ void DBAppender::activateOptions( LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
     }
 }
 
-void DBAppender::append(const spi::LoggingEventPtr& event, helpers::Pool& p){
+void DBAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS ){
 	std::vector<std::string> ls_args;
     std::vector<const char*> args;
     int stat;
@@ -236,9 +236,10 @@ void DBAppender::append(const spi::LoggingEventPtr& event, helpers::Pool& p){
         return;
     }
 
+    helpers::Pool tempPool;
     for(auto& converter : _priv->converters){
         LogString str_data;
-        converter->format(event, str_data, p);
+        converter->format(event, str_data, tempPool);
 		LOG4CXX_ENCODE_CHAR(new_str_data, str_data);
 		ls_args.push_back(new_str_data);
     }
diff --git a/src/main/cpp/fallbackerrorhandler.cpp b/src/main/cpp/fallbackerrorhandler.cpp
index 0c027c00..8a1652e8 100644
--- a/src/main/cpp/fallbackerrorhandler.cpp
+++ b/src/main/cpp/fallbackerrorhandler.cpp
@@ -143,8 +143,7 @@ void FallbackErrorHandler::error
 	m_priv->errorReported = true;
 	if (event)
     {
-        Pool p;
-		backupLocked->doAppend(event, p);
+		backupLocked->doAppend(event);
     }
 	m_priv->primary = backupLocked;
 }
diff --git a/src/main/cpp/loader.cpp b/src/main/cpp/loader.cpp
index 0e07767f..f91af56d 100644
--- a/src/main/cpp/loader.cpp
+++ b/src/main/cpp/loader.cpp
@@ -41,7 +41,6 @@ using namespace LOG4CXX_NS::filter;
 IMPLEMENT_LOG4CXX_OBJECT(Object)
 IMPLEMENT_LOG4CXX_OBJECT(OptionHandler)
 IMPLEMENT_LOG4CXX_OBJECT(ErrorHandler)
-IMPLEMENT_LOG4CXX_OBJECT(Appender)
 IMPLEMENT_LOG4CXX_OBJECT(Filter)
 IMPLEMENT_LOG4CXX_OBJECT(AppenderAttachable)
 IMPLEMENT_LOG4CXX_OBJECT(LoggerFactory)
diff --git a/src/main/cpp/logger.cpp b/src/main/cpp/logger.cpp
index f42dbf16..1efcb34f 100644
--- a/src/main/cpp/logger.cpp
+++ b/src/main/cpp/logger.cpp
@@ -141,7 +141,7 @@ void Logger::reconfigure( const AppenderList& newList, bool newAdditivity )
 	replaceAppenders(newList);
 }
 
-void Logger::callAppenders(const spi::LoggingEventPtr& event, Pool& p) const
+void Logger::callAppenders(const spi::LoggingEventPtr& event) const
 {
 	int writes = 0;
 
@@ -149,7 +149,7 @@ void Logger::callAppenders(const spi::LoggingEventPtr& event, Pool& p) const
 		logger != 0;
 		logger = logger->m_priv->parent.get())
 	{
-		writes += logger->m_priv->aai.appendLoopOnAppenders(event, p);
+		writes += logger->m_priv->aai.appendLoopOnAppenders(event);
 
 		if (!logger->m_priv->additive)
 		{
@@ -164,6 +164,12 @@ void Logger::callAppenders(const spi::LoggingEventPtr& event, Pool& p) const
 		rep->emitNoAppenderWarning(this);
 	}
 }
+#if LOG4CXX_ABI_VERSION <= 15
+void Logger::callAppenders(const spi::LoggingEventPtr& event, Pool&) const
+{
+    callAppenders(event);
+}
+#endif
 
 void Logger::closeNestedAppenders()
 {
@@ -178,8 +184,7 @@ void Logger::addEvent(const LevelPtr& level, helpers::AsyncBuffer&& messageAppen
 	if (!getHierarchy()) // Has removeHierarchy() been called?
 		return;
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level, location, std::move(messageAppender));
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::addEvent(const LevelPtr& level, std::string&& message, const LocationInfo& location) const
@@ -192,8 +197,7 @@ void Logger::addEvent(const LevelPtr& level, std::string&& message, const Locati
 	LOG4CXX_DECODE_CHAR(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level, location, std::move(msg));
 #endif
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::addFatalEvent(std::string&& message, const LocationInfo& location) const
@@ -267,8 +271,7 @@ void Logger::forcedLog(const LevelPtr& level, const std::string& message,
 	LOG4CXX_DECODE_CHAR(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level, location, std::move(msg));
 #endif
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::forcedLog(const LevelPtr& level1, const std::string& message) const
@@ -281,8 +284,7 @@ void Logger::addEventLS(const LevelPtr& level, LogString&& message, const Locati
 	if (!getHierarchy()) // Has removeHierarchy() been called?
 		return;
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level, location, std::move(message));
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::forcedLogLS(const LevelPtr& level1, const LogString& message,
@@ -291,8 +293,7 @@ void Logger::forcedLogLS(const LevelPtr& level1, const LogString& message,
 	if (!getHierarchy()) // Has removeHierarchy() been called?
 		return;
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level1, message, location);
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 
@@ -857,8 +858,7 @@ void Logger::addEvent(const LevelPtr& level, std::wstring&& message, const Locat
 	LOG4CXX_DECODE_WCHAR(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level, location, std::move(msg));
 #endif
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::addFatalEvent(std::wstring&& message, const LocationInfo& location) const
@@ -902,8 +902,7 @@ void Logger::forcedLog(const LevelPtr& level, const std::wstring& message,
 	LOG4CXX_DECODE_WCHAR(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level, location, std::move(msg));
 #endif
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::forcedLog(const LevelPtr& level1, const std::wstring& message) const
@@ -1050,8 +1049,7 @@ void Logger::addEvent(const LevelPtr& level1, std::basic_string<UniChar>&& messa
 		return;
 	LOG4CXX_DECODE_UNICHAR(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level1, location, std::move(msg));
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::addFatalEvent(std::basic_string<UniChar>&& message, const LocationInfo& location) const
@@ -1091,8 +1089,7 @@ void Logger::forcedLog(const LevelPtr& level1, const std::basic_string<UniChar>&
 		return;
 	LOG4CXX_DECODE_UNICHAR(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level1, location, std::move(msg));
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::forcedLog(const LevelPtr& level1, const std::basic_string<UniChar>& message) const
@@ -1102,8 +1099,7 @@ void Logger::forcedLog(const LevelPtr& level1, const std::basic_string<UniChar>&
 	LOG4CXX_DECODE_UNICHAR(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level1, msg,
 			LocationInfo::getLocationUnavailable());
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::getName(std::basic_string<UniChar>& rv) const
@@ -1241,8 +1237,7 @@ void Logger::forcedLog(const LevelPtr& level, const CFStringRef& message,
 		return;
 	LOG4CXX_DECODE_CFSTRING(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level, location, std::move(msg));
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::forcedLog(const LevelPtr& level, const CFStringRef& message) const
@@ -1252,8 +1247,7 @@ void Logger::forcedLog(const LevelPtr& level, const CFStringRef& message) const
 	LOG4CXX_DECODE_CFSTRING(msg, message);
 	auto event = std::make_shared<LoggingEvent>(m_priv->name, level, msg,
 			LocationInfo::getLocationUnavailable());
-	Pool p;
-	callAppenders(event, p);
+	callAppenders(event);
 }
 
 void Logger::getName(CFStringRef& rv) const
diff --git a/src/main/cpp/multiprocessrollingfileappender.cpp b/src/main/cpp/multiprocessrollingfileappender.cpp
index 71f16253..e105e45d 100644
--- a/src/main/cpp/multiprocessrollingfileappender.cpp
+++ b/src/main/cpp/multiprocessrollingfileappender.cpp
@@ -246,18 +246,24 @@ bool MultiprocessRollingFileAppender::getCurrentFileSize(size_t* pSize)
 
  * @return true if rollover performed.
  */
-bool MultiprocessRollingFileAppender::rollover(Pool& p)
+bool MultiprocessRollingFileAppender::rollover()
 {
 	std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
-	return synchronizedRollover(p);
+	return synchronizedRollover();
+}
+#if LOG4CXX_ABI_VERSION <= 15
+bool MultiprocessRollingFileAppender::rollover(Pool& p)
+{
+	rollover()
 }
+#endif
 
 /**
  * Coordinate a rollover with other processes
 
  * @return true if this process perfomed the rollover.
  */
-bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const TriggeringPolicyPtr& trigger)
+bool MultiprocessRollingFileAppender::synchronizedRollover(const TriggeringPolicyPtr& trigger)
 {
 	bool result = false;
 	LogString fileName = getFile();
@@ -267,6 +273,7 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
 		reopenFile(fileName);
 	else
 	{
+		helpers::Pool tempPool;
 		MultiprocessRollingFileAppenderPriv::Lock lk(_priv, fileName);
 		if (!lk.hasLock())
 			LogLog::warn(LOG4CXX_STR("Failed to lock ") + fileName);
@@ -274,14 +281,14 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
 			reopenFile(fileName);
 		else if (trigger && !trigger->isTriggeringEvent(this, _priv->_event, fileName, _priv->fileLength))
 			;
-		else if (auto rollover1 = _priv->rollingPolicy->rollover(fileName, getAppend(), p))
+		else if (auto rollover1 = _priv->rollingPolicy->rollover(fileName, getAppend(), tempPool))
 		{
 			_priv->close();
 			if (rollover1->getActiveFileName() == fileName)
 			{
 				bool success = true; // A synchronous action is not required
 				if (auto pAction = rollover1->getSynchronous())
-					success = pAction->execute(p);
+					success = pAction->execute(tempPool);
 
 				bool appendToExisting = true;
 				if (success)
@@ -300,7 +307,7 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
 					{
 						try
 						{
-							asyncAction->execute(p);
+							asyncAction->execute(tempPool);
 						}
 						catch (std::exception& ex)
 						{
@@ -330,10 +337,10 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
 					, rollover1->getAppend()
 					);
 				_priv->setWriter(createWriter(os));
-
+				helpers::Pool tempPool;
 				bool success = true; // A synchronous action is not required
 				if (auto pAction = rollover1->getSynchronous())
-					success = pAction->execute(p);
+					success = pAction->execute(tempPool);
 
 				if (success)
 				{
@@ -350,7 +357,7 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
 					{
 						try
 						{
-							asyncAction->execute(p);
+							asyncAction->execute(tempPool);
 						}
 						catch (std::exception& ex)
 						{
@@ -369,6 +376,12 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
 
 	return result;
 }
+#if LOG4CXX_ABI_VERSION <= 15
+bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const TriggeringPolicyPtr& trigger)
+{
+	synchronizedRollover(trigger);
+}
+#endif
 
 /**
  * re-open \c fileName (used after it has been renamed)
@@ -389,7 +402,7 @@ void MultiprocessRollingFileAppender::reopenFile(const LogString& fileName)
 /**
  * {@inheritDoc}
 */
-void MultiprocessRollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
+void MultiprocessRollingFileAppender::subAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	// The rollover check must precede actual writing. This is the
 	// only correct behavior for time driven triggers.
@@ -404,7 +417,7 @@ void MultiprocessRollingFileAppender::subAppend(const LoggingEventPtr& event, Po
 		try
 		{
 			_priv->_event = event;
-			synchronizedRollover(p, _priv->triggeringPolicy);
+			synchronizedRollover(_priv->triggeringPolicy);
 		}
 		catch (std::exception& ex)
 		{
@@ -419,7 +432,7 @@ void MultiprocessRollingFileAppender::subAppend(const LoggingEventPtr& event, Po
 	else if (isAlreadyRolled(fileName, &_priv->fileLength))
 		reopenFile(fileName);
 
-	FileAppender::subAppend(event, p);
+	FileAppender::subAppend( LOG4CXX_APPEND_PARAMETERS );
 }
 
 /**
diff --git a/src/main/cpp/nteventlogappender.cpp b/src/main/cpp/nteventlogappender.cpp
index c6bff171..553d107c 100644
--- a/src/main/cpp/nteventlogappender.cpp
+++ b/src/main/cpp/nteventlogappender.cpp
@@ -213,7 +213,7 @@ void NTEventLogAppender::activateOptions( LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAME
 	}
 }
 
-void NTEventLogAppender::append(const LoggingEventPtr& event, Pool& p)
+void NTEventLogAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	if (priv->hEventLog == NULL)
 	{
@@ -222,8 +222,9 @@ void NTEventLogAppender::append(const LoggingEventPtr& event, Pool& p)
 	}
 
 	LogString oss;
-	this->m_priv->layout->format(oss, event, p);
-	wchar_t* msgs = Transcoder::wencode(oss, p);
+	Pool tempPool;
+	this->m_priv->layout->format(oss, event, tempPool);
+	wchar_t* msgs = Transcoder::wencode(oss, tempPool);
 	BOOL bSuccess = ::ReportEventW(
 			priv->hEventLog,
 			getEventType(event),
diff --git a/src/main/cpp/odbcappender.cpp b/src/main/cpp/odbcappender.cpp
index fcad8cd2..b9e9650d 100644
--- a/src/main/cpp/odbcappender.cpp
+++ b/src/main/cpp/odbcappender.cpp
@@ -260,14 +260,14 @@ void ODBCAppender::activateOptions( LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
 }
 
 
-void ODBCAppender::append(const spi::LoggingEventPtr& event, LOG4CXX_NS::helpers::Pool& p)
+void ODBCAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 #if LOG4CXX_HAVE_ODBC
 	_priv->buffer.push_back(event);
 
 	if (_priv->buffer.size() >= _priv->bufferSize)
 	{
-		flushBuffer(p);
+		flushBuffer(_priv->pool);
 	}
 
 #endif
diff --git a/src/main/cpp/outputdebugstringappender.cpp b/src/main/cpp/outputdebugstringappender.cpp
index e71d6be9..b4e9aa99 100644
--- a/src/main/cpp/outputdebugstringappender.cpp
+++ b/src/main/cpp/outputdebugstringappender.cpp
@@ -32,10 +32,11 @@ OutputDebugStringAppender::OutputDebugStringAppender()
 {
 }
 
-void OutputDebugStringAppender::append(const spi::LoggingEventPtr& event, Pool& p)
+void OutputDebugStringAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	LogString buf;
-	this->m_priv->layout->format(buf, event, p);
+	Pool tempPool;
+	this->m_priv->layout->format(buf, event, tempPool);
 #if LOG4CXX_WCHAR_T_API
 	LOG4CXX_ENCODE_WCHAR(wstr, buf);
 	::OutputDebugStringW(wstr.c_str());
diff --git a/src/main/cpp/rollingfileappender.cpp b/src/main/cpp/rollingfileappender.cpp
index 463628ad..ae2ffe51 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/rollingfileappender.cpp
@@ -286,23 +286,29 @@ bool RollingFileAppender::RollingFileAppenderPriv::activateOptions()
 
  * @return true if rollover performed.
  */
-bool RollingFileAppender::rollover(Pool& p)
+bool RollingFileAppender::rollover()
 {
 	std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
-	return rolloverInternal(p);
+	return rolloverInternal();
+}
+#if LOG4CXX_ABI_VERSION <= 15
+bool RollingFileAppender::rollover(Pool& p)
+{
+	rollover()
 }
+#endif
 
-bool RollingFileAppender::rolloverInternal(Pool& p)
+bool RollingFileAppender::rolloverInternal()
 {
 	//
 	//   can't roll without a policy
 	//
 	if (_priv->rollingPolicy != NULL)
 	{
-
 		{
 				try
 				{
+					Pool p;
 					RolloverDescriptionPtr rollover1(_priv->rollingPolicy->rollover(this->getFile(), this->getAppend(), p));
 
 					if (rollover1 != NULL)
@@ -429,11 +435,17 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 
 	return false;
 }
+#if LOG4CXX_ABI_VERSION <= 15
+bool RollingFileAppender::rolloverInternal(Pool&)
+{
+	rolloverInternal();
+}
+#endif
 
 /**
  * {@inheritDoc}
 */
-void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
+void RollingFileAppender::subAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	// The rollover check must precede actual writing. This is the
 	// only correct behavior for time driven triggers.
@@ -449,7 +461,7 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
 		try
 		{
 			_priv->_event = event;
-			rolloverInternal(p);
+			rolloverInternal();
 		}
 		catch (std::exception& ex)
 		{
@@ -460,7 +472,7 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
 		}
 	}
 
-	FileAppender::subAppend(event, p);
+	FileAppender::subAppend( LOG4CXX_APPEND_PARAMETERS );
 }
 
 /**
diff --git a/src/main/cpp/smtpappender.cpp b/src/main/cpp/smtpappender.cpp
index 00be169c..e9605c22 100644
--- a/src/main/cpp/smtpappender.cpp
+++ b/src/main/cpp/smtpappender.cpp
@@ -629,7 +629,7 @@ void SMTPAppender::activateOptions( LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
 Perform SMTPAppender specific appending actions, mainly adding
 the event to a cyclic buffer and checking if the event triggers
 an e-mail to be sent. */
-void SMTPAppender::append(const spi::LoggingEventPtr& event, Pool& p)
+void SMTPAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	if (!checkEntryConditions())
 	{
@@ -643,6 +643,7 @@ void SMTPAppender::append(const spi::LoggingEventPtr& event, Pool& p)
 
 	if (_priv->evaluator->isTriggeringEvent(event))
 	{
+		Pool p;
 		sendBuffer(p);
 	}
 }
diff --git a/src/main/cpp/syslogappender.cpp b/src/main/cpp/syslogappender.cpp
index 5a116274..1217f2d2 100644
--- a/src/main/cpp/syslogappender.cpp
+++ b/src/main/cpp/syslogappender.cpp
@@ -270,16 +270,17 @@ int SyslogAppender::getFacility(
 	}
 }
 
-void SyslogAppender::append(const spi::LoggingEventPtr& event, Pool& p)
+void SyslogAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	if  (!isAsSevereAsThreshold(event->getLevel()))
 	{
 		return;
 	}
 
+	helpers::Pool tempPool;
 	LogString msg;
 	std::string encoded;
-	_priv->layout->format(msg, event, p);
+	_priv->layout->format(msg, event, tempPool);
 
 	Transcoder::encode(msg, encoded);
 
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index e0ddda5c..aabf1ae7 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -270,19 +270,20 @@ void TelnetAppender::writeStatus(const SocketPtr& socket, const LogString& msg,
 	}
 }
 
-void TelnetAppender::append(const spi::LoggingEventPtr& event, Pool& p)
+void TelnetAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	++_priv->eventCount;
 	if (0 < _priv->activeConnections)
 	{
+		helpers::Pool tempPool;
 		LogString msg;
 		if (_priv->layout)
-			_priv->layout->format(msg, event, p);
+			_priv->layout->format(msg, event, tempPool);
 		else
 			msg = event->getRenderedMessage();
 		msg.append(LOG4CXX_STR("\r\n"));
 		size_t bytesSize = msg.size() * 2;
-		char* bytes = p.pstralloc(bytesSize);
+		char* bytes = tempPool.pstralloc(bytesSize);
 
 		LogString::const_iterator msgIter(msg.begin());
 		ByteBuffer buf(bytes, bytesSize);
diff --git a/src/main/cpp/writerappender.cpp b/src/main/cpp/writerappender.cpp
index f86c1b7f..a55eb591 100644
--- a/src/main/cpp/writerappender.cpp
+++ b/src/main/cpp/writerappender.cpp
@@ -88,7 +88,7 @@ void WriterAppender::WriterAppenderPriv::activateOptions()
 	}
 }
 
-void WriterAppender::append(const spi::LoggingEventPtr& event, Pool& pool1)
+void WriterAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 
 	if (!checkEntryConditions())
@@ -96,7 +96,7 @@ void WriterAppender::append(const spi::LoggingEventPtr& event, Pool& pool1)
 		return;
 	}
 
-	subAppend(event, pool1);
+	subAppend( LOG4CXX_APPEND_PARAMETERS );
 }
 
 /**
@@ -215,22 +215,23 @@ void WriterAppender::setEncoding(const LogString& enc)
 	_priv->encoding = enc;
 }
 
-void WriterAppender::subAppend(const spi::LoggingEventPtr& event, Pool& p)
+void WriterAppender::subAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 #if ENABLE_FAILING_APPENDER_SIMULATION_TESTING
 	if (event->getRenderedMessage() == _priv->exceptionTriggeringMessage)
 		throw RuntimeException(LOG4CXX_STR("Simulated fault"));
 #endif
+	Pool tempPool;
 	LogString msg;
-	_priv->layout->format(msg, event, p);
+	_priv->layout->format(msg, event, tempPool);
 
 	if (_priv->writer != NULL)
 	{
-		_priv->writer->write(msg, p);
+		_priv->writer->write(msg, tempPool);
 
 		if (_priv->immediateFlush)
 		{
-			_priv->writer->flush(p);
+			_priv->writer->flush(tempPool);
 		}
 	}
 }
diff --git a/src/main/cpp/xmlsocketappender.cpp b/src/main/cpp/xmlsocketappender.cpp
index 55ccb035..d110a655 100644
--- a/src/main/cpp/xmlsocketappender.cpp
+++ b/src/main/cpp/xmlsocketappender.cpp
@@ -130,10 +130,11 @@ void XMLSocketAppender::XMLSocketAppenderPriv::close()
 	}
 }
 
-void XMLSocketAppender::append(const spi::LoggingEventPtr& event, LOG4CXX_NS::helpers::Pool& p)
+void XMLSocketAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	if (_priv->writer)
 	{
+		Pool p;
 		LogString output;
 		_priv->layout->format(output, event, p);
 
diff --git a/src/main/include/log4cxx/appender.h b/src/main/include/log4cxx/appender.h
index 1289cea0..45878b5c 100644
--- a/src/main/include/log4cxx/appender.h
+++ b/src/main/include/log4cxx/appender.h
@@ -88,9 +88,26 @@ class LOG4CXX_EXPORT Appender
 		 Loggers will call the <code>doAppend</code> method of appender
 		 implementations in order to log.
 		*/
+#if LOG4CXX_ABI_VERSION <= 15
+#define LOG4CXX_APPEND_FORMAL_PARAMETERS const spi::LoggingEventPtr& event, helpers::Pool& p
+#define LOG4CXX_APPEND_PARAMETERS event, p
+		void doAppend(const spi::LoggingEventPtr& event);
+		/**
+		@deprecated The \c pool parameter is not used and will be removed in a future version.
+		Implement this method for now, but plan to migrate to doAppend() without a helpers::Pool parameter.
+		*/
 		virtual void doAppend(const spi::LoggingEventPtr& event,
 			LOG4CXX_NS::helpers::Pool& pool) = 0;
-
+#else
+#define LOG4CXX_APPEND_FORMAL_PARAMETERS const spi::LoggingEventPtr& event
+#define LOG4CXX_APPEND_PARAMETERS event
+		virtual void doAppend(const spi::LoggingEventPtr& event) = 0;
+		/**
+		@deprecated The \c pool parameter is not used and will be removed in a future version.
+		*/
+		[[deprecated("Use doAppend() without a Pool parameter instead")]]
+		void doAppend(const spi::LoggingEventPtr& event, helpers::Pool& pool);
+#endif
 
 		/**
 		 Get the name of this appender. The name uniquely identifies the
diff --git a/src/main/include/log4cxx/appenderskeleton.h b/src/main/include/log4cxx/appenderskeleton.h
index a9557a67..679b9142 100644
--- a/src/main/include/log4cxx/appenderskeleton.h
+++ b/src/main/include/log4cxx/appenderskeleton.h
@@ -52,15 +52,14 @@ class LOG4CXX_EXPORT AppenderSkeleton
 		method to perform actual logging. See also AppenderSkeleton::doAppend
 		method.
 		*/
-		virtual void append(const spi::LoggingEventPtr& event, helpers::Pool& p) = 0;
+		virtual void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) = 0;
 
 		/**
 		* Compare \c event level against the appender threshold and check that \c event is accepted.
 		* If \c event is accepted, delegate log output to the subclass implementation of
 		* the AppenderSkeleton#append method.
 		* */
-		void doAppendImpl(const spi::LoggingEventPtr& event, helpers::Pool& pool);
-
+		void doAppendImpl( LOG4CXX_APPEND_FORMAL_PARAMETERS );
 		/**
 		* Does no attached filter deny \c event or does an attached filter accept \c event?
 		*/
@@ -167,7 +166,7 @@ class LOG4CXX_EXPORT AppenderSkeleton
 		*
 		* Reimplement this method in your appender if you use a different concurrency control technique.
 		* */
-		void doAppend(const spi::LoggingEventPtr& event, helpers::Pool& pool) override;
+		void doAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 		/**
 		Set the {@link spi::ErrorHandler ErrorHandler} for this Appender.
diff --git a/src/main/include/log4cxx/asyncappender.h b/src/main/include/log4cxx/asyncappender.h
index 8ce23ccb..9ba6b520 100644
--- a/src/main/include/log4cxx/asyncappender.h
+++ b/src/main/include/log4cxx/asyncappender.h
@@ -127,15 +127,14 @@ class LOG4CXX_EXPORT AsyncAppender :
 		/**
 		* Call AppenderSkeleton#doAppendImpl without acquiring a lock.
 		*/
-		void doAppend(const spi::LoggingEventPtr& event,
-			helpers::Pool& pool1) override;
+		void doAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 		/**
 		* Add \c event to a ring buffer.
 		* The behaviour when the ring buffer is full
 		* is controlled by the [Blocking property](@ref BlockingProperty) value.
 		*/
-		void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 		/**
 		Close this <code>AsyncAppender</code> by interrupting the
diff --git a/src/main/include/log4cxx/db/dbappender.h b/src/main/include/log4cxx/db/dbappender.h
index 163da909..a56d32b8 100644
--- a/src/main/include/log4cxx/db/dbappender.h
+++ b/src/main/include/log4cxx/db/dbappender.h
@@ -146,7 +146,7 @@ class LOG4CXX_EXPORT DBAppender : public AppenderSkeleton
                 /**
                 * Adds the event to the buffer.  When full the buffer is flushed.
                 */
-                void append(const spi::LoggingEventPtr& event, helpers::Pool&) override;
+                void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
                 void close() override;
 
diff --git a/src/main/include/log4cxx/db/odbcappender.h b/src/main/include/log4cxx/db/odbcappender.h
index 5d4de206..c09fb36b 100644
--- a/src/main/include/log4cxx/db/odbcappender.h
+++ b/src/main/include/log4cxx/db/odbcappender.h
@@ -184,7 +184,7 @@ class LOG4CXX_EXPORT ODBCAppender : public AppenderSkeleton
 		/**
 		* Adds the event to the buffer.  When full the buffer is flushed.
 		*/
-		void append(const spi::LoggingEventPtr& event, helpers::Pool&) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 	protected:
 #if LOG4CXX_ABI_VERSION <= 15
diff --git a/src/main/include/log4cxx/helpers/appenderattachableimpl.h b/src/main/include/log4cxx/helpers/appenderattachableimpl.h
index 289512e9..fceb77f1 100644
--- a/src/main/include/log4cxx/helpers/appenderattachableimpl.h
+++ b/src/main/include/log4cxx/helpers/appenderattachableimpl.h
@@ -63,11 +63,19 @@ class LOG4CXX_EXPORT AppenderAttachableImpl :
 		 */
 		void addAppender(const AppenderPtr newAppender) override;
 
+#if LOG4CXX_ABI_VERSION <= 15
 		/**
 		 Call the <code>doAppend</code> method on all attached appenders.
+		@deprecated This function is deprecated and will be removed in a future version.
 		*/
+		[[ deprecated( "Pool is no longer required" ) ]]
 		int appendLoopOnAppenders(const spi::LoggingEventPtr& event,
 			LOG4CXX_NS::helpers::Pool& p);
+#endif
+		/**
+		 Send \c event to all attached appenders.
+		*/
+		int appendLoopOnAppenders(const spi::LoggingEventPtr& event);
 
 		/**
 		 * Get all previously added appenders as an Enumeration.
diff --git a/src/main/include/log4cxx/logger.h b/src/main/include/log4cxx/logger.h
index 01bad91f..7c801e5c 100644
--- a/src/main/include/log4cxx/logger.h
+++ b/src/main/include/log4cxx/logger.h
@@ -70,6 +70,7 @@ class LOG4CXX_EXPORT Logger
 		*/
 		Logger(const LogString& name);
 #if LOG4CXX_ABI_VERSION <= 15
+		/// @deprecated This function is deprecated and will be removed in a future version.
 		[[ deprecated( "Pool is no longer required" ) ]]
 		Logger(helpers::Pool& pool, const LogString& name);
 #endif
@@ -86,6 +87,7 @@ class LOG4CXX_EXPORT Logger
 		void addAppender(const AppenderPtr newAppender) override;
 
 
+#if LOG4CXX_ABI_VERSION <= 15
 		/**
 		Call the appenders in the hierrachy starting at
 		<code>this</code>.  If no appenders could be found, emit a
@@ -97,8 +99,17 @@ class LOG4CXX_EXPORT Logger
 
 		@param event the event to log.
 		@param p memory pool for any allocations needed to process request.
+		@deprecated This function is deprecated and will be removed in a future version.
 		*/
+		[[ deprecated( "Pool is no longer required" ) ]]
 		void callAppenders(const spi::LoggingEventPtr& event, helpers::Pool& p) const;
+#endif
+		/**
+		Send \c event to all appenders attached to this or attached to a parent of this.
+		If no appenders are found, emit a warning.
+		This method does not check the \c event level.
+		*/
+		void callAppenders(const spi::LoggingEventPtr& event) const;
 
 		/**
 		Close all attached appenders implementing the AppenderAttachable
diff --git a/src/main/include/log4cxx/net/smtpappender.h b/src/main/include/log4cxx/net/smtpappender.h
index f108bec9..d7107697 100644
--- a/src/main/include/log4cxx/net/smtpappender.h
+++ b/src/main/include/log4cxx/net/smtpappender.h
@@ -147,7 +147,7 @@ class LOG4CXX_EXPORT SMTPAppender : public AppenderSkeleton
 		Perform SMTPAppender specific appending actions, mainly adding
 		the event to a cyclic buffer and checking if the event triggers
 		an e-mail to be sent. */
-		void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 
 		void close() override;
diff --git a/src/main/include/log4cxx/net/syslogappender.h b/src/main/include/log4cxx/net/syslogappender.h
index 9b4072c2..a080d662 100644
--- a/src/main/include/log4cxx/net/syslogappender.h
+++ b/src/main/include/log4cxx/net/syslogappender.h
@@ -73,7 +73,7 @@ class LOG4CXX_EXPORT SyslogAppender : public AppenderSkeleton
 		*/
 		static int getFacility(const LogString& facilityName);
 
-		void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 #if LOG4CXX_ABI_VERSION <= 15
 		/**
diff --git a/src/main/include/log4cxx/net/telnetappender.h b/src/main/include/log4cxx/net/telnetappender.h
index e52bb6c9..4f1fc705 100644
--- a/src/main/include/log4cxx/net/telnetappender.h
+++ b/src/main/include/log4cxx/net/telnetappender.h
@@ -168,7 +168,7 @@ class LOG4CXX_EXPORT TelnetAppender : public AppenderSkeleton
 	protected:
 		/** Send \c event to each connected client.
 		*/
-		void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 	private:
 		//   prevent copy and assignment statements
diff --git a/src/main/include/log4cxx/net/xmlsocketappender.h b/src/main/include/log4cxx/net/xmlsocketappender.h
index 5985611c..f22f036f 100644
--- a/src/main/include/log4cxx/net/xmlsocketappender.h
+++ b/src/main/include/log4cxx/net/xmlsocketappender.h
@@ -145,7 +145,7 @@ class LOG4CXX_EXPORT XMLSocketAppender : public SocketAppenderSkeleton
 
 		int getDefaultPort() const override;
 
-		void append(const spi::LoggingEventPtr& event, helpers::Pool& pool) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 	private:
 		//  prevent copy and assignment statements
diff --git a/src/main/include/log4cxx/nt/nteventlogappender.h b/src/main/include/log4cxx/nt/nteventlogappender.h
index 3f755fa4..2ebbf969 100644
--- a/src/main/include/log4cxx/nt/nteventlogappender.h
+++ b/src/main/include/log4cxx/nt/nteventlogappender.h
@@ -99,7 +99,7 @@ class LOG4CXX_EXPORT NTEventLogAppender : public AppenderSkeleton
 		typedef void SID;
 		typedef void* HANDLE;
 
-		void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 		static unsigned short getEventType(const spi::LoggingEventPtr& event);
 		static unsigned short getEventCategory(const spi::LoggingEventPtr& event);
 		/*
diff --git a/src/main/include/log4cxx/nt/outputdebugstringappender.h b/src/main/include/log4cxx/nt/outputdebugstringappender.h
index 4b68e6c8..24ca2410 100644
--- a/src/main/include/log4cxx/nt/outputdebugstringappender.h
+++ b/src/main/include/log4cxx/nt/outputdebugstringappender.h
@@ -42,7 +42,7 @@ class LOG4CXX_EXPORT OutputDebugStringAppender : public AppenderSkeleton
 
 		void close() override {}
 
-		void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 };
 }
 }
diff --git a/src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h b/src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
index 7ce9d8c5..f2d7291f 100644
--- a/src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
+++ b/src/main/include/log4cxx/rolling/multiprocessrollingfileappender.h
@@ -72,14 +72,17 @@ class LOG4CXX_EXPORT MultiprocessRollingFileAppender : public RollingFileAppende
 		   <code>File</code> is truncated with no backup files created.
 
 		 */
-		bool rollover(helpers::Pool& p);
+		bool rollover();
+#if LOG4CXX_ABI_VERSION <= 15
+		bool rollover(LOG4CXX_NS::helpers::Pool& p);
+#endif
 
 	protected:
 
 		/**
 		 Actual writing occurs here.
 		*/
-		void subAppend(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void subAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 	protected:
 		/**
@@ -99,7 +102,10 @@ class LOG4CXX_EXPORT MultiprocessRollingFileAppender : public RollingFileAppende
 
 		 * @return true if this process perfomed the rollover.
 		 */
+		bool synchronizedRollover(const TriggeringPolicyPtr& trigger = TriggeringPolicyPtr() );
+#if LOG4CXX_ABI_VERSION <= 15
 		bool synchronizedRollover(helpers::Pool& p, const TriggeringPolicyPtr& trigger = TriggeringPolicyPtr() );
+#endif
 
 		/**
 		 * Set the length of current active log file to \c length bytes.
diff --git a/src/main/include/log4cxx/rolling/rollingfileappender.h b/src/main/include/log4cxx/rolling/rollingfileappender.h
index a6353dd1..7d0fa0dd 100644
--- a/src/main/include/log4cxx/rolling/rollingfileappender.h
+++ b/src/main/include/log4cxx/rolling/rollingfileappender.h
@@ -169,16 +169,22 @@ class LOG4CXX_EXPORT RollingFileAppender : public FileAppender
 		   <code>File</code> is truncated with no backup files created.
 
 		 */
+		bool rollover();
+#if LOG4CXX_ABI_VERSION <= 15
 		bool rollover(LOG4CXX_NS::helpers::Pool& p);
+#endif
 
 	protected:
 
 		/**
 		 Actual writing occurs here.
 		*/
-		void subAppend(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void subAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
+		bool rolloverInternal();
+#if LOG4CXX_ABI_VERSION <= 15
 		bool rolloverInternal(LOG4CXX_NS::helpers::Pool& p);
+#endif
 
 	public:
 		/**
diff --git a/src/main/include/log4cxx/writerappender.h b/src/main/include/log4cxx/writerappender.h
index 3e38f83a..ddb0f888 100644
--- a/src/main/include/log4cxx/writerappender.h
+++ b/src/main/include/log4cxx/writerappender.h
@@ -93,7 +93,7 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
 		layout.
 
 		*/
-		void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 
 	protected:
@@ -181,7 +181,7 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
 		/**
 		 Actual writing occurs here.
 		*/
-		virtual void subAppend(const spi::LoggingEventPtr& event, helpers::Pool& p);
+		virtual void subAppend( LOG4CXX_APPEND_FORMAL_PARAMETERS );
 
 
 #if LOG4CXX_ABI_VERSION <= 15
diff --git a/src/site/doxy/Doxyfile.in b/src/site/doxy/Doxyfile.in
index 56c21fcc..6afae8be 100644
--- a/src/site/doxy/Doxyfile.in
+++ b/src/site/doxy/Doxyfile.in
@@ -2350,10 +2350,13 @@ PREDEFINED             = LOG4CXX_NS=log4cxx \
                          LOG4CXX_UNICHAR_API \
                          LOG4CXX_CFSTRING_API \
                          LOG4CXX_ABI_VERSION=@log4cxx_ABI_VER@ \
-                         LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS=helpers::Pool& p \
+                         LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS="helpers::Pool& p" \
                          LOG4CXX_ACTIVATE_OPTIONS_PARAMETER=p \
+                         LOG4CXX_APPEND_FORMAL_PARAMETERS="const spi::LoggingEventPtr& event, helpers::Pool& p" \
+                         LOG4CXX_APPEND_PARAMETERS="event, p" \
                          LOG4CXX_HAS_DOMCONFIGURATOR=1 \
-                         LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT=1
+                         LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT=1 \
+                         __LOG4CXX_FUNC__=compiler_dependent
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
diff --git a/src/test/cpp/asyncappendertestcase.cpp b/src/test/cpp/asyncappendertestcase.cpp
index 4fce26e8..265eced6 100644
--- a/src/test/cpp/asyncappendertestcase.cpp
+++ b/src/test/cpp/asyncappendertestcase.cpp
@@ -77,7 +77,7 @@ class NullPointerAppender : public AppenderSkeleton
 		/**
 		 * @{inheritDoc}
 		 */
-		void append(const spi::LoggingEventPtr&, LOG4CXX_NS::helpers::Pool&) override
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override
 		{
 			throw RuntimeException(LOG4CXX_STR("Intentional Exception"));
 		}
@@ -110,10 +110,10 @@ class BlockableVectorAppender : public VectorAppender
 		/**
 		 * {@inheritDoc}
 		 */
-		void append(const spi::LoggingEventPtr& event, LOG4CXX_NS::helpers::Pool& p) override
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override
 		{
 			std::lock_guard<std::mutex> lock( blocker );
-			VectorAppender::append(event, p);
+			VectorAppender::append( LOG4CXX_APPEND_PARAMETERS );
 		}
 
 		std::mutex& getBlocker()
@@ -130,10 +130,10 @@ LOG4CXX_PTR_DEF(BlockableVectorAppender);
 class LoggingVectorAppender : public VectorAppender
 {
 	LoggerInstancePtr logger{ "LoggingVectorAppender" };
-	void append(const spi::LoggingEventPtr& event, LOG4CXX_NS::helpers::Pool& p) override
+	void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override
 	{
 		auto& lsMsg = event->getRenderedMessage();
-		VectorAppender::append(event, p);
+		VectorAppender::append( LOG4CXX_APPEND_PARAMETERS );
 		if (LogString::npos != lsMsg.find(LOG4CXX_STR("World")))
 		{
 			LOG4CXX_LOGLS(logger, Level::getError(), LOG4CXX_STR("Some appender error"));
diff --git a/src/test/cpp/benchmark/benchmark.cpp b/src/test/cpp/benchmark/benchmark.cpp
index 40658774..15b6263c 100644
--- a/src/test/cpp/benchmark/benchmark.cpp
+++ b/src/test/cpp/benchmark/benchmark.cpp
@@ -43,7 +43,7 @@ public:
 		return true;
 	}
 
-	void append(const spi::LoggingEventPtr& event, helpers::Pool& p) override
+	void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override
 	{
 		LogString buf;
 		m_priv->layout->format(buf, event, p);
diff --git a/src/test/cpp/loggertestcase.cpp b/src/test/cpp/loggertestcase.cpp
index 03671609..cee5aef7 100644
--- a/src/test/cpp/loggertestcase.cpp
+++ b/src/test/cpp/loggertestcase.cpp
@@ -50,7 +50,7 @@ class CountingAppender : public AppenderSkeleton
 		void close() override
 		{}
 
-		void append(const spi::LoggingEventPtr& /*event*/, Pool& /*p*/) override
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override
 		{
 			counter++;
 		}
diff --git a/src/test/cpp/nt/nteventlogappendertestcase.cpp b/src/test/cpp/nt/nteventlogappendertestcase.cpp
index 01bd6101..d9e5fcb1 100644
--- a/src/test/cpp/nt/nteventlogappendertestcase.cpp
+++ b/src/test/cpp/nt/nteventlogappendertestcase.cpp
@@ -75,10 +75,10 @@ class NTEventLogAppenderTestCase : public AppenderSkeletonTestCase
 			}
 
 
-			Pool p;
 			Date now;
 			DWORD expectedTime = now.getTime() / Date::getMicrosecondsPerSecond();
 			{
+				Pool p;
 				NTEventLogAppenderPtr appender(new NTEventLogAppender());
 				appender->setSource(LOG4CXX_STR("log4cxx_test"));
 				LayoutPtr layout(new PatternLayout(LOG4CXX_STR("%c - %m%n")));
@@ -87,7 +87,7 @@ class NTEventLogAppenderTestCase : public AppenderSkeletonTestCase
 
 				LoggingEventPtr event(new LoggingEvent(
 						LOG4CXX_STR("org.foobar"), Level::getInfo(), LOG4CXX_STR("Hello,  World"), LOG4CXX_LOCATION));
-				appender->doAppend(event, p);
+				appender->doAppend( LOG4CXX_APPEND_PARAMETERS );
 			}
 			hEventLog = ::OpenEventLogW(NULL, L"log4cxx_test");
 			LOGUNIT_ASSERT(hEventLog != NULL);
diff --git a/src/test/cpp/optionhandlertest.cpp b/src/test/cpp/optionhandlertest.cpp
index c4483ff4..9e4d2206 100644
--- a/src/test/cpp/optionhandlertest.cpp
+++ b/src/test/cpp/optionhandlertest.cpp
@@ -34,7 +34,7 @@ public:
 	void close() override
 	{}
 
-	void append(const spi::LoggingEventPtr& /*event*/, helpers::Pool& /*p*/) override
+	void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override
 	{
 		helpers::LogLog::debug(LOG4CXX_STR("ABI_15_Appender::append"));
 	}
@@ -66,7 +66,7 @@ public:
 	void close() override
 	{}
 
-	void append(const spi::LoggingEventPtr& /*event*/, helpers::Pool& /*p*/) override
+	void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override
 	{
 		helpers::LogLog::debug(LOG4CXX_STR("BaseAppender::append"));
 	}
diff --git a/src/test/cpp/vectorappender.cpp b/src/test/cpp/vectorappender.cpp
index aa7999a3..6e8f95f5 100644
--- a/src/test/cpp/vectorappender.cpp
+++ b/src/test/cpp/vectorappender.cpp
@@ -24,7 +24,7 @@ using namespace log4cxx::helpers;
 
 IMPLEMENT_LOG4CXX_OBJECT(VectorAppender)
 
-void VectorAppender::append(const spi::LoggingEventPtr& event, Pool& /*p*/)
+void VectorAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
 	if (0 < this->appendMillisecondDelay)
 		std::this_thread::sleep_for( std::chrono::milliseconds( this->appendMillisecondDelay ) );
diff --git a/src/test/cpp/vectorappender.h b/src/test/cpp/vectorappender.h
index 25c47814..272907c8 100644
--- a/src/test/cpp/vectorappender.h
+++ b/src/test/cpp/vectorappender.h
@@ -42,7 +42,7 @@ class VectorAppender : public AppenderSkeleton
 		This method is called by the AppenderSkeleton#doAppend
 		method.
 		*/
-		void append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& p) override;
+		void append( LOG4CXX_APPEND_FORMAL_PARAMETERS ) override;
 
 		const std::vector<spi::LoggingEventPtr>& getVector() const
 		{