mirror of https://github.com/Icinga/icinga2.git
Add WindowsEventLogLogger
This commit is contained in:
parent
5a114a6bf2
commit
6de9f58810
|
@ -1864,4 +1864,21 @@ Facility Constants:
|
||||||
FacilityUucp | LOG\_UUCP | The UUCP system.
|
FacilityUucp | LOG\_UUCP | The UUCP system.
|
||||||
|
|
||||||
|
|
||||||
|
### WindowsEventLogLogger <a id="objecttype-windowseventloglogger"></a>
|
||||||
|
|
||||||
|
Specifies Icinga 2 logging to the Windows Event Log.
|
||||||
|
This configuration object is available as `windowseventlog` [logging feature](14-features.md#logging).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
object WindowsEventLogLogger "windowseventlog" {
|
||||||
|
severity = "warning"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Configuration Attributes:
|
||||||
|
|
||||||
|
Name | Type | Description
|
||||||
|
--------------------------|-----------------------|----------------------------------
|
||||||
|
severity | String | **Optional.** The minimum severity for this log. Can be "debug", "notice", "information", "warning" or "critical". Defaults to "warning".
|
||||||
|
|
|
@ -11,11 +11,12 @@ Icinga 2 supports three different types of logging:
|
||||||
You can enable additional loggers using the `icinga2 feature enable`
|
You can enable additional loggers using the `icinga2 feature enable`
|
||||||
and `icinga2 feature disable` commands to configure loggers:
|
and `icinga2 feature disable` commands to configure loggers:
|
||||||
|
|
||||||
Feature | Description
|
Feature | Description
|
||||||
---------|------------
|
----------------|------------
|
||||||
debuglog | Debug log (path: `/var/log/icinga2/debug.log`, severity: `debug` or higher)
|
debuglog | Debug log (path: `/var/log/icinga2/debug.log`, severity: `debug` or higher)
|
||||||
mainlog | Main log (path: `/var/log/icinga2/icinga2.log`, severity: `information` or higher)
|
mainlog | Main log (path: `/var/log/icinga2/icinga2.log`, severity: `information` or higher)
|
||||||
syslog | Syslog (severity: `warning` or higher)
|
syslog | Syslog (severity: `warning` or higher)
|
||||||
|
windowseventlog | Windows Event Log (severity: `warning` or higher)
|
||||||
|
|
||||||
By default file the `mainlog` feature is enabled. When running Icinga 2
|
By default file the `mainlog` feature is enabled. When running Icinga 2
|
||||||
on a terminal log messages with severity `information` or higher are
|
on a terminal log messages with severity `information` or higher are
|
||||||
|
|
|
@ -39,6 +39,8 @@ install_if_not_exists(icinga2/features-available/debuglog.conf ${ICINGA2_CONFIGD
|
||||||
install_if_not_exists(icinga2/features-available/mainlog.conf ${ICINGA2_CONFIGDIR}/features-available)
|
install_if_not_exists(icinga2/features-available/mainlog.conf ${ICINGA2_CONFIGDIR}/features-available)
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
install_if_not_exists(icinga2/features-available/syslog.conf ${ICINGA2_CONFIGDIR}/features-available)
|
install_if_not_exists(icinga2/features-available/syslog.conf ${ICINGA2_CONFIGDIR}/features-available)
|
||||||
|
else()
|
||||||
|
install_if_not_exists(icinga2/features-available/windowseventlog.conf ${ICINGA2_CONFIGDIR}/features-available)
|
||||||
endif()
|
endif()
|
||||||
install_if_not_exists(icinga2/scripts/mail-host-notification.sh ${ICINGA2_CONFIGDIR}/scripts)
|
install_if_not_exists(icinga2/scripts/mail-host-notification.sh ${ICINGA2_CONFIGDIR}/scripts)
|
||||||
install_if_not_exists(icinga2/scripts/mail-service-notification.sh ${ICINGA2_CONFIGDIR}/scripts)
|
install_if_not_exists(icinga2/scripts/mail-service-notification.sh ${ICINGA2_CONFIGDIR}/scripts)
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
/**
|
||||||
|
* The WindowsEventLogLogger type writes log information to the Windows Event Log.
|
||||||
|
*/
|
||||||
|
|
||||||
|
object WindowsEventLogLogger "windowseventlog" {
|
||||||
|
severity = "warning"
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,20 @@
|
||||||
<Custom Action="XtraUninstall" Before="RemoveExistingProducts">$CM_CP_sbin.icinga2_installer.exe=2 AND NOT SUPPRESS_XTRA</Custom>
|
<Custom Action="XtraUninstall" Before="RemoveExistingProducts">$CM_CP_sbin.icinga2_installer.exe=2 AND NOT SUPPRESS_XTRA</Custom>
|
||||||
</InstallExecuteSequence>
|
</InstallExecuteSequence>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Write the path to eventprovider.dll to the registry so that the Event Viewer is able to find
|
||||||
|
the message definitions and properly displays our log messages.
|
||||||
|
|
||||||
|
See also: https://docs.microsoft.com/en-us/windows/win32/eventlog/reporting-an-event
|
||||||
|
-->
|
||||||
|
<FeatureRef Id="ProductFeature" IgnoreParent="yes">
|
||||||
|
<Component Id="EventProviderRegistryEntry" Guid="*" Directory="INSTALL_ROOT">
|
||||||
|
<RegistryKey Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\EventLog\Application\Icinga 2" Action="createAndRemoveOnUninstall">
|
||||||
|
<RegistryValue Name="EventMessageFile" Type="string" Value="[#CM_FP_sbin.eventprovider.dll]" />
|
||||||
|
</RegistryKey>
|
||||||
|
</Component>
|
||||||
|
</FeatureRef>
|
||||||
|
|
||||||
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Run Icinga 2 setup wizard" />
|
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Run Icinga 2 setup wizard" />
|
||||||
|
|
||||||
<Property Id="WixShellExecTarget" Value="[#CM_FP_sbin.Icinga2SetupAgent.exe]" />
|
<Property Id="WixShellExecTarget" Value="[#CM_FP_sbin.Icinga2SetupAgent.exe]" />
|
||||||
|
|
|
@ -85,6 +85,33 @@ set(base_SOURCES
|
||||||
workqueue.cpp workqueue.hpp
|
workqueue.cpp workqueue.hpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
mkclass_target(windowseventloglogger.ti windowseventloglogger-ti.cpp windowseventloglogger-ti.hpp)
|
||||||
|
list(APPEND base_SOURCES windowseventloglogger.cpp windowseventloglogger.hpp windowseventloglogger-ti.hpp)
|
||||||
|
|
||||||
|
# Generate a DLL containing message definitions for the Windows Event Viewer.
|
||||||
|
# See also: https://docs.microsoft.com/en-us/windows/win32/eventlog/reporting-an-event
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT windowseventloglogger-provider.rc windowseventloglogger-provider.h
|
||||||
|
COMMAND mc ARGS -U ${CMAKE_CURRENT_SOURCE_DIR}/windowseventloglogger-provider.mc
|
||||||
|
DEPENDS windowseventloglogger-provider.mc
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND base_SOURCES windowseventloglogger-provider.h)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT windowseventloglogger-provider.res
|
||||||
|
COMMAND rc ARGS windowseventloglogger-provider.rc
|
||||||
|
DEPENDS windowseventloglogger-provider.rc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(eventprovider MODULE windowseventloglogger-provider.res windowseventloglogger-provider.rc)
|
||||||
|
set_target_properties(eventprovider PROPERTIES LINKER_LANGUAGE CXX)
|
||||||
|
target_link_libraries(eventprovider PRIVATE -noentry)
|
||||||
|
|
||||||
|
install(TARGETS eventprovider LIBRARY DESTINATION ${CMAKE_INSTALL_SBINDIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
set_property(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/application-version.cpp PROPERTY EXCLUDE_UNITY_BUILD TRUE)
|
set_property(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/application-version.cpp PROPERTY EXCLUDE_UNITY_BUILD TRUE)
|
||||||
|
|
||||||
if(ICINGA2_UNITY_BUILD)
|
if(ICINGA2_UNITY_BUILD)
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
MessageId=0x1
|
||||||
|
SymbolicName=MSG_PLAIN_LOG_ENTRY
|
||||||
|
Language=English
|
||||||
|
%1
|
||||||
|
.
|
|
@ -0,0 +1,71 @@
|
||||||
|
/* 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.
|
||||||
|
*
|
||||||
|
* @param entry The log entry.
|
||||||
|
*/
|
||||||
|
void WindowsEventLogLogger::ProcessLogEntry(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 */
|
|
@ -0,0 +1,35 @@
|
||||||
|
/* Icinga 2 | (c) 2021 Icinga GmbH | GPLv2+ */
|
||||||
|
|
||||||
|
#ifndef WINDOWSEVENTLOGLOGGER_H
|
||||||
|
#define WINDOWSEVENTLOGLOGGER_H
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include "base/i2-base.hpp"
|
||||||
|
#include "base/windowseventloglogger-ti.hpp"
|
||||||
|
|
||||||
|
namespace icinga
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A logger that logs to the Windows Event Log.
|
||||||
|
*
|
||||||
|
* @ingroup base
|
||||||
|
*/
|
||||||
|
class WindowsEventLogLogger final : public ObjectImpl<WindowsEventLogLogger>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_OBJECT(WindowsEventLogLogger);
|
||||||
|
DECLARE_OBJECTNAME(WindowsEventLogLogger);
|
||||||
|
|
||||||
|
static void StaticInitialize();
|
||||||
|
static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void ProcessLogEntry(const LogEntry& entry) override;
|
||||||
|
void Flush() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
|
#endif /* WINDOWSEVENTLOGLOGGER_H */
|
|
@ -0,0 +1,15 @@
|
||||||
|
/* Icinga 2 | (c) 2021 Icinga GmbH | GPLv2+ */
|
||||||
|
|
||||||
|
#include "base/logger.hpp"
|
||||||
|
|
||||||
|
library base;
|
||||||
|
|
||||||
|
namespace icinga
|
||||||
|
{
|
||||||
|
|
||||||
|
class WindowsEventLogLogger : Logger
|
||||||
|
{
|
||||||
|
activation_priority -100;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -60,7 +60,7 @@ syn keyword icinga2ObjType IcingaApplication IdoMysqlConnection IdoPgsqlConnec
|
||||||
syn keyword icinga2ObjType InfluxdbWriter LivestatusListener Notification NotificationCommand
|
syn keyword icinga2ObjType InfluxdbWriter LivestatusListener Notification NotificationCommand
|
||||||
syn keyword icinga2ObjType NotificationComponent OpenTsdbWriter PerfdataWriter
|
syn keyword icinga2ObjType NotificationComponent OpenTsdbWriter PerfdataWriter
|
||||||
syn keyword icinga2ObjType ScheduledDowntime Service ServiceGroup SyslogLogger
|
syn keyword icinga2ObjType ScheduledDowntime Service ServiceGroup SyslogLogger
|
||||||
syn keyword icinga2ObjType TimePeriod User UserGroup Zone
|
syn keyword icinga2ObjType TimePeriod User UserGroup WindowsEventLogLogger Zone
|
||||||
|
|
||||||
" Object/Template marker (simplified)
|
" Object/Template marker (simplified)
|
||||||
syn match icinga2ObjDef "\(object\|template\)[ \t]\+.*"
|
syn match icinga2ObjDef "\(object\|template\)[ \t]\+.*"
|
||||||
|
|
Loading…
Reference in New Issue