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 2023/01/22 23:48:59 UTC

[logging-log4cxx] branch master updated: Non-char logchar compilation errors (#183)

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 d1db1e35 Non-char logchar compilation errors (#183)
d1db1e35 is described below

commit d1db1e3524198343b9692964e5d6def5ebbd2110
Author: Stephen Webb <st...@ieee.org>
AuthorDate: Mon Jan 23 10:48:55 2023 +1100

    Non-char logchar compilation errors (#183)
    
    * Ensure CI catches logchar related compilation errors
    
    * LOG4CXX=unichar not checked in CI due to lack of support by VS 2022
---
 .github/workflows/log4cxx-windows.yml              |  2 +-
 src/main/cpp/colorstartpatternconverter.cpp        | 12 ++---
 src/main/cpp/defaultconfigurator.cpp               | 19 +++++---
 src/main/cpp/domconfigurator.cpp                   |  5 +--
 src/main/cpp/exception.cpp                         | 10 +++--
 src/main/cpp/fmtlayout.cpp                         | 51 ++++++++++++++--------
 src/main/cpp/locationinfofilter.cpp                | 13 +++---
 src/main/cpp/loggingevent.cpp                      |  2 +-
 src/main/cpp/loglog.cpp                            |  2 +-
 src/main/cpp/patternlayout.cpp                     |  2 +-
 src/main/cpp/propertyconfigurator.cpp              |  5 ++-
 src/main/cpp/rollingfileappender.cpp               | 28 +++++-------
 src/main/cpp/threadutility.cpp                     |  1 +
 src/test/cpp/filter/locationinfofiltertest.cpp     |  2 +-
 src/test/cpp/fmttest.cpp                           |  8 ++--
 src/test/cpp/helpers/localechanger.cpp             | 12 +++--
 .../cpp/pattern/colorstartpatternconvertertest.cpp | 46 +++++++++----------
 src/test/cpp/pattern/patternparsertestcase.cpp     |  1 +
 18 files changed, 125 insertions(+), 96 deletions(-)

diff --git a/.github/workflows/log4cxx-windows.yml b/.github/workflows/log4cxx-windows.yml
index 012c41c0..e8b73a0b 100644
--- a/.github/workflows/log4cxx-windows.yml
+++ b/.github/workflows/log4cxx-windows.yml
@@ -74,7 +74,7 @@ jobs:
         cd main
         mkdir build
         cd build
-        cmake -DLOG4CXX_TEST_PROGRAM_PATH=C:\msys64\usr\bin "-DCMAKE_TOOLCHAIN_FILE=$THISDIR/vcpkg/scripts/buildsystems/vcpkg.cmake" ..
+        cmake -DLOG4CXX_TEST_PROGRAM_PATH=C:\msys64\usr\bin -DLOG4CXX_CHAR=wchar_t  "-DCMAKE_TOOLCHAIN_FILE=$THISDIR/vcpkg/scripts/buildsystems/vcpkg.cmake" ..
         cmake --build .
 
     - name: run unit tests
diff --git a/src/main/cpp/colorstartpatternconverter.cpp b/src/main/cpp/colorstartpatternconverter.cpp
index 72eb9f32..1193f6fd 100644
--- a/src/main/cpp/colorstartpatternconverter.cpp
+++ b/src/main/cpp/colorstartpatternconverter.cpp
@@ -122,10 +122,10 @@ static LogString convertSingleSequence(const LogString& sequence, Pool& pool){
 		return LOG4CXX_STR("");
 	}
 
-	if(StringHelper::startsWith(sequence, "fg(")){
+	if(StringHelper::startsWith(sequence, LOG4CXX_STR("fg("))){
 		// Parse foreground
 		return colorToANSISequence(strInParens, true, pool);
-	}else if(StringHelper::startsWith(sequence, "bg(")){
+	}else if(StringHelper::startsWith(sequence, LOG4CXX_STR("bg("))){
 		return colorToANSISequence(strInParens, false, pool);
 	}else{
 		return graphicsModeToANSISequence(sequence, pool);
@@ -234,7 +234,7 @@ void ColorStartPatternConverter::parseColor(const LogString& color, LogString* r
 		return;
 	}
 
-	if( StringHelper::startsWith(lower, "\\x1b") ){
+	if( StringHelper::startsWith(lower, LOG4CXX_STR("\\x1b")) ){
 		if( color[color.size() - 1] != 'm' ){
 			// In order for this to be a valid ANSI escape sequence,
 			// it must end with an 'm'.  If it does not, reject.
@@ -242,7 +242,7 @@ void ColorStartPatternConverter::parseColor(const LogString& color, LogString* r
 		}
 		// We start with an escape sequence, copy the data over after the escape byte
 		result->clear();
-		result->append("\x1b");
+		result->append(LOG4CXX_STR("\x1b"));
 		for( size_t x = 4; x < color.size(); x++ ){
 			result->push_back(color[x]);
 		}
@@ -252,7 +252,7 @@ void ColorStartPatternConverter::parseColor(const LogString& color, LogString* r
 		// https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
 		// https://en.wikipedia.org/wiki/ANSI_escape_code
 		result->clear();
-		result->append("\x1b[");
+		result->append(LOG4CXX_STR("\x1b["));
 		LogString tmp;
 		for( size_t x = 0; x < color.size(); x++ ){
 			if(color[x] == '|' ){
@@ -272,6 +272,6 @@ void ColorStartPatternConverter::parseColor(const LogString& color, LogString* r
 			result->push_back(';');
 			result->append(toAppend);
 		}
-		result->append("m");
+		result->append(LOG4CXX_STR("m"));
 	}
 }
diff --git a/src/main/cpp/defaultconfigurator.cpp b/src/main/cpp/defaultconfigurator.cpp
index a8bdddb7..5bb254bf 100644
--- a/src/main/cpp/defaultconfigurator.cpp
+++ b/src/main/cpp/defaultconfigurator.cpp
@@ -61,9 +61,14 @@ void DefaultConfigurator::configure(LoggerRepositoryPtr repository)
 
 	if (configurationFileName.empty())
 	{
-		const char* names[] = { "log4cxx.xml", "log4cxx.properties", "log4j.xml", "log4j.properties", 0 };
-
-		for (int i = 0; names[i] != 0; i++)
+		LogString names[4] =
+			{ LOG4CXX_STR("log4cxx.xml")
+			, LOG4CXX_STR("log4cxx.properties")
+			, LOG4CXX_STR("log4j.xml")
+			, LOG4CXX_STR("log4j.properties")
+			};
+
+		for (int i = 0; i < 4; i++)
 		{
 			File candidate(names[i]);
 
@@ -153,9 +158,9 @@ int DefaultConfigurator::getConfigurationWatchDelay()
 }
 
 log4cxx::spi::ConfigurationStatus DefaultConfigurator::tryLoadFile(const LogString& filename){
-	if(helpers::StringHelper::endsWith(filename, ".xml")){
+	if(helpers::StringHelper::endsWith(filename, LOG4CXX_STR(".xml"))){
 		return log4cxx::xml::DOMConfigurator::configure(filename);
-	}else if(helpers::StringHelper::endsWith(filename, ".properties")){
+	}else if(helpers::StringHelper::endsWith(filename, LOG4CXX_STR(".properties"))){
 		return log4cxx::PropertyConfigurator::configure(filename);
 	}
 
@@ -168,7 +173,7 @@ DefaultConfigurator::configureFromFile(const std::vector<LogString>& directories
 
 	for( LogString dir : directories ){
 		for( LogString fname : filenames ){
-			LogString canidate_str = dir + "/" + fname;
+			LogString canidate_str = dir + LOG4CXX_STR("/") + fname;
 			File candidate(canidate_str);
 
 			LogString debugMsg = LOG4CXX_STR("Checking file ");
@@ -180,7 +185,7 @@ DefaultConfigurator::configureFromFile(const std::vector<LogString>& directories
 				if( configStatus == log4cxx::spi::ConfigurationStatus::Configured ){
 					return {configStatus, canidate_str};
 				}
-				LogLog::debug("Unable to load file: trying next");
+				LogLog::debug(LOG4CXX_STR("Unable to load file: trying next"));
 			}
 		}
 	}
diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp
index 360b9bfb..f5488fdd 100644
--- a/src/main/cpp/domconfigurator.cpp
+++ b/src/main/cpp/domconfigurator.cpp
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 #include <log4cxx/logstring.h>
 #include <log4cxx/xml/domconfigurator.h>
 #include <log4cxx/appender.h>
@@ -63,7 +62,6 @@ struct DOMConfigurator::DOMConfiguratorPrivate
 	spi::LoggerFactoryPtr loggerFactory;
 };
 
-
 #if APR_HAS_THREADS
 namespace log4cxx
 {
@@ -802,7 +800,8 @@ spi::ConfigurationStatus DOMConfigurator::doConfigure(const File& filename, spi:
 		LogString msg2(LOG4CXX_STR("Could not read configuration file ["));
 		msg2.append(filename.getPath());
 		msg2.append(LOG4CXX_STR("]. "));
-		msg2.append(io.what());
+		LOG4CXX_DECODE_CHAR(msg, io.what());
+		msg2.append(msg);
 		LogLog::error(msg2);
 		return spi::ConfigurationStatus::NotConfigured;
 	}
diff --git a/src/main/cpp/exception.cpp b/src/main/cpp/exception.cpp
index 7eeaf005..ba7c0074 100644
--- a/src/main/cpp/exception.cpp
+++ b/src/main/cpp/exception.cpp
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 #include <log4cxx/logstring.h>
 #include <log4cxx/helpers/exception.h>
 #include <string.h>
@@ -175,9 +174,12 @@ LogString IOException::formatMessage(log4cxx_status_t stat)
 	LogString s(LOG4CXX_STR("IO Exception : status code = "));
 	Pool p;
 	StringHelper::toString(stat, p, s);
-	s.append("(");
-	s.append(apr_strerror(stat, err_buff, sizeof(err_buff)));
-	s.append(")");
+	s.append(LOG4CXX_STR("("));
+	apr_strerror(stat, err_buff, sizeof(err_buff));
+	std::string sMsg = err_buff;
+	LOG4CXX_DECODE_CHAR(lsMsg, sMsg);
+	s.append(lsMsg);
+	s.append(LOG4CXX_STR(")"));
 	return s;
 }
 
diff --git a/src/main/cpp/fmtlayout.cpp b/src/main/cpp/fmtlayout.cpp
index 20b7cf54..62de068a 100644
--- a/src/main/cpp/fmtlayout.cpp
+++ b/src/main/cpp/fmtlayout.cpp
@@ -20,6 +20,7 @@
 #include <log4cxx/helpers/stringhelper.h>
 #include <log4cxx/helpers/pool.h>
 #include <log4cxx/helpers/optionconverter.h>
+#include <log4cxx/helpers/transcoder.h>
 #include <log4cxx/level.h>
 #include <chrono>
 
@@ -82,17 +83,33 @@ void FMTLayout::format(LogString& output,
 	const spi::LoggingEventPtr& event,
 	log4cxx::helpers::Pool&) const
 {
-	LogString locationFull = fmt::format("{}({})",
+	auto locationFull = fmt::format("{}({})",
 										 event->getLocationInformation().getFileName(),
 										 event->getLocationInformation().getLineNumber());
 	LogString ndc;
 	event->getNDC(ndc);
-
+#if LOG4CXX_LOGCHAR_IS_WCHAR || LOG4CXX_LOGCHAR_IS_UNICHAR
+	LOG4CXX_ENCODE_CHAR(sNDC, ndc);
+	LOG4CXX_ENCODE_CHAR(sPattern, m_priv->conversionPattern);
+	LOG4CXX_ENCODE_CHAR(sLogger, event->getLoggerName());
+	LOG4CXX_ENCODE_CHAR(sLevel, event->getLevel()->toString());
+	LOG4CXX_ENCODE_CHAR(sMsg, event->getMessage());
+	LOG4CXX_ENCODE_CHAR(sThread, event->getThreadName());
+	LOG4CXX_ENCODE_CHAR(endOfLine, LOG4CXX_EOL);
+#else
+	auto& sNDC = ndc;
+	auto& sPattern = m_priv->conversionPattern;
+	auto& sLogger = event->getLoggerName();
+	auto sLevel = event->getLevel()->toString();
+	auto& sMsg = event->getMessage();
+	auto& sThread = event->getThreadName();
+	auto endOfLine = LOG4CXX_EOL;
+#endif
 	fmt::format_to(std::back_inserter(output),
-				   m_priv->conversionPattern,
+				   sPattern,
 				   fmt::arg("d", event->getChronoTimeStamp()),
-				   fmt::arg("c", event->getLoggerName()),
-				   fmt::arg("logger", event->getLoggerName()),
+				   fmt::arg("c", sLogger),
+				   fmt::arg("logger", sLogger),
 				   fmt::arg("f", event->getLocationInformation().getShortFileName()),
 				   fmt::arg("shortfilename", event->getLocationInformation().getShortFileName()),
 				   fmt::arg("F", event->getLocationInformation().getFileName()),
@@ -101,20 +118,20 @@ void FMTLayout::format(LogString& output,
 				   fmt::arg("location", locationFull),
 				   fmt::arg("L", event->getLocationInformation().getLineNumber()),
 				   fmt::arg("line", event->getLocationInformation().getLineNumber()),
-				   fmt::arg("m", event->getMessage()),
-				   fmt::arg("message", event->getMessage()),
+				   fmt::arg("m", sMsg),
+				   fmt::arg("message", sMsg),
 				   fmt::arg("M", event->getLocationInformation().getMethodName()),
 				   fmt::arg("method", event->getLocationInformation().getMethodName()),
-				   fmt::arg("n", LOG4CXX_EOL),
-				   fmt::arg("newline", LOG4CXX_EOL),
-				   fmt::arg("p", event->getLevel()->toString()),
-				   fmt::arg("level", event->getLevel()->toString()),
+				   fmt::arg("n", endOfLine),
+				   fmt::arg("newline", endOfLine),
+				   fmt::arg("p", sLevel),
+				   fmt::arg("level", sLevel),
 				   fmt::arg("r", event->getTimeStamp()),
-				   fmt::arg("t", event->getThreadName()),
-				   fmt::arg("thread", event->getThreadName()),
-				   fmt::arg("T", event->getThreadUserName()),
-				   fmt::arg("threadname", event->getThreadUserName()),
-				   fmt::arg("x", ndc),
-				   fmt::arg("ndc", ndc)
+				   fmt::arg("t", sThread),
+				   fmt::arg("thread", sThread),
+				   fmt::arg("T", sThread),
+				   fmt::arg("threadname", sThread),
+				   fmt::arg("x", sNDC),
+				   fmt::arg("ndc", sNDC)
 				   );
 }
diff --git a/src/main/cpp/locationinfofilter.cpp b/src/main/cpp/locationinfofilter.cpp
index db8612fe..7224fcbc 100644
--- a/src/main/cpp/locationinfofilter.cpp
+++ b/src/main/cpp/locationinfofilter.cpp
@@ -22,6 +22,7 @@
 #include <log4cxx/helpers/optionconverter.h>
 #include <log4cxx/private/filter_priv.h>
 #include <log4cxx/helpers/loglog.h>
+#include <log4cxx/helpers/transcoder.h>
 
 using namespace log4cxx;
 using namespace log4cxx::filter;
@@ -40,8 +41,8 @@ struct LocationInfoFilter::LocationInfoFilterPrivate : public FilterPrivate
 
 	bool    acceptOnMatch;
 	bool    mustMatchAll; // true = AND; false = OR
-	int lineNumber;
-	LogString methodName;
+	int     lineNumber;
+	std::string methodName;
 };
 
 IMPLEMENT_LOG4CXX_OBJECT(LocationInfoFilter)
@@ -56,7 +57,7 @@ LocationInfoFilter::~LocationInfoFilter() {}
 void LocationInfoFilter::setOption(  const LogString& option,
 	const LogString& value)
 {
-	LogLog::warn(option + ":" + value);
+	LogLog::warn(option + LOG4CXX_STR(":") + value);
 	if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("ACCEPTONMATCH"), LOG4CXX_STR("acceptonmatch")))
 	{
 		priv->acceptOnMatch = OptionConverter::toBoolean(value, priv->acceptOnMatch);
@@ -71,7 +72,8 @@ void LocationInfoFilter::setOption(  const LogString& option,
 	}
 	else if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("METHOD"), LOG4CXX_STR("method")))
 	{
-		priv->methodName = value;
+		LOG4CXX_ENCODE_CHAR(sName, value);
+		priv->methodName = sName;
 	}
 }
 
@@ -134,5 +136,6 @@ void LocationInfoFilter::setLineNumber(int lineNum){
 }
 
 void LocationInfoFilter::setMethodName(const LogString& methodName){
-	priv->methodName = methodName;
+	LOG4CXX_ENCODE_CHAR(sName, methodName);
+	priv->methodName = sName;
 }
diff --git a/src/main/cpp/loggingevent.cpp b/src/main/cpp/loggingevent.cpp
index cc7f7479..aa7d304e 100644
--- a/src/main/cpp/loggingevent.cpp
+++ b/src/main/cpp/loggingevent.cpp
@@ -395,7 +395,7 @@ const LogString& LoggingEvent::getCurrentThreadUserName()
 		if (SUCCEEDED(hr))
 		{
 			std::wstring wresult = result;
-			LOG4CXX_DECODE_UNICHAR(decoded, wresult);
+			LOG4CXX_DECODE_WCHAR(decoded, wresult);
 			LocalFree(result);
 			thread_name = decoded;
 		}
diff --git a/src/main/cpp/loglog.cpp b/src/main/cpp/loglog.cpp
index 55929fd8..e9977197 100644
--- a/src/main/cpp/loglog.cpp
+++ b/src/main/cpp/loglog.cpp
@@ -48,7 +48,7 @@ struct LogLog::LogLogPrivate {
 LogLog::LogLog() :
 	m_priv(std::make_unique<LogLogPrivate>())
 {
-	LogString log4cxxDebug = OptionConverter::getSystemProperty(LOG4CXX_STR("LOG4CXX_DEBUG"), "false");
+	LogString log4cxxDebug = OptionConverter::getSystemProperty(LOG4CXX_STR("LOG4CXX_DEBUG"), LOG4CXX_STR("false"));
 	m_priv->debugEnabled = OptionConverter::toBoolean(log4cxxDebug, false);
 }
 
diff --git a/src/main/cpp/patternlayout.cpp b/src/main/cpp/patternlayout.cpp
index b2f6c56b..08260190 100644
--- a/src/main/cpp/patternlayout.cpp
+++ b/src/main/cpp/patternlayout.cpp
@@ -140,7 +140,7 @@ void PatternLayout::setOption(const LogString& option, const LogString& value)
 											LOG4CXX_STR("ERRORCOLOR"),
 											LOG4CXX_STR("errorcolor"))){
 		m_priv->m_errorColor = value;
-		LogLog::debug("Setting error color to ");
+		LogLog::debug(LOG4CXX_STR("Setting error color to "));
 		LogLog::debug(value);
 	}else if(StringHelper::equalsIgnoreCase(option,
 											LOG4CXX_STR("FATALCOLOR"),
diff --git a/src/main/cpp/propertyconfigurator.cpp b/src/main/cpp/propertyconfigurator.cpp
index 2ece4d1a..72a3c920 100644
--- a/src/main/cpp/propertyconfigurator.cpp
+++ b/src/main/cpp/propertyconfigurator.cpp
@@ -103,8 +103,9 @@ spi::ConfigurationStatus PropertyConfigurator::doConfigure(const File& configFil
 	}
 	catch (const IOException& ex)
 	{
+		LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 		LogLog::error(((LogString) LOG4CXX_STR("Could not read configuration file ["))
-			+ configFileName.getPath() + LOG4CXX_STR("].") + ": " + ex.what());
+			+ configFileName.getPath() + LOG4CXX_STR("]: ") + lsMsg);
 		return spi::ConfigurationStatus::NotConfigured;
 	}
 
@@ -118,7 +119,7 @@ spi::ConfigurationStatus PropertyConfigurator::doConfigure(const File& configFil
 	catch (const std::exception& ex)
 	{
 		LogLog::error(((LogString) LOG4CXX_STR("Could not parse configuration file ["))
-			+ configFileName.getPath() + LOG4CXX_STR("]."), ex);
+			+ configFileName.getPath() + LOG4CXX_STR("]: "), ex);
 	}
 
 	return spi::ConfigurationStatus::NotConfigured;
diff --git a/src/main/cpp/rollingfileappender.cpp b/src/main/cpp/rollingfileappender.cpp
index 52b940aa..df553777 100644
--- a/src/main/cpp/rollingfileappender.cpp
+++ b/src/main/cpp/rollingfileappender.cpp
@@ -336,12 +336,11 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 								}
 								catch (std::exception& ex)
 								{
+									LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 									LogString errorMsg = LOG4CXX_STR("Exception on rollover: ");
-									errorMsg.append(ex.what());
+									errorMsg.append(lsMsg);
 									LogLog::error(errorMsg);
-									LogString exmsg;
-									log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
-									_priv->errorHandler->error(exmsg, ex, 0);
+									_priv->errorHandler->error(lsMsg, ex, 0);
 								}
 							}
 
@@ -399,12 +398,11 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 								}
 								catch (std::exception& ex)
 								{
+									LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 									LogString errorMsg = LOG4CXX_STR("Exception during rollover: ");
-									errorMsg.append(ex.what());
+									errorMsg.append(lsMsg);
 									LogLog::warn(errorMsg);
-									LogString exmsg;
-									log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
-									_priv->errorHandler->error(exmsg, ex, 0);
+									_priv->errorHandler->error(lsMsg, ex, 0);
 								}
 							}
 
@@ -437,12 +435,11 @@ bool RollingFileAppender::rolloverInternal(Pool& p)
 				}
 				catch (std::exception& ex)
 				{
+					LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 					LogString errorMsg = LOG4CXX_STR("Exception during rollover: ");
-					errorMsg.append(ex.what());
+					errorMsg.append(lsMsg);
 					LogLog::warn(errorMsg);
-					LogString exmsg;
-					log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
-					_priv->errorHandler->error(exmsg, ex, 0);
+					_priv->errorHandler->error(lsMsg, ex, 0);
 				}
 		}
 	}
@@ -473,12 +470,11 @@ void RollingFileAppender::subAppend(const LoggingEventPtr& event, Pool& p)
 		}
 		catch (std::exception& ex)
 		{
+			LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
 			LogString errorMsg = LOG4CXX_STR("Exception during rollover attempt: ");
-			errorMsg.append(ex.what());
+			errorMsg.append(lsMsg);
 			LogLog::warn(errorMsg);
-			LogString exmsg;
-			log4cxx::helpers::Transcoder::decode(ex.what(), exmsg);
-			_priv->errorHandler->error(exmsg);
+			_priv->errorHandler->error(lsMsg);
 		}
 	}
 
diff --git a/src/main/cpp/threadutility.cpp b/src/main/cpp/threadutility.cpp
index a3c59737..a04a90a2 100644
--- a/src/main/cpp/threadutility.cpp
+++ b/src/main/cpp/threadutility.cpp
@@ -21,6 +21,7 @@
 #endif
 #include "log4cxx/private/log4cxx_private.h"
 #include "log4cxx/helpers/loglog.h"
+#include "log4cxx/helpers/transcoder.h"
 
 #include <signal.h>
 #include <mutex>
diff --git a/src/test/cpp/filter/locationinfofiltertest.cpp b/src/test/cpp/filter/locationinfofiltertest.cpp
index 4e0a12db..402b97a5 100644
--- a/src/test/cpp/filter/locationinfofiltertest.cpp
+++ b/src/test/cpp/filter/locationinfofiltertest.cpp
@@ -122,7 +122,7 @@ public:
 				li));
 		LocationInfoFilterPtr filter(new LocationInfoFilter());
 		filter->setLineNumber(50);
