[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.
|