This is an automated email from the ASF dual-hosted git repository.
swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
The following commit(s) were added to refs/heads/master by this push:
new a433a1e2 Deprecate AppenderSkeleton::finalize for the next ABI version
(#603)
a433a1e2 is described below
commit a433a1e24df525e787f03ed2d26964ceed910de2
Author: Stephen Webb <[email protected]>
AuthorDate: Mon Mar 9 13:19:35 2026 +1100
Deprecate AppenderSkeleton::finalize for the next ABI version (#603)
---
src/main/cpp/appenderskeleton.cpp | 2 +
src/main/cpp/asyncappender.cpp | 24 ++++---
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 | 68 ++++++++++++--------
src/main/cpp/rollingfileappender.cpp | 8 +--
src/main/cpp/smtpappender.cpp | 2 +-
src/main/cpp/socketappenderskeleton.cpp | 10 ++-
src/main/cpp/syslogappender.cpp | 2 +-
src/main/cpp/telnetappender.cpp | 33 ++++++----
src/main/cpp/writerappender.cpp | 74 ++++++++++++----------
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 | 16 +++++
src/main/include/log4cxx/writerappender.h | 13 +++-
22 files changed, 220 insertions(+), 122 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..61715c8f 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)
@@ -143,7 +144,7 @@ struct AsyncAppender::AsyncAppenderPriv : public
AppenderSkeleton::AppenderSkele
, locationInfo(false)
, blocking(true)
#if LOG4CXX_EVENTS_AT_EXIT
- , atExitRegistryRaii([this]{stopDispatcher();})
+ , atExitRegistryRaii([this]{if (setClosed()) stopDispatcher();})
#endif
, eventCount(0)
, dispatchedCount(0)
@@ -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..dc3ec235 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,43 @@ ODBCAppender::SQLHDBC
ODBCAppender::getConnection(LOG4CXX_NS::helpers::Pool& p)
void ODBCAppender::close()
{
- if (_priv->closed)
+ if (_priv->setClosed())
{
- return;
+#if LOG4CXX_HAVE_ODBC
+ if (!_priv->buffer.empty() && 0 == _priv->preparedStatement)
+ {
+ Pool p;
+ _priv->setPreparedStatement(getConnection(p), p);
+ }
+#endif
+ _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 +594,41 @@ void
ODBCAppender::ODBCAppenderPriv::setParameterValues(const spi::LoggingEventP
void ODBCAppender::flushBuffer(Pool& p)
{
- for (auto& logEvent : _priv->buffer)
+#if LOG4CXX_HAVE_ODBC
+ if (0 == _priv->preparedStatement)
+ _priv->setPreparedStatement(getConnection(p), p);
+ _priv->flushBuffer(p);
+#endif
+}
+
+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..c004f136 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)
@@ -82,7 +81,7 @@ void SocketAppenderSkeleton::connect(Pool& p)
}
else
{
- cleanUp(p);
+ _priv->close();
try
{
@@ -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..65f31d82 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -57,7 +57,11 @@ struct TelnetAppender::TelnetAppenderPriv : public
AppenderSkeletonPrivate
encoder(CharsetEncoder::getUTF8Encoder()),
activeConnections(0)
#if LOG4CXX_EVENTS_AT_EXIT
- , atExitRegistryRaii([this]{stopAcceptingConnections();})
+ , atExitRegistryRaii([this]
+ {
+ if (setClosed())
+ stopAcceptingConnections();
+ })
#endif
{ }
@@ -82,8 +86,6 @@ struct TelnetAppender::TelnetAppenderPriv : public
AppenderSkeletonPrivate
void stopAcceptingConnections()
{
- if (!this->setClosed())
- return;
if (!this->serverSocket)
return;
// Interrupt accept()
@@ -97,6 +99,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 +118,8 @@ TelnetAppender::TelnetAppender()
TelnetAppender::~TelnetAppender()
{
- finalize();
+ if (_priv->setClosed())
+ _priv->close();
}
void TelnetAppender::activateOptions(Pool& /* p */)
@@ -178,24 +183,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 +218,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..2f9a8fce 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,37 +241,52 @@ 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);
- setWriterInternal(newWriter);
+ _priv->setWriter(newWriter);
}
void WriterAppender::setWriterInternal(const WriterPtr& newWriter)
{
_priv->writer = newWriter;
}
+#endif
bool WriterAppender::requiresLayout() const
{
@@ -308,6 +316,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..348f2124 100644
--- a/src/main/include/log4cxx/private/writerappender_priv.h
+++ b/src/main/include/log4cxx/private/writerappender_priv.h
@@ -89,6 +89,22 @@ struct WriterAppender::WriterAppenderPriv : public
AppenderSkeleton::AppenderSke
bool warnedNoWriter = false;
bool checkWriter();
+
+ void close();
+ void writeHeader();
+ void writeFooter();
+
+ const helpers::WriterPtr& getWriter() const
+ {
+ std::lock_guard<std::recursive_mutex> lock(this->mutex);
+ return this->writer;
+ }
+
+ 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..85f46b38 100644
--- a/src/main/include/log4cxx/writerappender.h
+++ b/src/main/include/log4cxx/writerappender.h
@@ -115,10 +115,13 @@ class LOG4CXX_EXPORT WriterAppender : public
AppenderSkeleton
void close() override;
protected:
+#if LOG4CXX_ABI_VERSION <= 15
/**
* Close the underlying {@link log4cxx::helpers::Writer}.
* */
+ [[ deprecated( "Use WriterAppenderPriv::close" ) ]]
void closeWriter();
+#endif
/**
Returns an OutputStreamWriter when passed an OutputStream.
The
@@ -153,6 +156,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.
@@ -163,9 +167,12 @@ class LOG4CXX_EXPORT WriterAppender : public
AppenderSkeleton
@param writer An already opened Writer.
*/
+ [[ deprecated( "Use WriterAppenderPriv::setWriter" ) ]]
void setWriter(const helpers::WriterPtr& writer);
+ [[ deprecated( "Use WriterAppenderPriv::getWriter" ) ]]
const helpers::WriterPtr getWriter() const;
+#endif
bool requiresLayout() const override;
@@ -176,21 +183,25 @@ 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. */
+ [[ deprecated( "Specialize Layout instead of Appender" ) ]]
virtual void writeFooter(helpers::Pool& p);
/**
Write a header as produced by the embedded layout's
Layout#appendHeader method. */
+ [[ deprecated( "Specialize Layout instead of Appender" ) ]]
virtual void writeHeader(helpers::Pool& p);
/**
* Set the writer. Mutex must already be held.
*/
+ [[ deprecated( "Use WriterAppenderPriv::setWriter" ) ]]
void setWriterInternal(const helpers::WriterPtr& writer);
-
+#endif
private:
//
// prevent copy and assignment