summaryrefslogtreecommitdiffstats
path: root/lib/base/windowseventloglogger.cpp
blob: cc28358f98f3e580b2484d83dbb657c89c789e57 (plain)
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 */