[Log4cplus-devel] Several problems with log4cplus on localized Windows
Logging Framework for C++
Brought to you by:
wilx
From: Nikita M. <nik...@gm...> - 2011-08-05 21:37:14
|
Hi, I integrated the library into a big project. It is very useful and cool library which helps to improve our logging significantly. But I found a real issue and it is critical for me. On Windows we use UNICODE version of the library and log4cplus doesn't work on localized Windows properly. First of all I was not able to open a file in case its path contained non-English characters. After I fixed the bug I found another fundamental problem. I was not able to log a string with non-English characters (for example, a path). wfstream doesn't work correctly in this case with the default locale. I can't modify the global local because it can affect other parts of the product. The small patch below fixes these problems but I'm not sure that it is enough. I did analyze only a small part of the library (FileAppender). May be you know a better solution? In my code I wrote several additional lines (utf8_facet I got from boost): using namespace utf8_facet; std::locale utf8_locale(std::locale(), new utf8_codecvt_facet()); pFileAppender->imbue(utf8_locale); diff -ur log4cplus-1.0.4.orig//include/log4cplus/fileappender.h log4cplus-1.0.4/include/log4cplus/fileappender.h --- log4cplus-1.0.4.orig//include/log4cplus/fileappender.h 2010-05-28 13:06:51.000000000 +0400 +++ log4cplus-1.0.4/include/log4cplus/fileappender.h 2011-08-06 00:25:50.230786400 +0400 @@ -78,6 +78,10 @@ // Dtor virtual ~FileAppender(); + // Redefine default locale for output stream. It may be a good idea to + // provide UTF-8 locale in case UNICODE macro is defined. + virtual void imbue(std::locale const& loc); + // Methods virtual void close(); diff -ur log4cplus-1.0.4.orig//src/fileappender.cxx log4cplus-1.0.4/src/fileappender.cxx --- log4cplus-1.0.4.orig//src/fileappender.cxx 2010-09-08 17:08:44.000000000 +0400 +++ log4cplus-1.0.4/src/fileappender.cxx 2011-08-06 00:28:12.964058300 +0400 @@ -333,7 +333,19 @@ void FileAppender::open(std::ios::openmode mode) { +#if defined (_WIN32) + // MS SDK supports char and wchar_t. Don't try to convert wstring to string. + // It doesn't work. Need to reimplement working with non-english strings. + out.open(filename.c_str(), mode); +#else out.open(LOG4CPLUS_TSTRING_TO_STRING(filename).c_str(), mode); +#endif +} + +void +FileAppender::imbue(std::locale const& loc) +{ + out.imbue(loc); } bool diff -ur log4cplus-1.0.4.orig//src/property.cxx log4cplus-1.0.4/src/property.cxx --- log4cplus-1.0.4.orig//src/property.cxx 2010-07-09 12:24:08.000000000 +0400 +++ log4cplus-1.0.4/src/property.cxx 2011-08-05 15:27:55.395559800 +0400 @@ -117,7 +117,13 @@ if (inputFile.empty ()) return; +#if defined (_WIN32) + // MS SDK supports char and wchar_t. Don't try to convert wstring to string. + // It doesn't work. Need to reimplement working with non-english strings. + tifstream file (inputFile.c_str()); +#else tifstream file (LOG4CPLUS_TSTRING_TO_STRING(inputFile).c_str()); +#endif init(file); } -- Best regards, Nikita Manovich. |