-		filter->setMethodName("exampleFun");
+		filter->setMethodName(LOG4CXX_STR("exampleFun"));
 		filter->setAcceptOnMatch(true);
 		filter->setMustMatchAll(true);
 		Pool p;
diff --git a/src/test/cpp/fmttest.cpp b/src/test/cpp/fmttest.cpp
index 2b496e63..3827f69c 100644
--- a/src/test/cpp/fmttest.cpp
+++ b/src/test/cpp/fmttest.cpp
@@ -140,18 +140,18 @@ public:
 			return micros;
 		});
 
-		log4cxx::spi::LoggingEventPtr logEvt = std::make_shared<log4cxx::spi::LoggingEvent>( "foo",
+		log4cxx::spi::LoggingEventPtr logEvt = std::make_shared<log4cxx::spi::LoggingEvent>(LOG4CXX_STR("foo"),
 																							 Level::getInfo(),
-																							 "A Message",
+																							 LOG4CXX_STR("A Message"),
 																							 log4cxx::spi::LocationInfo::getLocationUnavailable());
-		FMTLayout layout("{d:%Y-%m-%d %H:%M:%S} {message}" );
+		FMTLayout layout(LOG4CXX_STR("{d:%Y-%m-%d %H:%M:%S} {message}"));
 		LogString output;
 		log4cxx::helpers::Pool pool;
 		layout.format( output, logEvt, pool);
 
 		log4cxx::helpers::Date::setGetCurrentTimeFunction(nullptr);
 
-		LOGUNIT_ASSERT_EQUAL("2013-04-11 09:35:34 A Message", output);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("2013-04-11 09:35:34 A Message"), output);
 	}
 
 	std::string createMessage(Pool & pool, int i)
