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 <[email protected]> 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
