1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/* Icinga 2 | (c) 2021 Icinga GmbH | GPLv2+ */
#ifdef _WIN32
#include "base/windowseventloglogger.hpp"
#include "base/windowseventloglogger-ti.cpp"
#include "base/windowseventloglogger-provider.h"
#include "base/configtype.hpp"
#include "base/statsfunction.hpp"
#include <windows.h>
using namespace icinga;
REGISTER_TYPE(WindowsEventLogLogger);
REGISTER_STATSFUNCTION(WindowsEventLogLogger, &WindowsEventLogLogger::StatsFunc);
INITIALIZE_ONCE(&WindowsEventLogLogger::StaticInitialize);
static HANDLE l_EventLog = nullptr;
void WindowsEventLogLogger::StaticInitialize()
{
l_EventLog = RegisterEventSourceA(nullptr, "Icinga 2");
}
void WindowsEventLogLogger::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr&)
{
DictionaryData nodes;
for (const WindowsEventLogLogger::Ptr& logger : ConfigType::GetObjectsByType<WindowsEventLogLogger>()) {
nodes.emplace_back(logger->GetName(), 1);
}
status->Set("windowseventloglogger", new Dictionary(std::move(nodes)));
}
/**
* Processes a log entry and outputs it to the Windows Event Log.
*
* This function implements the interface expected by the Logger base class and passes
* the log entry to WindowsEventLogLogger::WriteToWindowsEventLog().
*
* @param entry The log entry.
*/
void WindowsEventLogLogger::ProcessLogEntry(const LogEntry& entry) {
WindowsEventLogLogger::WriteToWindowsEventLog(entry);
}
/**
* Writes a LogEntry object to the Windows Event Log.
*
* @param entry The log entry.
*/
void WindowsEventLogLogger::WriteToWindowsEventLog(const LogEntry& entry)
{
if (l_EventLog != nullptr) {
std::string message = Logger::SeverityToString(entry.Severity) + "/" + entry.Facility + ": " + entry.Message;
std::array<const char *, 1> strings{
message.c_str()
};
WORD eventType;
switch (entry.Severity) {
case LogCritical:
eventType = EVENTLOG_ERROR_TYPE;
break;
case LogWarning:
eventType = EVENTLOG_WARNING_TYPE;
break;
default:
eventType = EVENTLOG_INFORMATION_TYPE;
}
ReportEventA(l_EventLog, eventType, 0, MSG_PLAIN_LOG_ENTRY, NULL, strings.size(), 0, strings.data(), NULL);
}
}
void WindowsEventLogLogger::Flush()
{
/* Nothing to do here. */
}
#endif /* _WIN32 */
|