diff --git a/src/test/cpp/helpers/localechanger.cpp b/src/test/cpp/helpers/localechanger.cpp
index 8dce3c66..a1aeb9eb 100644
--- a/src/test/cpp/helpers/localechanger.cpp
+++ b/src/test/cpp/helpers/localechanger.cpp
@@ -16,6 +16,8 @@
  */
 #define LOG4CXX_TEST
 #include <log4cxx/private/log4cxx_private.h>
+#include "log4cxx/helpers/loglog.h"
+#include "log4cxx/helpers/transcoder.h"
 #if LOG4CXX_HAS_STD_LOCALE
 
 #include "localechanger.h"
@@ -37,11 +39,13 @@ LocaleChanger::LocaleChanger(const char* locale)
 		initial = std::locale::global(newLocale);
 		effective = true;
 	}
-	catch (std::runtime_error&)
-	{
-	}
-	catch (std::exception&)
+	catch (std::exception& ex)
 	{
+		LOG4CXX_DECODE_CHAR(lsMsg, ex.what());
+		LogString errorMsg;
+		errorMsg.append(lsMsg);
+		errorMsg.append(LOG4CXX_STR(" - in LocaleChanger"));
+		LogLog::error(errorMsg);
 	}
 }
 
diff --git a/src/test/cpp/pattern/colorstartpatternconvertertest.cpp b/src/test/cpp/pattern/colorstartpatternconvertertest.cpp
index 0bf6a662..e2f85e52 100644
--- a/src/test/cpp/pattern/colorstartpatternconvertertest.cpp
+++ b/src/test/cpp/pattern/colorstartpatternconvertertest.cpp
@@ -77,10 +77,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(red)");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(red)"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[;31m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;31m"), outputString);
 	}
 
 	void testParseBackground()
