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 92179a67 Simplify the Hiearchy interface in the next ABI version (#608)
92179a67 is described below

commit 92179a678734fb47d0230dc508daad7f8ae2ebd0
Author: Stephen Webb <[email protected]>
AuthorDate: Sun Mar 15 11:44:59 2026 +1100

    Simplify the Hiearchy interface in the next ABI version (#608)
    
    * FallbackErrorHandler can now support multiple backup appenders
---
 src/main/cpp/fallbackerrorhandler.cpp | 22 ++++++++++------------
 src/main/cpp/hierarchy.cpp            |  5 ++++-
 src/main/include/log4cxx/hierarchy.h  | 11 ++++++++++-
 3 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/main/cpp/fallbackerrorhandler.cpp 
b/src/main/cpp/fallbackerrorhandler.cpp
index e526e36b..57d4eb87 100644
--- a/src/main/cpp/fallbackerrorhandler.cpp
+++ b/src/main/cpp/fallbackerrorhandler.cpp
@@ -24,6 +24,7 @@
 #include <log4cxx/logger.h>
 #include <log4cxx/asyncappender.h>
 #endif
+#include <list>
 
 using namespace LOG4CXX_NS;
 using namespace LOG4CXX_NS::helpers;
@@ -34,7 +35,7 @@ IMPLEMENT_LOG4CXX_OBJECT(FallbackErrorHandler)
 
 struct FallbackErrorHandler::FallbackErrorHandlerPrivate
 {
-       AppenderWeakPtr backup;
+       std::list<AppenderPtr> backup;
        AppenderWeakPtr primary;
        std::map<LogString, spi::AppenderAttachableWeakPtr> appenderHolders;
        bool errorReported = false;
@@ -99,7 +100,12 @@ void FallbackErrorHandler::error
        LogLog::warn(message, ex);
 
        AppenderPtr primaryLocked = m_priv->primary.lock();
-       AppenderPtr backupLocked = m_priv->backup.lock();
+       AppenderPtr backupLocked;
+       if (!m_priv->backup.empty())
+       {
+               backupLocked = m_priv->backup.front();
+               m_priv->backup.pop_front();
+       }
 
        if ( !primaryLocked || !backupLocked )
        {
@@ -138,6 +144,7 @@ void FallbackErrorHandler::error
        m_priv->errorReported = true;
        if (event)
                backupLocked->doAppend(event, p);
+       m_priv->primary = backupLocked;
 }
 
 void FallbackErrorHandler::setAppender(const AppenderPtr& primary1)
@@ -157,16 +164,7 @@ void FallbackErrorHandler::setBackupAppender(const 
AppenderPtr& backup1)
                LogLog::debug(((LogString) LOG4CXX_STR("FB: Setting backup 
appender to ["))
                        + backup1->getName() + LOG4CXX_STR("]."));
        }
-       m_priv->backup = backup1;
-
-       // Make sure that we keep a reference to the appender around, since 
otherwise
-       // the appender would be lost if it has no loggers that use it.
-       auto repository = LogManager::getLoggerRepository();
-       if (auto hierarchy = dynamic_cast<Hierarchy*>(repository.get()))
-       {
-               hierarchy->addAppender(backup1);
-       }
-
+       m_priv->backup.push_back(backup1);
 }
 
 void FallbackErrorHandler::activateOptions(Pool&)
diff --git a/src/main/cpp/hierarchy.cpp b/src/main/cpp/hierarchy.cpp
index 3945d78e..60142105 100644
--- a/src/main/cpp/hierarchy.cpp
+++ b/src/main/cpp/hierarchy.cpp
@@ -61,8 +61,9 @@ struct Hierarchy::HierarchyPrivate
        LoggerMap loggers;
        ProvisionNodeMap provisionNodes;
 
+#if LOG4CXX_ABI_VERSION <= 15
        std::vector<AppenderPtr> allAppenders;
-
+#endif
        mutable std::mutex listenerMutex;
 
        const char* alreadyTriedMethod{ NULL };
@@ -463,6 +464,7 @@ HierarchyPtr Hierarchy::create()
        return ret;
 }
 
+#if LOG4CXX_ABI_VERSION <= 15
 void Hierarchy::clearAppenders()
 {
        m_priv->allAppenders.clear();
@@ -472,6 +474,7 @@ void Hierarchy::addAppender(AppenderPtr appender)
 {
        m_priv->allAppenders.push_back(appender);
 }
+#endif
 
 bool Hierarchy::removeLogger(const LogString& name, bool ifNotUsed)
 {
diff --git a/src/main/include/log4cxx/hierarchy.h 
b/src/main/include/log4cxx/hierarchy.h
index 9bfae700..d2cec488 100644
--- a/src/main/include/log4cxx/hierarchy.h
+++ b/src/main/include/log4cxx/hierarchy.h
@@ -231,10 +231,19 @@ class LOG4CXX_EXPORT Hierarchy : public 
spi::LoggerRepository
                */
                void updateChildren(const Logger* parent);
 
+#if LOG4CXX_ABI_VERSION <= 15
+               /**
+                * @deprecated This function is deprecated and will be removed 
in a future version.
+               */
+               [[ deprecated( "Storing appenders is longer supported" ) ]]
                void clearAppenders();
 
+               /**
+                * @deprecated This function is deprecated and will be removed 
in a future version.
+               */
+               [[ deprecated( "Storing appenders is longer supported" ) ]]
                void addAppender(AppenderPtr appender);
-
+#endif
                /**
                Remove the \c name Logger from the hierarchy.
 

Reply via email to