GeNN  4.0.0
GPU enhanced Neuronal Networks (GeNN)
EventLogAppender.h
Go to the documentation of this file.
1 #pragma once
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 
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 
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 }
Definition: AndroidAppender.h:5
Definition: Severity.h:11
static bool add(const wchar_t *sourceName, const wchar_t *logName=L"Application")
Definition: EventLogAppender.h:55
Definition: Severity.h:13
static bool exists(const wchar_t *sourceName, const wchar_t *logName=L"Application")
Definition: EventLogAppender.h:77
Definition: Severity.h:9
virtual void write(const Record &record)
Definition: EventLogAppender.h:20
Definition: EventLogAppender.h:8
EventLogAppender(const wchar_t *sourceName)
Definition: EventLogAppender.h:11
Definition: Severity.h:12
Definition: Severity.h:8
virtual Severity getSeverity() const
Definition: Record.h:185
Definition: Record.h:102
Definition: IAppender.h:6
Definition: Severity.h:10
Definition: EventLogAppender.h:52
~EventLogAppender()
Definition: EventLogAppender.h:15
Severity
Definition: Severity.h:5