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/03/07 06:31:36 UTC
(logging-log4cxx) branch simplify_appender_interface created (now a74f8e79)
This is an automated email from the ASF dual-hosted git repository.
swebb2066 pushed a change to branch simplify_appender_interface
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
at a74f8e79 Deprecate AppenderSkeleton::finalize in the next ABI version
This branch includes the following new commits:
new a74f8e79 Deprecate AppenderSkeleton::finalize in the next 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: Deprecate AppenderSkeleton::finalize in the next 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 simplify_appender_interface
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
commit a74f8e79d40121f42ecc7bba08ad9ba21a9c80ac
Author: Stephen Webb <sw...@gmail.com>
AuthorDate: Sat Mar 7 17:31:09 2026 +1100
Deprecate AppenderSkeleton::finalize in the next ABI version
---
src/main/cpp/appenderskeleton.cpp | 2 +
src/main/cpp/asyncappender.cpp | 22 ++++---
src/main/cpp/consoleappender.cpp | 9 +--
src/main/cpp/dbappender.cpp | 20 ++++--
src/main/cpp/fileappender.cpp | 7 +--
src/main/cpp/multiprocessrollingfileappender.cpp | 8 +--
src/main/cpp/nteventlogappender.cpp | 7 ++-
src/main/cpp/odbcappender.cpp | 64 +++++++++++--------
src/main/cpp/rollingfileappender.cpp | 8 +--
src/main/cpp/smtpappender.cpp | 2 +-
src/main/cpp/socketappenderskeleton.cpp | 8 +--
src/main/cpp/syslogappender.cpp | 2 +-
src/main/cpp/telnetappender.cpp | 27 +++++---
src/main/cpp/writerappender.cpp | 71 +++++++++++++---------
src/main/cpp/xmlsocketappender.cpp | 19 ++++--
src/main/include/log4cxx/appenderskeleton.h | 4 +-
.../include/log4cxx/net/socketappenderskeleton.h | 3 +-
src/main/include/log4cxx/net/xmlsocketappender.h | 3 +-
.../include/log4cxx/private/odbcappender_priv.h | 3 +
.../log4cxx/private/socketappenderskeleton_priv.h | 7 ++-
.../include/log4cxx/private/writerappender_priv.h | 10 +++
src/main/include/log4cxx/writerappender.h | 7 ++-
22 files changed, 196 insertions(+), 117 deletions(-)
diff --git a/src/main/cpp/appenderskeleton.cpp b/src/main/cpp/appenderskeleton.cpp
index ec7c44f7..12c083fd 100644
--- a/src/main/cpp/appenderskeleton.cpp
+++ b/src/main/cpp/appenderskeleton.cpp
@@ -50,6 +50,7 @@ AppenderSkeleton::AppenderSkeleton(const LayoutPtr& layout)
AppenderSkeleton::~AppenderSkeleton() {}
+#if LOG4CXX_ABI_VERSION <= 15
void AppenderSkeleton::finalize()
{
// An appender might be closed then garbage collected. There is no
@@ -61,6 +62,7 @@ void AppenderSkeleton::finalize()
close();
}
+#endif
void AppenderSkeleton::addFilter(const spi::FilterPtr newFilter)
{
diff --git a/src/main/cpp/asyncappender.cpp b/src/main/cpp/asyncappender.cpp
index 8443d46f..546bd7c6 100644
--- a/src/main/cpp/asyncappender.cpp
+++ b/src/main/cpp/asyncappender.cpp
@@ -135,6 +135,7 @@ typedef std::map<LogString, DiscardSummary> DiscardMap;
struct AsyncAppender::AsyncAppenderPriv : public AppenderSkeleton::AppenderSkeletonPrivate
{
+ using BaseType = AppenderSkeleton::AppenderSkeletonPrivate;
AsyncAppenderPriv()
: AppenderSkeletonPrivate()
, buffer(DEFAULT_BUFFER_SIZE)
@@ -152,7 +153,8 @@ struct AsyncAppender::AsyncAppenderPriv : public AppenderSkeleton::AppenderSkele
~AsyncAppenderPriv()
{
- stopDispatcher();
+ if (setClosed())
+ close();
}
/**
@@ -195,7 +197,6 @@ struct AsyncAppender::AsyncAppenderPriv : public AppenderSkeleton::AppenderSkele
void stopDispatcher()
{
- this->setClosed();
bufferNotEmpty.notify_all();
bufferNotFull.notify_all();
@@ -205,6 +206,8 @@ struct AsyncAppender::AsyncAppenderPriv : public AppenderSkeleton::AppenderSkele
}
}
+ void close();
+
/**
* Should location info be included in dispatched messages.
*/
@@ -240,10 +243,10 @@ struct AsyncAppender::AsyncAppenderPriv : public AppenderSkeleton::AppenderSkele
return this->closed;
}
- void setClosed()
+ bool setClosed()
{
std::lock_guard<std::mutex> lock(this->bufferMutex);
- this->closed = true;
+ return BaseType::setClosed();
}
/**
@@ -264,7 +267,6 @@ AsyncAppender::AsyncAppender()
AsyncAppender::~AsyncAppender()
{
- finalize();
}
void AsyncAppender::addAppender(const AppenderPtr newAppender)
@@ -402,8 +404,14 @@ void AsyncAppender::append(const spi::LoggingEventPtr& event, Pool& p)
void AsyncAppender::close()
{
- priv->stopDispatcher();
- for (auto item : priv->appenders.getAllAppenders())
+ if (priv->setClosed())
+ priv->close();
+}
+
+void AsyncAppender::AsyncAppenderPriv::close()
+{
+ this->stopDispatcher();
+ for (auto item : this->appenders.getAllAppenders())
{
item->close();
}
diff --git a/src/main/cpp/consoleappender.cpp b/src/main/cpp/consoleappender.cpp
index 9e5b5b83..87d0a007 100644
--- a/src/main/cpp/consoleappender.cpp
+++ b/src/main/cpp/consoleappender.cpp
@@ -50,7 +50,7 @@ ConsoleAppender::ConsoleAppender(const LayoutPtr& layout)
{
setLayout(layout);
Pool p;
- setWriter(std::make_shared<SystemOutWriter>());
+ _priv->setWriter(std::make_shared<SystemOutWriter>());
WriterAppender::activateOptions(p);
}
@@ -65,7 +65,6 @@ ConsoleAppender::ConsoleAppender(const LayoutPtr& layout, const LogString& targe
ConsoleAppender::~ConsoleAppender()
{
- finalize();
}
const LogString& ConsoleAppender::getSystemOut()
@@ -117,14 +116,12 @@ void ConsoleAppender::activateOptions(Pool& p)
if (StringHelper::equalsIgnoreCase(_priv->target,
LOG4CXX_STR("SYSTEM.OUT"), LOG4CXX_STR("system.out")))
{
- WriterPtr writer1 = std::make_shared<SystemOutWriter>();
- setWriter(writer1);
+ _priv->setWriter(std::make_shared<SystemOutWriter>());
}
else if (StringHelper::equalsIgnoreCase(_priv->target,
LOG4CXX_STR("SYSTEM.ERR"), LOG4CXX_STR("system.err")))
{
- WriterPtr writer1 = std::make_shared<SystemErrWriter>();
- setWriter(writer1);
+ _priv->setWriter(std::make_shared<SystemErrWriter>());
}
WriterAppender::activateOptions(p);
diff --git a/src/main/cpp/dbappender.cpp b/src/main/cpp/dbappender.cpp
index 846c79b3..ed3582c2 100644
--- a/src/main/cpp/dbappender.cpp
+++ b/src/main/cpp/dbappender.cpp
@@ -72,6 +72,8 @@ struct DBAppender::DBAppenderPriv : public AppenderSkeleton::AppenderSkeletonPri
std::string sqlStatement;
Pool m_pool;
std::vector<pattern::LoggingEventPatternConverterPtr> converters;
+
+ void close();
};
#define RULES_PUT(spec, cls) \
@@ -106,17 +108,23 @@ DBAppender::DBAppender()
DBAppender::~DBAppender()
{
- close();
+ if (_priv->setClosed())
+ _priv->close();
}
void DBAppender::close()
{
- _priv->setClosed();
- if(_priv->m_driver && _priv->m_databaseHandle){
- apr_dbd_close(_priv->m_driver, _priv->m_databaseHandle);
+ if (_priv->setClosed())
+ _priv->close();
+}
+
+void DBAppender::DBAppenderPriv::close()
+{
+ if(this->m_driver && this->m_databaseHandle){
+ apr_dbd_close(this->m_driver, this->m_databaseHandle);
}
- _priv->m_driver = nullptr;
- _priv->m_databaseHandle = nullptr;
+ this->m_driver = nullptr;
+ this->m_databaseHandle = nullptr;
}
void DBAppender::setOption(const LogString& option, const LogString& value){
diff --git a/src/main/cpp/fileappender.cpp b/src/main/cpp/fileappender.cpp
index b2350c73..0f7fc249 100644
--- a/src/main/cpp/fileappender.cpp
+++ b/src/main/cpp/fileappender.cpp
@@ -81,7 +81,6 @@ FileAppender::FileAppender(std::unique_ptr<FileAppenderPriv> priv)
FileAppender::~FileAppender()
{
- finalize();
if (auto p = _priv->taskManager.lock())
p->value().removePeriodicTask(getName());
}
@@ -297,7 +296,7 @@ void FileAppender::setFileInternal(
setImmediateFlush(false);
}
- closeWriter();
+ _priv->close();
bool writeBOM = false;
@@ -367,13 +366,13 @@ void FileAppender::setFileInternal(
newWriter = std::make_shared<BufferedWriter>(newWriter, bufferSize1);
}
- setWriterInternal(newWriter);
+ _priv->setWriter(newWriter);
_priv->fileAppend = append1;
_priv->bufferedIO = bufferedIO1;
_priv->fileName = filename;
_priv->bufferSize = (int)bufferSize1;
- writeHeader(p);
+ _priv->writeHeader();
}
diff --git a/src/main/cpp/multiprocessrollingfileappender.cpp b/src/main/cpp/multiprocessrollingfileappender.cpp
index 9b1f061f..590e9003 100644
--- a/src/main/cpp/multiprocessrollingfileappender.cpp
+++ b/src/main/cpp/multiprocessrollingfileappender.cpp
@@ -273,7 +273,7 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
;
else if (auto rollover1 = _priv->rollingPolicy->rollover(fileName, getAppend(), p))
{
- closeWriter();
+ _priv->close();
if (rollover1->getActiveFileName() == fileName)
{
bool success = true; // A synchronous action is not required
@@ -326,7 +326,7 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
( rollover1->getActiveFileName()
, rollover1->getAppend()
);
- setWriterInternal(createWriter(os));
+ _priv->setWriter(createWriter(os));
bool success = true; // A synchronous action is not required
if (auto pAction = rollover1->getSynchronous())
@@ -372,7 +372,7 @@ bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const Trigge
*/
void MultiprocessRollingFileAppender::reopenFile(const LogString& fileName)
{
- closeWriter();
+ _priv->close();
#if USING_ROLLOVER_REQUIRED_CHECK_IS_FASTER
if (auto pTimeBased = LOG4CXX_NS::cast<TimeBasedRollingPolicy>(_priv->rollingPolicy))
pTimeBased->loadLastFileName();
@@ -380,7 +380,7 @@ void MultiprocessRollingFileAppender::reopenFile(const LogString& fileName)
OutputStreamPtr os = std::make_shared<FileOutputStream>(fileName, true);
WriterPtr newWriter(createWriter(os));
setFile(fileName);
- setWriter(newWriter);
+ _priv->setWriter(newWriter);
}
/**
diff --git a/src/main/cpp/nteventlogappender.cpp b/src/main/cpp/nteventlogappender.cpp
index e00ff4a4..ef3dd59f 100644
--- a/src/main/cpp/nteventlogappender.cpp
+++ b/src/main/cpp/nteventlogappender.cpp
@@ -129,14 +129,15 @@ NTEventLogAppender::NTEventLogAppender(const LogString& server, const LogString&
NTEventLogAppender::~NTEventLogAppender()
{
- finalize();
+ if (priv->setClosed())
+ priv->close();
}
void NTEventLogAppender::close()
{
- priv->setClosed();
- priv->close();
+ if (priv->setClosed())
+ priv->close();
}
void NTEventLogAppender::NTEventLogAppenderPrivate::close()
diff --git a/src/main/cpp/odbcappender.cpp b/src/main/cpp/odbcappender.cpp
index 4616b2f8..6421ccec 100644
--- a/src/main/cpp/odbcappender.cpp
+++ b/src/main/cpp/odbcappender.cpp
@@ -123,9 +123,9 @@ ODBCAppender::ODBCAppender()
#if LOG4CXX_EVENTS_AT_EXIT
[this] {
std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
- if(_priv->closed)
- return;
- try
+ if(_priv->buffer.empty() || _priv->closed)
+ ;
+ else try
{
flushBuffer(_priv->pool);
}
@@ -142,7 +142,8 @@ ODBCAppender::ODBCAppender()
ODBCAppender::~ODBCAppender()
{
- finalize();
+ if (_priv->setClosed())
+ _priv->close();
}
#define RULES_PUT(spec, cls) \
@@ -376,35 +377,41 @@ ODBCAppender::SQLHDBC ODBCAppender::getConnection(LOG4CXX_NS::helpers::Pool& p)
void ODBCAppender::close()
{
- if (_priv->closed)
+ if (_priv->setClosed())
{
- return;
+ if (!_priv->buffer.empty() && 0 == _priv->preparedStatement)
+ {
+ Pool p;
+ _priv->setPreparedStatement(getConnection(p), p);
+ }
+ _priv->close();
}
+}
- Pool p;
-
+void ODBCAppender::ODBCAppenderPriv::close()
+{
try
{
+ Pool p;
flushBuffer(p);
}
catch (SQLException& e)
{
- _priv->errorHandler->error(LOG4CXX_STR("Error closing connection"),
+ this->errorHandler->error(LOG4CXX_STR("Error closing connection"),
e, ErrorCode::GENERIC_FAILURE);
}
- _priv->setClosed();
#if LOG4CXX_HAVE_ODBC
- if (_priv->connection != SQL_NULL_HDBC)
+ if (this->connection != SQL_NULL_HDBC)
{
- SQLDisconnect(_priv->connection);
- SQLFreeHandle(SQL_HANDLE_DBC, _priv->connection);
+ SQLDisconnect(this->connection);
+ SQLFreeHandle(SQL_HANDLE_DBC, this->connection);
}
- if (_priv->env != SQL_NULL_HENV)
+ if (this->env != SQL_NULL_HENV)
{
- SQLFreeHandle(SQL_HANDLE_ENV, _priv->env);
+ SQLFreeHandle(SQL_HANDLE_ENV, this->env);
}
#endif
@@ -585,32 +592,39 @@ void ODBCAppender::ODBCAppenderPriv::setParameterValues(const spi::LoggingEventP
void ODBCAppender::flushBuffer(Pool& p)
{
- for (auto& logEvent : _priv->buffer)
+ if (0 == _priv->preparedStatement)
+ _priv->setPreparedStatement(getConnection(p), p);
+ _priv->flushBuffer(p);
+}
+
+void ODBCAppender::ODBCAppenderPriv::flushBuffer(Pool& p)
+{
+ if (0 == this->preparedStatement)
+ ;
+ else for (auto& logEvent : this->buffer)
{
- if (_priv->parameterValue.empty())
- _priv->errorHandler->error(LOG4CXX_STR("ODBCAppender column mappings not defined"));
+ if (this->parameterValue.empty())
+ this->errorHandler->error(LOG4CXX_STR("ODBCAppender column mappings not defined"));
#if LOG4CXX_HAVE_ODBC
else try
{
- if (0 == _priv->preparedStatement)
- _priv->setPreparedStatement(getConnection(p), p);
- _priv->setParameterValues(logEvent, p);
- auto ret = SQLExecute(_priv->preparedStatement);
+ this->setParameterValues(logEvent, p);
+ auto ret = SQLExecute(this->preparedStatement);
if (ret < 0)
{
- throw SQLException(SQL_HANDLE_STMT, _priv->preparedStatement, "Failed to execute prepared statement", p);
+ throw SQLException(SQL_HANDLE_STMT, this->preparedStatement, "Failed to execute prepared statement", p);
}
}
catch (SQLException& e)
{
- _priv->errorHandler->error(LOG4CXX_STR("Failed to execute sql"), e,
+ this->errorHandler->error(LOG4CXX_STR("Failed to execute sql"), e,
ErrorCode::FLUSH_FAILURE);
}
#endif
}
// clear the buffer of reported events
- _priv->buffer.clear();
+ this->buffer.clear();
}
void ODBCAppender::setSql(const LogString& s)
diff --git a/src/main/cpp/rollingfileappender.cpp b/src/main/cpp/rollingfileappender.cpp
index 4112864c..657546e5 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/rollingfileappender.cpp
@@ -298,7 +298,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
{
if (rollover1->getActiveFileName() == getFile())
{
- closeWriter();
+ _priv->close();
bool success = true;
@@ -353,7 +353,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
}
else
{
- closeWriter();
+ _priv->close();
setFileInternal(rollover1->getActiveFileName());
// Call activateOptions to create any intermediate directories(if required)
FileAppender::activateOptionsInternal(p);
@@ -361,7 +361,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
( rollover1->getActiveFileName()
, rollover1->getAppend()
);
- setWriterInternal(createWriter(os));
+ _priv->setWriter(createWriter(os));
bool success = true;
@@ -401,7 +401,7 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
}
}
- writeHeader(p);
+ _priv->writeHeader();
}
return true;
}
diff --git a/src/main/cpp/smtpappender.cpp b/src/main/cpp/smtpappender.cpp
index fdf3c489..1165f2e0 100644
--- a/src/main/cpp/smtpappender.cpp
+++ b/src/main/cpp/smtpappender.cpp
@@ -432,7 +432,7 @@ SMTPAppender::SMTPAppender(spi::TriggeringEventEvaluatorPtr evaluator)
SMTPAppender::~SMTPAppender()
{
- finalize();
+ _priv->setClosed();
}
bool SMTPAppender::requiresLayout() const
diff --git a/src/main/cpp/socketappenderskeleton.cpp b/src/main/cpp/socketappenderskeleton.cpp
index 896c8061..a1a0d8b6 100644
--- a/src/main/cpp/socketappenderskeleton.cpp
+++ b/src/main/cpp/socketappenderskeleton.cpp
@@ -58,7 +58,6 @@ SocketAppenderSkeleton::SocketAppenderSkeleton(std::unique_ptr<SocketAppenderSke
SocketAppenderSkeleton::~SocketAppenderSkeleton()
{
- finalize();
}
void SocketAppenderSkeleton::activateOptions(Pool& p)
@@ -69,8 +68,8 @@ void SocketAppenderSkeleton::activateOptions(Pool& p)
void SocketAppenderSkeleton::close()
{
- _priv->stopMonitor();
- cleanUp(_priv->pool);
+ if (_priv->setClosed())
+ _priv->close();
}
void SocketAppenderSkeleton::connect(Pool& p)
@@ -233,9 +232,8 @@ void SocketAppenderSkeleton::retryConnect()
}
}
-void SocketAppenderSkeleton::SocketAppenderSkeletonPriv::stopMonitor()
+void SocketAppenderSkeleton::SocketAppenderSkeletonPriv::close()
{
- this->setClosed();
if (this->taskName.empty())
;
else if (auto pManager = this->taskManager.lock())
diff --git a/src/main/cpp/syslogappender.cpp b/src/main/cpp/syslogappender.cpp
index a7d746b4..ccc77a34 100644
--- a/src/main/cpp/syslogappender.cpp
+++ b/src/main/cpp/syslogappender.cpp
@@ -63,7 +63,7 @@ SyslogAppender::SyslogAppender(const LayoutPtr& layout1,
SyslogAppender::~SyslogAppender()
{
- finalize();
+ _priv->setClosed();
}
/** Release any resources held by this SyslogAppender.*/
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index 40506ee0..8ceb248d 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -82,8 +82,6 @@ struct TelnetAppender::TelnetAppenderPriv : public AppenderSkeletonPrivate
void stopAcceptingConnections()
{
- if (!this->setClosed())
- return;
if (!this->serverSocket)
return;
// Interrupt accept()
@@ -97,6 +95,8 @@ struct TelnetAppender::TelnetAppenderPriv : public AppenderSkeletonPrivate
if (this->sh.joinable())
this->sh.join();
}
+
+ void close();
};
#define _priv static_cast<TelnetAppenderPriv*>(m_priv.get())
@@ -114,7 +114,8 @@ TelnetAppender::TelnetAppender()
TelnetAppender::~TelnetAppender()
{
- finalize();
+ if (_priv->setClosed())
+ _priv->close();
}
void TelnetAppender::activateOptions(Pool& /* p */)
@@ -178,24 +179,30 @@ void TelnetAppender::setEncoding(const LogString& value)
void TelnetAppender::close()
{
- _priv->stopAcceptingConnections();
- std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
- if (_priv->eventCount && helpers::LogLog::isDebugEnabled())
+ if (_priv->setClosed())
+ _priv->close();
+}
+
+void TelnetAppender::TelnetAppenderPriv::close()
+{
+ this->stopAcceptingConnections();
+ std::lock_guard<std::recursive_mutex> lock(this->mutex);
+ if (this->eventCount && helpers::LogLog::isDebugEnabled())
{
Pool p;
LogString msg = LOG4CXX_STR("TelnetAppender eventCount ");
- helpers::StringHelper::toString(_priv->eventCount, p, msg);
+ helpers::StringHelper::toString(this->eventCount, p, msg);
helpers::LogLog::debug(msg);
}
SocketPtr nullSocket;
int connectionNumber{ 0 };
- for (auto& item : _priv->connections)
+ for (auto& item : this->connections)
{
++connectionNumber;
if (item.s)
{
item.s->close();
- if (_priv->eventCount && helpers::LogLog::isDebugEnabled())
+ if (this->eventCount && helpers::LogLog::isDebugEnabled())
{
Pool p;
LogString msg = LOG4CXX_STR("TelnetAppender connection ");
@@ -207,7 +214,7 @@ void TelnetAppender::close()
item = Connection{ nullSocket, 0 };
}
}
- _priv->activeConnections = 0;
+ this->activeConnections = 0;
}
diff --git a/src/main/cpp/writerappender.cpp b/src/main/cpp/writerappender.cpp
index 7830fbd6..c5b02877 100644
--- a/src/main/cpp/writerappender.cpp
+++ b/src/main/cpp/writerappender.cpp
@@ -65,7 +65,8 @@ WriterAppender::WriterAppender(std::unique_ptr<WriterAppenderPriv> priv)
WriterAppender::~WriterAppender()
{
- finalize();
+ if (_priv->setClosed())
+ _priv->close();
}
void WriterAppender::activateOptions(Pool& p)
@@ -134,33 +135,25 @@ bool WriterAppender::WriterAppenderPriv::checkWriter()
return true;
}
-
-
-
-/**
- Close this appender instance. The underlying stream or writer is
- also closed.
-
- <p>Closed appenders cannot be reused.
-
- @see #setWriter
- */
void WriterAppender::close()
{
- if (!_priv->setClosed())
- {
- return;
- }
-
- closeWriter();
+ if (_priv->setClosed())
+ _priv->close();
}
+#if LOG4CXX_ABI_VERSION <= 15
/**
* Close the underlying {@link java.io.Writer}.
* */
void WriterAppender::closeWriter()
{
- if (_priv->writer != NULL)
+ _priv->close();
+}
+#endif
+
+void WriterAppender::WriterAppenderPriv::close()
+{
+ if (this->writer != NULL)
{
try
{
@@ -169,13 +162,13 @@ void WriterAppender::closeWriter()
// Using the object's pool since this is a one-shot operation
// and pool is likely to be reclaimed soon when appender is destructed.
//
- writeFooter(_priv->pool);
- _priv->writer->close(_priv->pool);
- _priv->writer = 0;
+ this->writeFooter();
+ this->writer->close(this->pool);
+ this->writer = 0;
}
catch (IOException& e)
{
- LogLog::warn(LOG4CXX_STR("Could not close writer for WriterAppender named ") + _priv->name, e);
+ LogLog::warn(LOG4CXX_STR("Could not close writer for WriterAppender named ") + this->name, e);
}
}
@@ -248,27 +241,42 @@ void WriterAppender::subAppend(const spi::LoggingEventPtr& event, Pool& p)
}
+#if LOG4CXX_ABI_VERSION <= 15
+void WriterAppender::writeHeader(Pool& p)
+{
+ _priv->writeHeader();
+}
+
void WriterAppender::writeFooter(Pool& p)
{
- if (_priv->layout != NULL)
+ _priv->writeFooter();
+}
+#endif
+
+void WriterAppender::WriterAppenderPriv::writeFooter()
+{
+ if (this->layout != NULL)
{
+ Pool p;
LogString foot;
- _priv->layout->appendFooter(foot, p);
- _priv->writer->write(foot, p);
+ this->layout->appendFooter(foot, p);
+ this->writer->write(foot, p);
}
}
-void WriterAppender::writeHeader(Pool& p)
+void WriterAppender::WriterAppenderPriv::writeHeader()
{
- if (_priv->layout != NULL)
+ if (this->layout != NULL)
{
+ Pool p;
LogString header;
- _priv->layout->appendHeader(header, p);
- _priv->writer->write(header, p);
+ this->layout->appendHeader(header, p);
+ this->writer->write(header, p);
}
}
+#if LOG4CXX_ABI_VERSION <= 15
void WriterAppender::setWriter(const WriterPtr& newWriter)
{
std::lock_guard<std::recursive_mutex> lock(_priv->mutex);
@@ -279,6 +287,7 @@ void WriterAppender::setWriterInternal(const WriterPtr& newWriter)
{
_priv->writer = newWriter;
}
+#endif
bool WriterAppender::requiresLayout() const
{
@@ -308,6 +317,8 @@ bool WriterAppender::getImmediateFlush() const
return _priv->immediateFlush;
}
+#if LOG4CXX_ABI_VERSION <= 15
const LOG4CXX_NS::helpers::WriterPtr WriterAppender::getWriter() const{
return _priv->writer;
}
+#endif
diff --git a/src/main/cpp/xmlsocketappender.cpp b/src/main/cpp/xmlsocketappender.cpp
index f097ebd4..df4bd4e5 100644
--- a/src/main/cpp/xmlsocketappender.cpp
+++ b/src/main/cpp/xmlsocketappender.cpp
@@ -46,6 +46,8 @@ struct XMLSocketAppender::XMLSocketAppenderPriv : public SocketAppenderSkeletonP
SocketAppenderSkeletonPriv( host, port, delay ) {}
LOG4CXX_NS::helpers::WriterPtr writer;
+
+ void close() override;
};
IMPLEMENT_LOG4CXX_OBJECT(XMLSocketAppender)
@@ -84,7 +86,8 @@ XMLSocketAppender::XMLSocketAppender(const LogString& host, int port1)
XMLSocketAppender::~XMLSocketAppender()
{
- finalize();
+ if (_priv->setClosed())
+ _priv->close();
}
@@ -106,14 +109,22 @@ void XMLSocketAppender::setSocket(LOG4CXX_NS::helpers::SocketPtr& socket, Pool&
_priv->writer = std::make_shared<OutputStreamWriter>(os, charset);
}
+#if LOG4CXX_ABI_VERSION <= 15
void XMLSocketAppender::cleanUp(Pool& p)
{
- if (_priv->writer)
+ _priv->close();
+}
+#endif
+
+void XMLSocketAppender::XMLSocketAppenderPriv::close()
+{
+ SocketAppenderSkeletonPriv::close();
+ if (this->writer)
{
try
{
- _priv->writer->close(p);
- _priv->writer = nullptr;
+ this->writer->close(this->pool);
+ this->writer = nullptr;
}
catch (std::exception&)
{
diff --git a/src/main/include/log4cxx/appenderskeleton.h b/src/main/include/log4cxx/appenderskeleton.h
index 30260371..5bc1a7db 100644
--- a/src/main/include/log4cxx/appenderskeleton.h
+++ b/src/main/include/log4cxx/appenderskeleton.h
@@ -74,12 +74,14 @@ class LOG4CXX_EXPORT AppenderSkeleton :
AppenderSkeleton(const LayoutPtr& layout);
virtual ~AppenderSkeleton();
+#if LOG4CXX_ABI_VERSION <= 15
/**
Finalize this appender by calling the derived class'
<code>close</code> method.
*/
+ [[ deprecated( "The derived appender destructor needs to implement its cleanup" ) ]]
void finalize();
-
+#endif
/**
\copybrief spi::OptionHandler::activateOptions()
diff --git a/src/main/include/log4cxx/net/socketappenderskeleton.h b/src/main/include/log4cxx/net/socketappenderskeleton.h
index ea45b0ab..5608d24b 100644
--- a/src/main/include/log4cxx/net/socketappenderskeleton.h
+++ b/src/main/include/log4cxx/net/socketappenderskeleton.h
@@ -146,8 +146,9 @@ class LOG4CXX_EXPORT SocketAppenderSkeleton : public AppenderSkeleton
virtual void setSocket(LOG4CXX_NS::helpers::SocketPtr& socket, LOG4CXX_NS::helpers::Pool& p) = 0;
+#if LOG4CXX_ABI_VERSION <= 15
virtual void cleanUp(LOG4CXX_NS::helpers::Pool& p) = 0;
-
+#endif
virtual int getDefaultDelay() const = 0;
virtual int getDefaultPort() const = 0;
diff --git a/src/main/include/log4cxx/net/xmlsocketappender.h b/src/main/include/log4cxx/net/xmlsocketappender.h
index 44dd01db..0c9d8379 100644
--- a/src/main/include/log4cxx/net/xmlsocketappender.h
+++ b/src/main/include/log4cxx/net/xmlsocketappender.h
@@ -137,8 +137,9 @@ class LOG4CXX_EXPORT XMLSocketAppender : public SocketAppenderSkeleton
protected:
void setSocket(LOG4CXX_NS::helpers::SocketPtr& socket, helpers::Pool& p) override;
+#if LOG4CXX_ABI_VERSION <= 15
void cleanUp(helpers::Pool& p) override;
-
+#endif
int getDefaultDelay() const override;
int getDefaultPort() const override;
diff --git a/src/main/include/log4cxx/private/odbcappender_priv.h b/src/main/include/log4cxx/private/odbcappender_priv.h
index d300e645..f46c614b 100644
--- a/src/main/include/log4cxx/private/odbcappender_priv.h
+++ b/src/main/include/log4cxx/private/odbcappender_priv.h
@@ -135,6 +135,9 @@ struct ODBCAppender::ODBCAppenderPriv : public AppenderSkeleton::AppenderSkeleto
#if LOG4CXX_EVENTS_AT_EXIT
helpers::AtExitRegistry::Raii atExitRegistryRaii;
#endif
+
+ void flushBuffer(helpers::Pool& p);
+ void close();
};
}
diff --git a/src/main/include/log4cxx/private/socketappenderskeleton_priv.h b/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
index e4a3537d..4e31bb29 100644
--- a/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
+++ b/src/main/include/log4cxx/private/socketappenderskeleton_priv.h
@@ -56,8 +56,9 @@ struct SocketAppenderSkeleton::SocketAppenderSkeletonPriv : public AppenderSkele
locationInfo(false)
{ }
- ~SocketAppenderSkeletonPriv()
- { stopMonitor(); }
+ virtual ~SocketAppenderSkeletonPriv()
+ {
+ }
/**
host name
@@ -72,7 +73,7 @@ struct SocketAppenderSkeleton::SocketAppenderSkeletonPriv : public AppenderSkele
int port;
int reconnectionDelay;
bool locationInfo;
- void stopMonitor();
+ virtual void close();
/**
Manages asynchronous reconnection attempts.
diff --git a/src/main/include/log4cxx/private/writerappender_priv.h b/src/main/include/log4cxx/private/writerappender_priv.h
index c9484299..63102140 100644
--- a/src/main/include/log4cxx/private/writerappender_priv.h
+++ b/src/main/include/log4cxx/private/writerappender_priv.h
@@ -89,6 +89,16 @@ struct WriterAppender::WriterAppenderPriv : public AppenderSkeleton::AppenderSke
bool warnedNoWriter = false;
bool checkWriter();
+
+ void close();
+ void writeHeader();
+ void writeFooter();
+
+ void setWriter(const helpers::WriterPtr& newWriter)
+ {
+ std::lock_guard<std::recursive_mutex> lock(this->mutex);
+ this->writer = newWriter;
+ }
};
}
diff --git a/src/main/include/log4cxx/writerappender.h b/src/main/include/log4cxx/writerappender.h
index c4645096..2eacda72 100644
--- a/src/main/include/log4cxx/writerappender.h
+++ b/src/main/include/log4cxx/writerappender.h
@@ -115,10 +115,12 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
void close() override;
protected:
+#if LOG4CXX_ABI_VERSION <= 15
/**
* Close the underlying {@link log4cxx::helpers::Writer}.
* */
void closeWriter();
+#endif
/**
Returns an OutputStreamWriter when passed an OutputStream. The
@@ -153,6 +155,7 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
*/
void setOption(const LogString& option, const LogString& value) override;
+#if LOG4CXX_ABI_VERSION <= 15
/**
<p>Send log output to \c writer which must be open and be writable.
@@ -166,6 +169,7 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
void setWriter(const helpers::WriterPtr& writer);
const helpers::WriterPtr getWriter() const;
+#endif
bool requiresLayout() const override;
@@ -176,6 +180,7 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
virtual void subAppend(const spi::LoggingEventPtr& event, helpers::Pool& p);
+#if LOG4CXX_ABI_VERSION <= 15
/**
Write a footer as produced by the embedded layout's
Layout#appendFooter method. */
@@ -190,7 +195,7 @@ class LOG4CXX_EXPORT WriterAppender : public AppenderSkeleton
* Set the writer. Mutex must already be held.
*/
void setWriterInternal(const helpers::WriterPtr& writer);
-
+#endif
private:
//
// prevent copy and assignment