| 1 | 
 #pragma once | 
 
 
 
 
 
 | 2 | 
 #include <plog/Appenders/IAppender.h> | 
 
 
 
 
 
 | 3 | 
 #include <plog/WinApi.h> | 
 
 
 
 
 
 | 4 | 
  | 
 
 
 
 
 
 | 5 | 
 namespace plog | 
 
 
 
 
 
 | 6 | 
 { | 
 
 
 
 
 
 | 7 | 
     template <class Formatter> | 
 
 
 
 
 
 | 8 | 
     class EventLogAppender : public IAppender | 
 
 
 
 
 
 | 9 | 
     { | 
 
 
 
 
 
 | 10 | 
     public: | 
 
 
 
 
 
 | 11 | 
         EventLogAppender(const wchar_t* sourceName) : m_eventSource(RegisterEventSourceW(NULL, sourceName)) | 
 
 
 
 
 
 | 12 | 
         { | 
 
 
 
 
 
 | 13 | 
         } | 
 
 
 
 
 
 | 14 | 
  | 
 
 
 
 
 
 | 15 | 
         ~EventLogAppender() | 
 
 
 
 
 
 | 16 | 
         { | 
 
 
 
 
 
 | 17 | 
             DeregisterEventSource(m_eventSource); | 
 
 
 
 
 
 | 18 | 
         } | 
 
 
 
 
 
 | 19 | 
  | 
 
 
 
 
 
 | 20 | 
         virtual void write(const Record& record) | 
 
 
 
 
 
 | 21 | 
         { | 
 
 
 
 
 
 | 22 | 
             std::wstring str = Formatter::format(record); | 
 
 
 
 
 
 | 23 | 
             const wchar_t* logMessagePtr[] = { str.c_str() }; | 
 
 
 
 
 
 | 24 | 
  | 
 
 
 
 
 
 | 25 | 
             ReportEventW(m_eventSource, logSeverityToType(record.getSeverity()), static_cast<WORD>(record.getSeverity()), 0, NULL, 1, 0, logMessagePtr, NULL); | 
 
 
 
 
 
 | 26 | 
         } | 
 
 
 
 
 
 | 27 | 
  | 
 
 
 
 
 
 | 28 | 
     private: | 
 
 
 
 
 
 | 29 | 
         static WORD logSeverityToType(plog::Severity severity) | 
 
 
 
 
 
 | 30 | 
         { | 
 
 
 
 
 
 | 31 | 
             switch (severity) | 
 
 
 
 
 
 | 32 | 
             { | 
 
 
 
 
 
 | 33 | 
             case plog::fatal: | 
 
 
 
 
 
 | 34 | 
             case plog::error: | 
 
 
 
 
 
 | 35 | 
                 return eventLog::kErrorType; | 
 
 
 
 
 
 | 36 | 
  | 
 
 
 
 
 
 | 37 | 
             case plog::warning: | 
 
 
 
 
 
 | 38 | 
                 return eventLog::kWarningType; | 
 
 
 
 
 
 | 39 | 
  | 
 
 
 
 
 
 | 40 | 
             case plog::info: | 
 
 
 
 
 
 | 41 | 
             case plog::debug: | 
 
 
 
 
 
 | 42 | 
             case plog::verbose: | 
 
 
 
 
 
 | 43 | 
             default: | 
 
 
 
 
 
 | 44 | 
                 return eventLog::kInformationType; | 
 
 
 
 
 
 | 45 | 
             } | 
 
 
 
 
 
 | 46 | 
         } | 
 
 
 
 
 
 | 47 | 
  | 
 
 
 
 
 
 | 48 | 
     private: | 
 
 
 
 
 
 | 49 | 
         HANDLE m_eventSource; | 
 
 
 
 
 
 | 50 | 
     }; | 
 
 
 
 
 
 | 51 | 
  | 
 
 
 
 
 
 | 52 | 
     class EventLogAppenderRegistry | 
 
 
 
 
 
 | 53 | 
     { | 
 
 
 
 
 
 | 54 | 
     public: | 
 
 
 
 
 
 | 55 | 
         static bool add(const wchar_t* sourceName, const wchar_t* logName = L"Application") | 
 
 
 
 
 
 | 56 | 
         { | 
 
 
 
 
 
 | 57 | 
             std::wstring logKeyName; | 
 
 
 
 
 
 | 58 | 
             std::wstring sourceKeyName; | 
 
 
 
 
 
 | 59 | 
             getKeyNames(sourceName, logName, sourceKeyName, logKeyName); | 
 
 
 
 
 
 | 60 | 
  | 
 
 
 
 
 
 | 61 | 
             HKEY sourceKey; | 
 
 
 
 
 
 | 62 | 
             if (0 != RegCreateKeyExW(hkey::kLocalMachine, sourceKeyName.c_str(), 0, NULL, 0, regSam::kSetValue, NULL, &sourceKey, NULL)) | 
 
 
 
 
 
 | 63 | 
             { | 
 
 
 
 
 
 | 64 | 
                 return false; | 
 
 
 
 
 
 | 65 | 
             } | 
 
 
 
 
 
 | 66 | 
  | 
 
 
 
 
 
 | 67 | 
             const DWORD kTypesSupported = eventLog::kErrorType | eventLog::kWarningType | eventLog::kInformationType; | 
 
 
 
 
 
 | 68 | 
             RegSetValueExW(sourceKey, L"TypesSupported", 0, regType::kDword, &kTypesSupported, sizeof(kTypesSupported)); | 
 
 
 
 
 
 | 69 | 
  | 
 
 
 
 
 
 | 70 | 
             const wchar_t kEventMessageFile[] = L"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\EventLogMessages.dll;%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\EventLogMessages.dll"; | 
 
 
 
 
 
 | 71 | 
             RegSetValueExW(sourceKey, L"EventMessageFile", 0, regType::kExpandSz, kEventMessageFile, static_cast<DWORD>(::wcslen(kEventMessageFile) * sizeof(wchar_t))); | 
 
 
 
 
 
 | 72 | 
  | 
 
 
 
 
 
 | 73 | 
             RegCloseKey(sourceKey); | 
 
 
 
 
 
 | 74 | 
             return true; | 
 
 
 
 
 
 | 75 | 
         } | 
 
 
 
 
 
 | 76 | 
  | 
 
 
 
 
 
 | 77 | 
         static bool exists(const wchar_t* sourceName, const wchar_t* logName = L"Application") | 
 
 
 
 
 
 | 78 | 
         { | 
 
 
 
 
 
 | 79 | 
             std::wstring logKeyName; | 
 
 
 
 
 
 | 80 | 
             std::wstring sourceKeyName; | 
 
 
 
 
 
 | 81 | 
             getKeyNames(sourceName, logName, sourceKeyName, logKeyName); | 
 
 
 
 
 
 | 82 | 
  | 
 
 
 
 
 
 | 83 | 
             HKEY sourceKey; | 
 
 
 
 
 
 | 84 | 
             if (0 != RegOpenKeyExW(hkey::kLocalMachine, sourceKeyName.c_str(), 0, regSam::kQueryValue, &sourceKey)) | 
 
 
 
 
 
 | 85 | 
             { | 
 
 
 
 
 
 | 86 | 
                 return false; | 
 
 
 
 
 
 | 87 | 
             } | 
 
 
 
 
 
 | 88 | 
  | 
 
 
 
 
 
 | 89 | 
             RegCloseKey(sourceKey); | 
 
 
 
 
 
 | 90 | 
             return true; | 
 
 
 
 
 
 | 91 | 
         } | 
 
 
 
 
 
 | 92 | 
  | 
 
 
 
 
 
 | 93 | 
         static void remove(const wchar_t* sourceName, const wchar_t* logName = L"Application") | 
 
 
 
 
 
 | 94 | 
         { | 
 
 
 
 
 
 | 95 | 
             std::wstring logKeyName; | 
 
 
 
 
 
 | 96 | 
             std::wstring sourceKeyName; | 
 
 
 
 
 
 | 97 | 
             getKeyNames(sourceName, logName, sourceKeyName, logKeyName); | 
 
 
 
 
 
 | 98 | 
  | 
 
 
 
 
 
 | 99 | 
             RegDeleteKeyW(hkey::kLocalMachine, sourceKeyName.c_str()); | 
 
 
 
 
 
 | 100 | 
             RegDeleteKeyW(hkey::kLocalMachine, logKeyName.c_str()); | 
 
 
 
 
 
 | 101 | 
         } | 
 
 
 
 
 
 | 102 | 
  | 
 
 
 
 
 
 | 103 | 
     private: | 
 
 
 
 
 
 | 104 | 
         static void getKeyNames(const wchar_t* sourceName, const wchar_t* logName, std::wstring& sourceKeyName, std::wstring& logKeyName) | 
 
 
 
 
 
 | 105 | 
         { | 
 
 
 
 
 
 | 106 | 
             const std::wstring kPrefix = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\"; | 
 
 
 
 
 
 | 107 | 
             logKeyName = kPrefix + logName; | 
 
 
 
 
 
 | 108 | 
             sourceKeyName = logKeyName + L"\\" + sourceName; | 
 
 
 
 
 
 | 109 | 
         } | 
 
 
 
 
 
 | 110 | 
     }; | 
 
 
 
 
 
 | 111 | 
 } |