@@ -95,10 +95,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("bg(red)");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("bg(red)"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[;41m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;41m"), outputString);
 	}
 
 	void testParseForegroundAndBackground()
@@ -113,10 +113,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(green)|bg(red)");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(green)|bg(red)"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[;32;41m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;32;41m"), outputString);
 	}
 
 	void testParseUnbalancedParens1(){
@@ -130,10 +130,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(green))");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(green))"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[m"), outputString);
 	}
 
 	void testParseUnbalancedParens2(){
@@ -147,10 +147,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(green");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(green"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[m"), outputString);
 	}
 
 	void testParseUnbalancedParens3(){
@@ -164,12 +164,12 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(green|bg(red)");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(green|bg(red)"));
 		colorPatternConverter.format(event, outputString, p);
 
 		// The background should be parsed correctly, but since the foreground
 		// is bad it will not work
-		LOGUNIT_ASSERT_EQUAL("\x1b[;41m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;41m"), outputString);
 	}
 
 	void testANSICode(){
@@ -183,10 +183,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("\\x1b[34;40m");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("\\x1b[34;40m"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[34;40m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[34;40m"), outputString);
 	}
 
 	void testInvalidANSICode(){
@@ -200,10 +200,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("\\x1b");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("\\x1b"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR(""), outputString);
 	}
 
 	void testUnterminatedANSICode(){
@@ -217,10 +217,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("\\x1b[31");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("\\x1b[31"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR(""), outputString);
 	}
 
 	void testForegroundBackgroundBlink(){
@@ -234,10 +234,10 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(white)|bg(black)|blinking");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(white)|bg(black)|blinking"));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("\x1b[;37;40;5m", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\x1b[;37;40;5m"), outputString);
 	}
 
 	void testClearColor(){
@@ -251,11 +251,11 @@ public:
 												   LOG4CXX_STR("msg 1"),
 												   LOG4CXX_LOCATION));
 
-		colorPatternConverter.setInfoColor("fg(white)|bg(black)|blinking");
-		colorPatternConverter.setInfoColor("");
+		colorPatternConverter.setInfoColor(LOG4CXX_STR("fg(white)|bg(black)|blinking"));
+		colorPatternConverter.setInfoColor(LOG4CXX_STR(""));
 		colorPatternConverter.format(event, outputString, p);
 
-		LOGUNIT_ASSERT_EQUAL("", outputString);
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR(""), outputString);
 	}
 
 };
diff --git a/src/test/cpp/pattern/patternparsertestcase.cpp b/src/test/cpp/pattern/patternparsertestcase.cpp
index 3b41a83e..b88137e0 100644
--- a/src/test/cpp/pattern/patternparsertestcase.cpp
+++ b/src/test/cpp/pattern/patternparsertestcase.cpp
@@ -29,6 +29,7 @@
 #include <log4cxx/pattern/patternconverter.h>
 #include <log4cxx/helpers/relativetimedateformat.h>
 #include <log4cxx/helpers/simpledateformat.h>
+#include <log4cxx/helpers/transcoder.h>
 
 
 #include <log4cxx/pattern/loggerpatternconverter.h>