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 2025/12/24 01:49:34 UTC

(logging-log4cxx) branch master updated: Allow the currently executing program file path components to be used in a properties configuration file (#572)

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 fb5fad55 Allow the currently executing program file path components to be used in a properties configuration file (#572)
fb5fad55 is described below

commit fb5fad5537725efed6788e76cc60409d5985e33a
Author: Stephen Webb <st...@ieee.org>
AuthorDate: Wed Dec 24 12:49:29 2025 +1100

    Allow the currently executing program file path components to be used in a properties configuration file (#572)
    
    * Make Properties::load additive
---
 src/main/cpp/properties.cpp                        |  7 ++-----
 src/test/cpp/autoconfiguretestcase.cpp             | 24 ++++++++++++++--------
 .../resources/input/autoConfigureTest.properties   |  2 +-
 3 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/main/cpp/properties.cpp b/src/main/cpp/properties.cpp
index dfa72f83..03651006 100644
--- a/src/main/cpp/properties.cpp
+++ b/src/main/cpp/properties.cpp
@@ -442,11 +442,8 @@ LogString Properties::get(const LogString& key) const
 void Properties::load(InputStreamPtr inStream)
 {
 	Pool pool;
-	auto lineReader = std::make_shared<InputStreamReader>(inStream, CharsetDecoder::getISOLatinDecoder());
-	LogString contents = lineReader->read(pool);
-	properties->clear();
-	PropertyParser parser;
-	parser.parse(contents, *this);
+	auto contents = InputStreamReader(inStream, CharsetDecoder::getISOLatinDecoder()).read(pool);
+	PropertyParser().parse(contents, *this);
 }
 
 std::vector<LogString> Properties::propertyNames() const
diff --git a/src/test/cpp/autoconfiguretestcase.cpp b/src/test/cpp/autoconfiguretestcase.cpp
index da634bee..df21032f 100644
--- a/src/test/cpp/autoconfiguretestcase.cpp
+++ b/src/test/cpp/autoconfiguretestcase.cpp
@@ -17,6 +17,7 @@
 #include "logunit.h"
 #include <log4cxx/logger.h>
 #include <log4cxx/logmanager.h>
+#include <log4cxx/fileappender.h>
 #include <log4cxx/defaultconfigurator.h>
 #include <log4cxx/helpers/bytebuffer.h>
 #include <log4cxx/helpers/exception.h>
@@ -57,6 +58,7 @@ using namespace log4cxx;
 LOGUNIT_CLASS(AutoConfigureTestCase)
 {
 	LOGUNIT_TEST_SUITE(AutoConfigureTestCase);
+	LOGUNIT_TEST(testSetup);
 	LOGUNIT_TEST(test1);
 	LOGUNIT_TEST(test2);
 	LOGUNIT_TEST_SUITE_END();
@@ -90,11 +92,10 @@ public:
 
 	void setUp()
 	{
-#if LOG4CXX_HAS_FILESYSTEM_PATH
-		auto fileName = spi::Configurator::properties().getProperty(LOG4CXX_STR("PROGRAM_FILE_PATH.STEM"));
-#else
-		LogString fileName = LOG4CXX_STR("autoconfiguretestcase");
+#if !LOG4CXX_HAS_FILESYSTEM_PATH
+		spi::Configurator::properties().setProperty(LOG4CXX_STR("PROGRAM_FILE_PATH.STEM"), LOG4CXX_STR("autoconfiguretestcase"));
 #endif
+		auto fileName = spi::Configurator::properties().getProperty(LOG4CXX_STR("PROGRAM_FILE_PATH.STEM"));
 		auto lsTempDir = helpers::OptionConverter::getSystemProperty(LOG4CXX_STR("TEMP"), LOG4CXX_STR("/tmp"));
 		copyPropertyFile(lsTempDir, fileName);
 		DefaultConfigurator::setConfigurationWatchSeconds(1);
@@ -102,11 +103,7 @@ public:
 			{ lsTempDir
 			};
 		std::vector<LogString> names
-#if LOG4CXX_HAS_FILESYSTEM_PATH
 			{ LOG4CXX_STR("${PROGRAM_FILE_PATH.STEM}.properties")
-#else
-			{ LOG4CXX_STR("autoconfiguretestcase.properties")
-#endif
 			};
 		std::tie(m_status, m_configFile) = DefaultConfigurator::configureFromFile(paths, names);
 	}
@@ -120,7 +117,16 @@ public:
 		apr_sleep(200000);
 	}
 
-	void test1()	
+	void testSetup()
+	{
+		auto fa = LOG4CXX_NS::cast<FileAppender>(LogManager::getRootLogger()->getAppender(LOG4CXX_STR("A1")));
+		LOGUNIT_ASSERT(fa);
+		auto fileName = spi::Configurator::properties().getProperty(LOG4CXX_STR("PROGRAM_FILE_PATH.STEM"));
+		File logFile(fa->getFile());
+		LOGUNIT_ASSERT_EQUAL(fileName + LOG4CXX_STR(".log"), logFile.getName());
+	}
+
+	void test1()
 	{
 		LOGUNIT_ASSERT_EQUAL(m_status, spi::ConfigurationStatus::Configured);
 		LOGUNIT_ASSERT(File(m_configFile).exists(m_pool));
diff --git a/src/test/resources/input/autoConfigureTest.properties b/src/test/resources/input/autoConfigureTest.properties
index 1187d130..b91cf129 100644
--- a/src/test/resources/input/autoConfigureTest.properties
+++ b/src/test/resources/input/autoConfigureTest.properties
@@ -16,7 +16,7 @@
 log4j.rootCategory=INFO, A1
 
 log4j.appender.A1=org.apache.log4j.FileAppender
-log4j.appender.A1.File=output/autoConfigureTest.log
+log4j.appender.A1.File=output/${PROGRAM_FILE_PATH.STEM}.log
 log4j.appender.A1.Append=false
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%m%n