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 6505a08 [LOGCXX-546] Prevent serialization of a multi-threaded
application when using disabled logging statements
6505a08 is described below
commit 6505a08671b4c564f9fb5b237c856c52c126307d
Author: Stephen Webb <swebb2066.com>
AuthorDate: Sat Jan 1 15:09:47 2022 +1100
[LOGCXX-546] Prevent serialization of a multi-threaded application when
using disabled logging statements
---
src/main/cpp/hierarchy.cpp | 91 ++++++++++------------
src/main/cpp/logger.cpp | 49 +++++-------
src/main/cpp/rootlogger.cpp | 2 +-
src/main/include/log4cxx/hierarchy.h | 1 -
src/main/include/log4cxx/logger.h | 8 +-
src/main/include/log4cxx/spi/rootlogger.h | 2 +-
src/test/cpp/CMakeLists.txt | 12 ++-
.../{mdctestcase.cpp => autoconfiguretestcase.cpp} | 53 +++++--------
src/test/cpp/customlogger/xlogger.cpp | 16 ++--
src/test/cpp/customlogger/xloggertestcase.cpp | 4 +-
src/test/cpp/encodingtest.cpp | 4 +-
src/test/cpp/hierarchythresholdtestcase.cpp | 4 +-
src/test/cpp/l7dtestcase.cpp | 4 +-
src/test/cpp/mdctestcase.cpp | 4 +-
src/test/cpp/minimumtestcase.cpp | 4 +-
src/test/cpp/multithreadtest.cpp | 1 -
src/test/cpp/ndctestcase.cpp | 4 +-
src/test/cpp/net/socketservertestcase.cpp | 4 +-
src/test/cpp/patternlayouttest.cpp | 4 +-
src/test/cpp/varia/errorhandlertestcase.cpp | 4 +-
src/test/cpp/varia/levelmatchfiltertestcase.cpp | 4 +-
src/test/cpp/varia/levelrangefiltertestcase.cpp | 4 +-
src/test/cpp/xml/domtestcase.cpp | 4 +-
src/test/cpp/xml/xmllayouttestcase.cpp | 4 +-
.../resources/input/autoConfigureTest.properties | 25 ++++++
src/test/resources/witness/autoConfigureTest.log | 1 +
26 files changed, 161 insertions(+), 156 deletions(-)
diff --git a/src/main/cpp/hierarchy.cpp b/src/main/cpp/hierarchy.cpp
index c70d39d..22caa89 100644
--- a/src/main/cpp/hierarchy.cpp
+++ b/src/main/cpp/hierarchy.cpp
@@ -52,8 +52,8 @@ Hierarchy::Hierarchy() :
loggers(new LoggerMap()),
provisionNodes(new ProvisionNodeMap())
{
- std::unique_lock<std::mutex> lock(mutex);
root = LoggerPtr(new RootLogger(pool, Level::getDebug()));
+ root->setHierarchy(this);
defaultFactory = LoggerFactoryPtr(new DefaultLoggerFactory());
emittedNoAppenderWarning = false;
configured = false;
@@ -64,8 +64,13 @@ Hierarchy::Hierarchy() :
Hierarchy::~Hierarchy()
{
- // TODO LOGCXX-430
- //
https://issues.apache.org/jira/browse/LOGCXX-430?focusedCommentId=15175254&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15175254
+ std::unique_lock<std::mutex> lock(mutex);
+ for (auto& item : *this->loggers)
+ {
+ if (auto pLogger = item.second)
+ pLogger->setHierarchy(0);
+ }
+ root->setHierarchy(0);
#ifndef APR_HAS_THREADS
delete loggers;
delete provisionNodes;
@@ -216,15 +221,19 @@ LoggerPtr Hierarchy::getLogger(const LogString& name,
LoggerMap::iterator it = loggers->find(name);
+ LoggerPtr result;
if (it != loggers->end())
{
- return it->second;
+ result = it->second;
}
- else
+ if (!result)
{
LoggerPtr logger(factory->makeNewLoggerInstance(pool, name));
- logger->setHierarchy(shared_from_this());
- loggers->insert(LoggerMap::value_type(name, logger));
+ logger->setHierarchy(this);
+ if (it != loggers->end())
+ it->second = logger;
+ else
+ loggers->insert(LoggerMap::value_type(name, logger));
ProvisionNodeMap::iterator it2 = provisionNodes->find(name);
@@ -235,8 +244,9 @@ LoggerPtr Hierarchy::getLogger(const LogString& name,
}
updateParents(logger);
- return logger;
+ result = logger;
}
+ return result;
}
@@ -245,31 +255,22 @@ LoggerList Hierarchy::getCurrentLoggers() const
std::unique_lock<std::mutex> lock(mutex);
LoggerList v;
- LoggerMap::const_iterator it, itEnd = loggers->end();
-
- for (it = loggers->begin(); it != itEnd; it++)
+ for (auto& item : *this->loggers)
{
- v.push_back(it->second);
+ if (auto pLogger = item.second)
+ v.push_back(pLogger);
}
-
-
return v;
}
LoggerPtr Hierarchy::getRootLogger() const
{
- return root;
+ return this->root;
}
bool Hierarchy::isDisabled(int level) const
{
- bool currentlyConfigured;
- {
- std::unique_lock<std::mutex> lock(mutex);
- currentlyConfigured = configured;
- }
-
- if (!currentlyConfigured)
+ if (!configured)
{
std::shared_ptr<Hierarchy> nonconstThis =
std::const_pointer_cast<Hierarchy>(shared_from_this());
DefaultConfigurator::configure(
@@ -284,7 +285,7 @@ void Hierarchy::resetConfiguration()
{
std::unique_lock<std::mutex> lock(mutex);
- getRootLogger()->setLevel(Level::getDebug());
+ root->setLevel(Level::getDebug());
root->setResourceBundle(0);
setThresholdInternal(Level::getAll());
@@ -294,9 +295,12 @@ void Hierarchy::resetConfiguration()
for (it = loggers->begin(); it != itEnd; it++)
{
- it->second->setLevel(0);
- it->second->setAdditivity(true);
- it->second->setResourceBundle(0);
+ if (auto pLogger = it->second)
+ {
+ pLogger->setLevel(0);
+ pLogger->setAdditivity(true);
+ pLogger->setResourceBundle(0);
+ }
}
//rendererMap.clear();
@@ -313,26 +317,24 @@ void Hierarchy::shutdownInternal()
{
configured = false;
- LoggerPtr root1 = getRootLogger();
-
// begin by closing nested appenders
- root1->closeNestedAppenders();
+ root->closeNestedAppenders();
LoggerMap::iterator it, itEnd = loggers->end();
for (it = loggers->begin(); it != itEnd; it++)
{
- LoggerPtr logger = it->second;
- logger->closeNestedAppenders();
+ if (auto pLogger = it->second)
+ pLogger->closeNestedAppenders();
}
// then, remove all appenders
- root1->removeAllAppenders();
+ root->removeAllAppenders();
for (it = loggers->begin(); it != itEnd; it++)
{
- LoggerPtr logger = it->second;
- logger->removeAllAppenders();
+ if (auto pLogger = it->second)
+ pLogger->removeAllAppenders();
}
}
@@ -354,9 +356,12 @@ void Hierarchy::updateParents(LoggerPtr logger)
if (it != loggers->end())
{
- parentFound = true;
- logger->parent = it->second;
- break; // no need to update the ancestors of the
closest ancestor
+ if (auto pLogger = it->second)
+ {
+ parentFound = true;
+ logger->parent = pLogger;
+ break; // no need to update the ancestors of
the closest ancestor
+ }
}
else
{
@@ -378,7 +383,7 @@ void Hierarchy::updateParents(LoggerPtr logger)
// If we could not find any existing parents, then link with root.
if (!parentFound)
{
- logger->parent = root;
+ logger->parent = getRootLogger();
}
}
@@ -414,15 +419,5 @@ bool Hierarchy::isConfigured()
HierarchyPtr Hierarchy::create(){
HierarchyPtr ret( new Hierarchy() );
- ret->configureRoot();
return ret;
}
-
-void Hierarchy::configureRoot(){
- // This should really be done in the constructor, but in order to fix
- // LOGCXX-322 we need to turn the repositroy into a weak_ptr, and we
- // can't use weak_from_this() in the constructor.
- if( !root->getLoggerRepository().lock() ){
- root->setHierarchy(shared_from_this());
- }
-}
diff --git a/src/main/cpp/logger.cpp b/src/main/cpp/logger.cpp
index 840d969..90a1e88 100644
--- a/src/main/cpp/logger.cpp
+++ b/src/main/cpp/logger.cpp
@@ -43,7 +43,7 @@ IMPLEMENT_LOG4CXX_OBJECT(Logger)
Logger::Logger(Pool& p, const LogString& name1)
: pool(&p), name(), level(), parent(), resourceBundle(),
- repository(), aai(new AppenderAttachableImpl(*pool))
+ repository(0), aai(new AppenderAttachableImpl(*pool))
{
name = name1;
additive = true;
@@ -58,11 +58,9 @@ void Logger::addAppender(const AppenderPtr newAppender)
log4cxx::spi::LoggerRepositoryPtr rep;
aai->addAppender(newAppender);
- rep = repository.lock();
-
- if (rep)
+ if (repository)
{
- rep->fireAddAppenderEvent(this, newAppender.get());
+ repository->fireAddAppenderEvent(this, newAppender.get());
}
}
@@ -80,9 +78,9 @@ void Logger::reconfigure( const std::vector<AppenderPtr>&
appenders, bool additi
{
aai->addAppender( *it );
- if (log4cxx::spi::LoggerRepositoryPtr rep = repository.lock())
+ if (repository)
{
- rep->fireAddAppenderEvent(this, it->get());
+ repository->fireAddAppenderEvent(this, it->get());
}
}
}
@@ -103,10 +101,9 @@ void Logger::callAppenders(const spi::LoggingEventPtr&
event, Pool& p) const
}
}
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (writes == 0 && rep)
+ if (writes == 0 && repository)
{
- rep->emitNoAppenderWarning(const_cast<Logger*>(this));
+ repository->emitNoAppenderWarning(const_cast<Logger*>(this));
}
}
@@ -164,7 +161,7 @@ AppenderPtr Logger::getAppender(const LogString& name1)
const
return aai->getAppender(name1);
}
-const LevelPtr Logger::getEffectiveLevel() const
+const LevelPtr& Logger::getEffectiveLevel() const
{
for (const Logger* l = this; l != 0; l = l->parent.get())
{
@@ -180,7 +177,7 @@ const LevelPtr Logger::getEffectiveLevel() const
#endif
}
-LoggerRepositoryWeakPtr Logger::getLoggerRepository() const
+LoggerRepository* Logger::getLoggerRepository() const
{
return repository;
}
@@ -245,8 +242,7 @@ bool Logger::isAttached(const AppenderPtr appender) const
bool Logger::isTraceEnabled() const
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (!rep || rep->isDisabled(Level::TRACE_INT))
+ if (!repository || repository->isDisabled(Level::TRACE_INT))
{
return false;
}
@@ -256,8 +252,7 @@ bool Logger::isTraceEnabled() const
bool Logger::isDebugEnabled() const
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (!rep || rep->isDisabled(Level::DEBUG_INT))
+ if (!repository || repository->isDisabled(Level::DEBUG_INT))
{
return false;
}
@@ -267,8 +262,7 @@ bool Logger::isDebugEnabled() const
bool Logger::isEnabledFor(const LevelPtr& level1) const
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (!rep || rep->isDisabled(level1->toInt()))
+ if (!repository || repository->isDisabled(level1->toInt()))
{
return false;
}
@@ -279,8 +273,7 @@ bool Logger::isEnabledFor(const LevelPtr& level1) const
bool Logger::isInfoEnabled() const
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (!rep || rep->isDisabled(Level::INFO_INT))
+ if (!repository || repository->isDisabled(Level::INFO_INT))
{
return false;
}
@@ -290,8 +283,7 @@ bool Logger::isInfoEnabled() const
bool Logger::isErrorEnabled() const
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (!rep || rep->isDisabled(Level::ERROR_INT))
+ if (!repository || repository->isDisabled(Level::ERROR_INT))
{
return false;
}
@@ -301,8 +293,7 @@ bool Logger::isErrorEnabled() const
bool Logger::isWarnEnabled() const
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (!rep || rep->isDisabled(Level::WARN_INT))
+ if (!repository || repository->isDisabled(Level::WARN_INT))
{
return false;
}
@@ -312,8 +303,7 @@ bool Logger::isWarnEnabled() const
bool Logger::isFatalEnabled() const
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (!rep || rep->isDisabled(Level::FATAL_INT))
+ if (!repository || repository->isDisabled(Level::FATAL_INT))
{
return false;
}
@@ -324,7 +314,7 @@ bool Logger::isFatalEnabled() const
/*void Logger::l7dlog(const LevelPtr& level, const String& key,
const char* file, int line)
{
- if (repository == 0 || repository->isDisabled(level->level))
+ if (!repository || repository->isDisabled(level->level))
{
return;
}
@@ -349,8 +339,7 @@ bool Logger::isFatalEnabled() const
void Logger::l7dlog(const LevelPtr& level1, const LogString& key,
const LocationInfo& location, const std::vector<LogString>& params)
const
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (!rep || rep->isDisabled(level1->toInt()))
+ if (!repository || repository->isDisabled(level1->toInt()))
{
return;
}
@@ -445,7 +434,7 @@ void Logger::setAdditivity(bool additive1)
this->additive = additive1;
}
-void Logger::setHierarchy(spi::LoggerRepositoryWeakPtr repository1)
+void Logger::setHierarchy(spi::LoggerRepository* repository1)
{
this->repository = repository1;
}
diff --git a/src/main/cpp/rootlogger.cpp b/src/main/cpp/rootlogger.cpp
index 9f3357a..2b124a6 100644
--- a/src/main/cpp/rootlogger.cpp
+++ b/src/main/cpp/rootlogger.cpp
@@ -30,7 +30,7 @@ RootLogger::RootLogger(Pool& pool, const LevelPtr level1) :
setLevel(level1);
}
-const LevelPtr RootLogger::getEffectiveLevel() const
+const LevelPtr& RootLogger::getEffectiveLevel() const
{
return level;
}
diff --git a/src/main/include/log4cxx/hierarchy.h
b/src/main/include/log4cxx/hierarchy.h
index 5ca5769..455b934 100644
--- a/src/main/include/log4cxx/hierarchy.h
+++ b/src/main/include/log4cxx/hierarchy.h
@@ -288,7 +288,6 @@ class LOG4CXX_EXPORT Hierarchy :
void updateChildren(ProvisionNode& pn, LoggerPtr logger);
- void configureRoot();
};
} //namespace log4cxx
diff --git a/src/main/include/log4cxx/logger.h
b/src/main/include/log4cxx/logger.h
index 796256b..b74d872 100644
--- a/src/main/include/log4cxx/logger.h
+++ b/src/main/include/log4cxx/logger.h
@@ -102,7 +102,7 @@ class LOG4CXX_EXPORT Logger :
// Loggers need to know what Hierarchy they are in
- log4cxx::spi::LoggerRepositoryWeakPtr repository;
+ log4cxx::spi::LoggerRepository* repository;
helpers::AppenderAttachableImplPtr aai;
@@ -617,13 +617,13 @@ class LOG4CXX_EXPORT Logger :
@throws RuntimeException if all levels are null in the hierarchy
*/
- virtual const LevelPtr getEffectiveLevel() const;
+ virtual const LevelPtr& getEffectiveLevel() const;
/**
Return the the LoggerRepository where this
<code>Logger</code> is attached.
*/
- log4cxx::spi::LoggerRepositoryWeakPtr getLoggerRepository()
const;
+ log4cxx::spi::LoggerRepository* getLoggerRepository() const;
/**
@@ -1464,7 +1464,7 @@ class LOG4CXX_EXPORT Logger :
friend class Hierarchy;
/**
Only the Hierarchy class can set the hierarchy of a logger.*/
- void setHierarchy(spi::LoggerRepositoryWeakPtr repository);
+ void setHierarchy(spi::LoggerRepository* repository);
public:
/**
diff --git a/src/main/include/log4cxx/spi/rootlogger.h
b/src/main/include/log4cxx/spi/rootlogger.h
index 812f449..50c0502 100644
--- a/src/main/include/log4cxx/spi/rootlogger.h
+++ b/src/main/include/log4cxx/spi/rootlogger.h
@@ -48,7 +48,7 @@ class LOG4CXX_EXPORT RootLogger : public Logger
Return the assigned level value without walking the logger
hierarchy.
*/
- virtual const LevelPtr getEffectiveLevel() const;
+ virtual const LevelPtr& getEffectiveLevel() const;
/**
Setting a null value to the level of the root
logger may have catastrophic
diff --git a/src/test/cpp/CMakeLists.txt b/src/test/cpp/CMakeLists.txt
index d7ddaa2..11701da 100644
--- a/src/test/cpp/CMakeLists.txt
+++ b/src/test/cpp/CMakeLists.txt
@@ -17,6 +17,7 @@ find_program(GZIP_APP gzip REQUIRED)
# Tests defined in this directory
set(ALL_LOG4CXX_TESTS
+ autoconfiguretestcase
asyncappendertestcase
consoleappendertestcase
decodingtest
@@ -87,13 +88,14 @@ if( WIN32 )
endforeach()
endif( WIN32 )
+get_filename_component(UNIT_TEST_WORKING_DIR ../resources ABSOLUTE)
foreach(testName IN LISTS ALL_LOG4CXX_TESTS)
target_compile_definitions(${testName} PRIVATE
${LOG4CXX_COMPILE_DEFINITIONS} ${APR_COMPILE_DEFINITIONS}
${APR_UTIL_COMPILE_DEFINITIONS} )
target_include_directories(${testName} PRIVATE ${CMAKE_CURRENT_LIST_DIR}
$<TARGET_PROPERTY:log4cxx,INCLUDE_DIRECTORIES>)
target_link_libraries(${testName} PRIVATE testingFramework
testingUtilities log4cxx ${APR_LIBRARIES} ${APR_SYSTEM_LIBS} Threads::Threads)
add_test(NAME ${testName}
COMMAND ${testName} -v
- WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../resources
+ WORKING_DIRECTORY ${UNIT_TEST_WORKING_DIR}
)
set_tests_properties( ${testName} PROPERTIES TIMEOUT 120 )
@@ -102,6 +104,10 @@ foreach(testName IN LISTS ALL_LOG4CXX_TESTS)
set_tests_properties(socketservertestcase PROPERTIES
ENVIRONMENT
"SOCKET_SERVER_PARAMETER_FILE=${START_SOCKET_SERVER_PARAMETER_FILE};PATH=${ESCAPED_PATH}"
)
+ elseif(${testName} STREQUAL autoconfiguretestcase)
+ set_tests_properties(autoconfiguretestcase PROPERTIES
+ ENVIRONMENT
"LOG4CXX_CONFIGURATION=${UNIT_TEST_WORKING_DIR}/input/autoConfigureTest.properties;PATH=${ESCAPED_PATH}"
+ )
else()
set_tests_properties(${testName} PROPERTIES
ENVIRONMENT
"TOTO=wonderful;key1=value1;key2=value2;PATH=${ESCAPED_PATH}"
@@ -112,6 +118,10 @@ foreach(testName IN LISTS ALL_LOG4CXX_TESTS)
set_tests_properties(socketservertestcase PROPERTIES
ENVIRONMENT
"SOCKET_SERVER_PARAMETER_FILE=${START_SOCKET_SERVER_PARAMETER_FILE}"
)
+ elseif(${testName} STREQUAL autoconfiguretestcase)
+ set_tests_properties(autoconfiguretestcase PROPERTIES
+ ENVIRONMENT
"LOG4CXX_CONFIGURATION=${UNIT_TEST_WORKING_DIR}/input/autoConfigureTest.properties"
+ )
else()
set_tests_properties(${testName} PROPERTIES
ENVIRONMENT "TOTO=wonderful;key1=value1;key2=value2"
diff --git a/src/test/cpp/mdctestcase.cpp
b/src/test/cpp/autoconfiguretestcase.cpp
similarity index 57%
copy from src/test/cpp/mdctestcase.cpp
copy to src/test/cpp/autoconfiguretestcase.cpp
index 86b147f..008b1dd 100644
--- a/src/test/cpp/mdctestcase.cpp
+++ b/src/test/cpp/autoconfiguretestcase.cpp
@@ -1,4 +1,3 @@
-
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -15,51 +14,39 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-#include <log4cxx/mdc.h>
-#include <log4cxx/file.h>
-#include <log4cxx/logger.h>
-#include <log4cxx/propertyconfigurator.h>
-#include "insertwide.h"
#include "logunit.h"
+#include <log4cxx/logger.h>
+#include <log4cxx/logmanager.h>
+#include <log4cxx/file.h>
#include "util/compare.h"
-
-
using namespace log4cxx;
-
-LOGUNIT_CLASS(MDCTestCase)
+LOGUNIT_CLASS(AutoConfigureTestCase)
{
- LOGUNIT_TEST_SUITE(MDCTestCase);
+ LOGUNIT_TEST_SUITE(AutoConfigureTestCase);
LOGUNIT_TEST(test1);
+ LOGUNIT_TEST(test2);
LOGUNIT_TEST_SUITE_END();
public:
- void setUp()
- {
- }
-
- void tearDown()
+ void test1()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
Logger::getRootLogger()->getLoggerRepository().lock();
- if (rep) {
- rep->resetConfiguration();
- }
- }
+ LoggerPtr debugLogger =
Logger::getLogger(LOG4CXX_STR("AutoConfig.test1"));
+ LOGUNIT_ASSERT(!debugLogger->isDebugEnabled());
+
LOGUNIT_ASSERT(LogManager::getLoggerRepository()->isConfigured());
+ }
- /**
- * log4cxx 0.10.0 did not replace previously set value.
- */
- void test1()
+ void test2()
{
- std::string key("key1");
- std::string expected("value2");
- MDC::put(key, "value1");
- MDC::put(key, expected);
- std::string actual(MDC::get(key));
- LOGUNIT_ASSERT_EQUAL(expected, actual);
+ LoggerPtr debugLogger =
Logger::getLogger(LOG4CXX_STR("AutoConfig.test2"));
+ LOGUNIT_ASSERT(debugLogger->isDebugEnabled());
+ LOG4CXX_DEBUG(debugLogger, LOG4CXX_STR("This is some expected
ouput"));
+ LOGUNIT_ASSERT_EQUAL(true, Compare::compare
+ ( File("output/autoConfigureTest.log")
+ , File("witness/autoConfigureTest.log")
+ ));
}
};
-LOGUNIT_TEST_SUITE_REGISTRATION(MDCTestCase);
+LOGUNIT_TEST_SUITE_REGISTRATION(AutoConfigureTestCase);
diff --git a/src/test/cpp/customlogger/xlogger.cpp
b/src/test/cpp/customlogger/xlogger.cpp
index 7efb8d3..2fb5495 100644
--- a/src/test/cpp/customlogger/xlogger.cpp
+++ b/src/test/cpp/customlogger/xlogger.cpp
@@ -32,8 +32,8 @@ XFactoryPtr XLogger::factory = XFactoryPtr(new XFactory());
void XLogger::lethal(const LogString& message, const LocationInfo&
locationInfo)
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (rep->isDisabled(XLevel::LETHAL_INT))
+ auto rep = repository;
+ if (!rep || rep->isDisabled(XLevel::LETHAL_INT))
{
return;
}
@@ -46,8 +46,8 @@ void XLogger::lethal(const LogString& message, const
LocationInfo& locationInfo)
void XLogger::lethal(const LogString& message)
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (rep->isDisabled(XLevel::LETHAL_INT))
+ auto rep = repository;
+ if (!rep || rep->isDisabled(XLevel::LETHAL_INT))
{
return;
}
@@ -70,8 +70,8 @@ LoggerPtr XLogger::getLogger(const helpers::Class& clazz)
void XLogger::trace(const LogString& message, const LocationInfo& locationInfo)
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (rep->isDisabled(XLevel::TRACE_INT))
+ auto rep = repository;
+ if (!rep || rep->isDisabled(XLevel::TRACE_INT))
{
return;
}
@@ -84,8 +84,8 @@ void XLogger::trace(const LogString& message, const
LocationInfo& locationInfo)
void XLogger::trace(const LogString& message)
{
- log4cxx::spi::LoggerRepositoryPtr rep = repository.lock();
- if (rep->isDisabled(XLevel::TRACE_INT))
+ auto rep = repository;
+ if (!rep || rep->isDisabled(XLevel::TRACE_INT))
{
return;
}
diff --git a/src/test/cpp/customlogger/xloggertestcase.cpp
b/src/test/cpp/customlogger/xloggertestcase.cpp
index 22add6e..c18934b 100644
--- a/src/test/cpp/customlogger/xloggertestcase.cpp
+++ b/src/test/cpp/customlogger/xloggertestcase.cpp
@@ -52,8 +52,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
logger->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = logger->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/encodingtest.cpp b/src/test/cpp/encodingtest.cpp
index 9379eb3..e9f5462 100644
--- a/src/test/cpp/encodingtest.cpp
+++ b/src/test/cpp/encodingtest.cpp
@@ -58,8 +58,8 @@ public:
*/
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
Logger::getRootLogger()->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = Logger::getRootLogger()->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/hierarchythresholdtestcase.cpp
b/src/test/cpp/hierarchythresholdtestcase.cpp
index 7afce17..c7ee9c4 100644
--- a/src/test/cpp/hierarchythresholdtestcase.cpp
+++ b/src/test/cpp/hierarchythresholdtestcase.cpp
@@ -49,8 +49,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
logger->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = logger->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/l7dtestcase.cpp b/src/test/cpp/l7dtestcase.cpp
index c368b45..9b2dc57 100644
--- a/src/test/cpp/l7dtestcase.cpp
+++ b/src/test/cpp/l7dtestcase.cpp
@@ -67,8 +67,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
root->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = root->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/mdctestcase.cpp b/src/test/cpp/mdctestcase.cpp
index 86b147f..4c76749 100644
--- a/src/test/cpp/mdctestcase.cpp
+++ b/src/test/cpp/mdctestcase.cpp
@@ -42,8 +42,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
Logger::getRootLogger()->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = Logger::getRootLogger()->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/minimumtestcase.cpp b/src/test/cpp/minimumtestcase.cpp
index 49d5b34..e6284ac 100644
--- a/src/test/cpp/minimumtestcase.cpp
+++ b/src/test/cpp/minimumtestcase.cpp
@@ -66,8 +66,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
root->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = root->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/multithreadtest.cpp b/src/test/cpp/multithreadtest.cpp
index e5ac7c7..91ca614 100644
--- a/src/test/cpp/multithreadtest.cpp
+++ b/src/test/cpp/multithreadtest.cpp
@@ -84,7 +84,6 @@ public:
void tearDown()
{
-// root->getLoggerRepository()->resetConfiguration();
}
void testMultithreadedLoggers(){
diff --git a/src/test/cpp/ndctestcase.cpp b/src/test/cpp/ndctestcase.cpp
index 72de1eb..db0250a 100644
--- a/src/test/cpp/ndctestcase.cpp
+++ b/src/test/cpp/ndctestcase.cpp
@@ -47,8 +47,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
logger->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = logger->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/net/socketservertestcase.cpp
b/src/test/cpp/net/socketservertestcase.cpp
index 72a99f0..e1a9172 100644
--- a/src/test/cpp/net/socketservertestcase.cpp
+++ b/src/test/cpp/net/socketservertestcase.cpp
@@ -131,8 +131,8 @@ public:
void tearDown()
{
socketAppender = 0;
- log4cxx::spi::LoggerRepositoryPtr rep =
root->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = root->getLoggerRepository())
+ {
rep->resetConfiguration();
}
logger = 0;
diff --git a/src/test/cpp/patternlayouttest.cpp
b/src/test/cpp/patternlayouttest.cpp
index c93a3f4..1db3676 100644
--- a/src/test/cpp/patternlayouttest.cpp
+++ b/src/test/cpp/patternlayouttest.cpp
@@ -94,8 +94,8 @@ public:
void tearDown()
{
MDC::clear();
- log4cxx::spi::LoggerRepositoryPtr rep =
root->getLoggerRepository().lock();
- if (rep) rep->resetConfiguration();
+ if (auto rep = root->getLoggerRepository())
+ rep->resetConfiguration();
}
void test1()
diff --git a/src/test/cpp/varia/errorhandlertestcase.cpp
b/src/test/cpp/varia/errorhandlertestcase.cpp
index ba185a1..9db59cc 100644
--- a/src/test/cpp/varia/errorhandlertestcase.cpp
+++ b/src/test/cpp/varia/errorhandlertestcase.cpp
@@ -50,8 +50,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
logger->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = logger->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/varia/levelmatchfiltertestcase.cpp
b/src/test/cpp/varia/levelmatchfiltertestcase.cpp
index 94d676d..0d20acc 100644
--- a/src/test/cpp/varia/levelmatchfiltertestcase.cpp
+++ b/src/test/cpp/varia/levelmatchfiltertestcase.cpp
@@ -56,8 +56,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
root->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = root->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/varia/levelrangefiltertestcase.cpp
b/src/test/cpp/varia/levelrangefiltertestcase.cpp
index 4b4f9b9..50cf7d1 100644
--- a/src/test/cpp/varia/levelrangefiltertestcase.cpp
+++ b/src/test/cpp/varia/levelrangefiltertestcase.cpp
@@ -56,8 +56,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
root->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = root->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/xml/domtestcase.cpp b/src/test/cpp/xml/domtestcase.cpp
index 0d12181..d9873fe 100644
--- a/src/test/cpp/xml/domtestcase.cpp
+++ b/src/test/cpp/xml/domtestcase.cpp
@@ -76,8 +76,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
root->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = root->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/cpp/xml/xmllayouttestcase.cpp
b/src/test/cpp/xml/xmllayouttestcase.cpp
index bed2d86..561adaa 100644
--- a/src/test/cpp/xml/xmllayouttestcase.cpp
+++ b/src/test/cpp/xml/xmllayouttestcase.cpp
@@ -82,8 +82,8 @@ public:
void tearDown()
{
- log4cxx::spi::LoggerRepositoryPtr rep =
logger->getLoggerRepository().lock();
- if (rep) {
+ if (auto rep = logger->getLoggerRepository())
+ {
rep->resetConfiguration();
}
}
diff --git a/src/test/resources/input/autoConfigureTest.properties
b/src/test/resources/input/autoConfigureTest.properties
new file mode 100644
index 0000000..1187d13
--- /dev/null
+++ b/src/test/resources/input/autoConfigureTest.properties
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+log4j.rootCategory=INFO, A1
+
+log4j.appender.A1=org.apache.log4j.FileAppender
+log4j.appender.A1.File=output/autoConfigureTest.log
+log4j.appender.A1.Append=false
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%m%n
+
+#log4j.logger.AutoConfig.test1=DEBUG
+log4j.logger.AutoConfig.test2=DEBUG
diff --git a/src/test/resources/witness/autoConfigureTest.log
b/src/test/resources/witness/autoConfigureTest.log
new file mode 100644
index 0000000..d35848f
--- /dev/null
+++ b/src/test/resources/witness/autoConfigureTest.log
@@ -0,0 +1 @@
+This is some expected ouput