carnold 2005/03/03 11:27:44
Modified: . build.xml
include/log4cxx/nt nteventlogappender.h
src nteventlogappender.cpp
tests/src/nt nteventlogappendertestcase.cpp
Log:
LOGCXX-67: NTEventLogAppender always uses RPC...
Revision Changes Path
1.47 +1 -2 logging-log4cxx/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/logging-log4cxx/build.xml,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- build.xml 1 Mar 2005 23:30:43 -0000 1.46
+++ build.xml 3 Mar 2005 19:27:44 -0000 1.47
@@ -812,13 +812,12 @@
unless="apriconv.lib.dir"/>
<libset libs="${cppunit.lib.name}${lib-suffix}"
dir="${cppunit.lib.dir}" if="cppunit.lib.dir"/>
<libset libs="${cppunit.lib.name}${lib-suffix}"
unless="cppunit.lib.dir"/>
- <libset libs="advapi32 odbc32 ws2_32" if="is-windows"/>
+ <syslibset libs="advapi32 odbc32 ws2_32" if="is-windows"/>
<includepath path="${include.dir}"/>
<includepath path="/usr/include/libxml2" if="is-unix"/>
<includepath path="${apr.include.dir}"/>
<defineset define="LOG4CXX"/>
- <libset libs="advapi32 odbc32 ws2_32" if="is-windows"/>
<libset libs="xml2" if="is-unix"/>
<libset libs="cw32mt" if="is-bcc"/>
1.18 +8 -3 logging-log4cxx/include/log4cxx/nt/nteventlogappender.h
Index: nteventlogappender.h
===================================================================
RCS file: /home/cvs/logging-log4cxx/include/log4cxx/nt/nteventlogappender.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- nteventlogappender.h 26 Dec 2004 07:31:53 -0000 1.17
+++ nteventlogappender.h 3 Mar 2005 19:27:44 -0000 1.18
@@ -1,5 +1,5 @@
/*
- * Copyright 2003,2004 The Apache Software Foundation.
+ * Copyright 2003,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -70,7 +70,8 @@
{ this->server.assign(server); }
const LogString& getServer() const
- { return server; }
+ { return server; }
+
protected:
//
@@ -98,11 +99,15 @@
LogString source;
HANDLE hEventLog;
SID * pCurrentUserSID;
+ static LogString getErrorString(const LogString&
function);
private:
NTEventLogAppender(const NTEventLogAppender&);
NTEventLogAppender& operator=(const
NTEventLogAppender&);
- }; // class NTEventLogAppender
+ }; // class NTEventLogAppender
+
+ typedef helpers::ObjectPtrT<NTEventLogAppender>
NTEventLogAppenderPtr;
+
} // namespace nt
} // namespace log4cxx
1.16 +50 -12 logging-log4cxx/src/nteventlogappender.cpp
Index: nteventlogappender.cpp
===================================================================
RCS file: /home/cvs/logging-log4cxx/src/nteventlogappender.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- nteventlogappender.cpp 1 Mar 2005 23:30:44 -0000 1.15
+++ nteventlogappender.cpp 3 Mar 2005 19:27:44 -0000 1.16
@@ -24,7 +24,7 @@
#include <log4cxx/level.h>
#include <log4cxx/helpers/stringhelper.h>
#include <log4cxx/helpers/transcoder.h>
-#include <log4cxx/helpers/pool.h>
+#include <log4cxx/helpers/pool.h>
using namespace log4cxx;
using namespace log4cxx::spi;
@@ -162,12 +162,24 @@
CCtUserSIDHelper::GetCurrentUserSID((::SID**) &pCurrentUserSID);
addRegistryInfo();
-
- std::wstring wserver;
- Transcoder::encode(server, wserver);
- std::wstring wsource;
- Transcoder::encode(source, wsource);
- hEventLog = ::RegisterEventSourceW(wserver.c_str(), wsource.c_str());
+
+ std::wstring wsource;
+ Transcoder::encode(source, wsource);
+ std::wstring wserver;
+ const wchar_t* pServer = NULL;
+ if (!server.empty()) {
+ Transcoder::encode(server, wserver);
+ pServer = wserver.c_str();
+ }
+ hEventLog = ::RegisterEventSourceW(pServer, wsource.c_str());
+ if (hEventLog == NULL) {
+ LogString msg(LOG4CXX_STR("Cannot register NT EventLog --
server: '"));
+ msg.append(server);
+ msg.append(LOG4CXX_STR("' source: '"));
+ msg.append(source);
+ LogLog::error(msg);
+
LogLog::error(getErrorString(LOG4CXX_STR("RegisterEventSource")));
+ }
}
void NTEventLogAppender::append(const LoggingEventPtr& event, Pool& p)
@@ -180,10 +192,10 @@
LogString oss;
layout->format(oss, event, p);
- std::wstring s;
- log4cxx::helpers::Transcoder::encode(oss, s);
- const wchar_t* msgs[1];
- msgs[0] = s.c_str() ;
+ std::wstring s;
+ log4cxx::helpers::Transcoder::encode(oss, s);
+ const wchar_t* msgs[1];
+ msgs[0] = s.c_str() ;
BOOL bSuccess = ::ReportEventW(
hEventLog,
getEventType(event),
@@ -197,7 +209,7 @@
if (!bSuccess)
{
- LogLog::error(LOG4CXX_STR("Cannot report event in NT
EventLog."));
+ LogLog::error(getErrorString(LOG4CXX_STR("ReportEvent")));
}
}
@@ -295,6 +307,32 @@
}
return ret_val;
+}
+
+LogString NTEventLogAppender::getErrorString(const LogString& function)
+{
+ Pool p;
+ enum { MSGSIZE = 5000 };
+ wchar_t* lpMsgBuf = (wchar_t*) p.palloc(MSGSIZE * sizeof(wchar_t));
+ DWORD dw = GetLastError();
+
+ FormatMessageW(
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ dw,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ lpMsgBuf,
+ MSGSIZE, NULL );
+
+ std::wstring sysmsg(lpMsgBuf);
+
+ LogString msg(function);
+ msg.append(LOG4CXX_STR(" failed with error "));
+ StringHelper::toString((size_t) dw, p, msg);
+ msg.append(LOG4CXX_STR(": "));
+ Transcoder::decode(sysmsg, msg);
+
+ return msg;
}
#endif // WIN32
1.3 +45 -2
logging-log4cxx/tests/src/nt/nteventlogappendertestcase.cpp
Index: nteventlogappendertestcase.cpp
===================================================================
RCS file:
/home/cvs/logging-log4cxx/tests/src/nt/nteventlogappendertestcase.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- nteventlogappendertestcase.cpp 15 Feb 2005 23:56:04 -0000 1.2
+++ nteventlogappendertestcase.cpp 3 Mar 2005 19:27:44 -0000 1.3
@@ -18,10 +18,18 @@
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <log4cxx/nt/nteventlogappender.h>
-#include "../appenderskeletontestcase.h"
+#include "../appenderskeletontestcase.h"
+#include <apr_time.h>
+#include "windows.h"
+#include <log4cxx/logger.h>
+#include <log4cxx/spi/loggingevent.h>
+#include <log4cxx/patternlayout.h>
+#include "../insertwide.h"
using namespace log4cxx;
-using namespace log4cxx::helpers;
+using namespace log4cxx::helpers;
+using namespace log4cxx::nt;
+using namespace log4cxx::spi;
/**
Unit tests of log4cxx::nt::NTEventLogAppender
@@ -34,6 +42,7 @@
//
CPPUNIT_TEST(testDefaultThreshold);
CPPUNIT_TEST(testSetOptionThreshold);
+ CPPUNIT_TEST(testHelloWorld);
CPPUNIT_TEST_SUITE_END();
@@ -42,6 +51,40 @@
AppenderSkeleton* createAppenderSkeleton() const {
return new log4cxx::nt::NTEventLogAppender();
+ }
+
+ void testHelloWorld() {
+ DWORD expectedCount = 1;
+ HANDLE hEventLog = ::OpenEventLogW(NULL, L"log4cxx_test");
+ if (hEventLog != NULL) {
+ BOOL stat = GetNumberOfEventLogRecords(hEventLog,
&expectedCount);
+ CPPUNIT_ASSERT(stat);
+ CloseEventLog(hEventLog);
+ expectedCount++;
+ }
+
+
+ Pool p;
+ DWORD expectedTime = apr_time_sec(apr_time_now());
+ {
+ NTEventLogAppenderPtr appender(new NTEventLogAppender());
+ appender->setSource(LOG4CXX_STR("log4cxx_test"));
+ LayoutPtr layout(new PatternLayout(LOG4CXX_STR("%c -
%m%n")));
+ appender->setLayout(layout);
+ appender->activateOptions(p);
+ LoggerPtr logger(Logger::getLogger(L"org.foobar"));
+
+ LoggingEventPtr event(new LoggingEvent(
+ logger, Level::INFO, LOG4CXX_STR("Hello, World"),
LOG4CXX_LOCATION));
+ appender->doAppend(event, p);
+ }
+ hEventLog = ::OpenEventLogW(NULL, L"log4cxx_test");
+ CPPUNIT_ASSERT(hEventLog != NULL);
+ DWORD actualCount;
+ BOOL stat = GetNumberOfEventLogRecords(hEventLog, &actualCount);
+ CloseEventLog(hEventLog);
+ CPPUNIT_ASSERT(stat);
+ CPPUNIT_ASSERT_EQUAL(expectedCount, actualCount);
}
};