Как создать NTEventlogAppender.dll, как требуется для регистрации событий в журнале событий, используя log4cplus - PullRequest
2 голосов
/ 14 июля 2011

Во-первых, позвольте мне поблагодарить за исходный код log4cplus.

Я столкнулся с одной проблемой следующим образом:

Что я пытаюсь сделать?Я хочу записать сообщения в журнал событий в Windows.

Что я сделал?Я мог бы включить ведение журнала событий, включив следующие .h

          #include <log4cplus/nteventlogappender.h>

И создав аппендер следующим образом:

          SharedAppenderPtr append_3(new NTEventLogAppender(LOG4CPLUS_TEXT("127.0.0.1"), LOG4CPLUS_TEXT("log"), LOG4CPLUS_TEXT("source")));
          append_3->setName(LOG4CPLUS_TEXT("ToEventlog"));

          Logger to_eventlog = Logger::getInstance(LOG4CPLUS_TEXT("to_eventlog"));
          to_eventlog.addAppender(append_3);
          to_eventlog.setLogLevel(log4cplus::ALL_LOG_LEVEL);

И войдя в систему как

         Logger to_eventlog = Logger::getInstance(LOG4CPLUS_TEXT("to_eventlog"));
         LOG4CPLUS_FATAL(to_eventlog, “Test Message.”);

Когда я регистрирую сообщение, я получаю следующее в журнале событий:


Описание для идентификатора события 4096 из исходного источника не может быть найдено.Либо компонент, который вызывает это событие, не установлен на локальном компьютере, либо установка повреждена.Вы можете установить или восстановить компонент на локальном компьютере.

Если событие возникло на другом компьютере, отображаемая информация должна была быть сохранена вместе с событием.

Следующая информация была включена всобытие:

тестовое сообщение.

ресурс сообщения присутствует, но сообщение не найдено в таблице строк / сообщений


Я пытался создать dll симя NTEventLogAppender.dll с ресурсом таблицы строк и строкой с идентификатором 4096 (жестко задано в файле nteventlogappender.cxx в log4cplus) и скомпилировано с использованием только ресурсов dll (/ NOENTRY), но я все еще продолжаю получать ошибку выше.

Я уже пробовал вопрос к log4cplus-devel@lists.sourceforge.net, но пока не получил никакого ответа.

Любая помощь о том, как создать эту DLL, будет принята с благодарностью.

Спасибо.

1 Ответ

1 голос
/ 05 августа 2011

Вот как я решил эту проблему:

скомпилированный файл NTEventLogAppender.mc с помощью команд:

mc -U NTEventLogAppender.mc
rc -r NTEventLogAppender.rc
link -dll -noentry -out:NTEventLogAppender.dll NTEventLogAppender.res

, где NTEventLogAppender.mc имеет следующее содержимое


MessageIdTypedef=DWORD

SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
Warning=0x2:STATUS_SEVERITY_WARNING
Error=0x3:STATUS_SEVERITY_ERROR
)


FacilityNames=(System=0x0:FACILITY_SYSTEM
Runtime=0x2:FACILITY_RUNTIME
Stubs=0x3:FACILITY_STUBS
Io=0x4:FACILITY_IO_ERROR_CODE
)

LanguageNames=(English=0x409:MSG00409)

; // The following are message definitions.

MessageId=0x1000
SymbolicName=SVC_TEST
Language=English
A message for something.
.

; // A message file must end with a period on its own line
; // followed by a blank line.

скопировал NTEventLogAppender.dll в c: \ windows \ system32 и запустил вышеупомянутую тестовую программу и обнаружил, что журнал событий обнаружил ресурс сообщения правильно.

вам нужно зарегистрировать эту dll, скопировавследующий в .reg файл и работает так же

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\log\source]
"EventMessageFile"="C:\\windows\\system32\\NTEventLogAppender.dll"
"CategoryMessageFile"="C:\\windows\\system32\\NTEventLogAppender.dll"
"TypesSupported"=dword:00000007
"CategoryCount"=dword:00000005

...