X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsyslog.c;h=4f5d0c4a2b84c6ebf20349c7247bdc9b26456f44;hb=HEAD;hp=ace9dc6f090e1a98a8bc3a0d4d08a25b39f6f21b;hpb=e4b8a186516b61f16d94a76db0aa102a3270d46c;p=collectd.git diff --git a/src/syslog.c b/src/syslog.c index ace9dc6f..4f5d0c4a 100644 --- a/src/syslog.c +++ b/src/syslog.c @@ -33,10 +33,12 @@ static int log_level = LOG_DEBUG; #else static int log_level = LOG_INFO; #endif /* COLLECT_DEBUG */ +static int notif_severity = 0; static const char *config_keys[] = { - "LogLevel" + "LogLevel", + "NotifyLevel", }; static int config_keys_num = STATIC_ARRAY_SIZE(config_keys); @@ -44,26 +46,16 @@ static int sl_config (const char *key, const char *value) { if (strcasecmp (key, "LogLevel") == 0) { - if ((strcasecmp (value, "emerg") == 0) - || (strcasecmp (value, "alert") == 0) - || (strcasecmp (value, "crit") == 0) - || (strcasecmp (value, "err") == 0)) - log_level = LOG_ERR; - else if (strcasecmp (value, "warning") == 0) - log_level = LOG_WARNING; - else if (strcasecmp (value, "notice") == 0) - log_level = LOG_NOTICE; - else if (strcasecmp (value, "info") == 0) - log_level = LOG_INFO; -#if COLLECT_DEBUG - else if (strcasecmp (value, "debug") == 0) - log_level = LOG_DEBUG; -#endif - else + log_level = parse_log_severity (value); + if (log_level < 0) + return (1); + } + else if (strcasecmp (key, "NotifyLevel") == 0) + { + notif_severity = parse_notif_severity (value); + if (notif_severity < 0) return (1); } - else - return (-1); return (0); } /* int sl_config */ @@ -84,11 +76,77 @@ static int sl_shutdown (void) return (0); } +static int sl_notification (const notification_t *n, + user_data_t __attribute__((unused)) *user_data) +{ + char buf[1024] = ""; + size_t offset = 0; + int log_severity; + char *severity_string; + int status; + + if (n->severity > notif_severity) + return (0); + + switch (n->severity) + { + case NOTIF_FAILURE: + severity_string = "FAILURE"; + log_severity = LOG_ERR; + break; + case NOTIF_WARNING: + severity_string = "WARNING"; + log_severity = LOG_WARNING; + break; + case NOTIF_OKAY: + severity_string = "OKAY"; + log_severity = LOG_NOTICE; + break; + default: + severity_string = "UNKNOWN"; + log_severity = LOG_ERR; + } + +#define BUFFER_ADD(...) do { \ + status = ssnprintf (&buf[offset], sizeof (buf) - offset, \ + __VA_ARGS__); \ + if (status < 1) \ + return (-1); \ + else if (((size_t) status) >= (sizeof (buf) - offset)) \ + return (-ENOMEM); \ + else \ + offset += ((size_t) status); \ +} while (0) + +#define BUFFER_ADD_FIELD(field) do { \ + if (n->field[0]) \ + BUFFER_ADD (", " #field " = %s", n->field); \ +} while (0) + + BUFFER_ADD ("Notification: severity = %s", severity_string); + BUFFER_ADD_FIELD (host); + BUFFER_ADD_FIELD (plugin); + BUFFER_ADD_FIELD (plugin_instance); + BUFFER_ADD_FIELD (type); + BUFFER_ADD_FIELD (type_instance); + BUFFER_ADD_FIELD (message); + +#undef BUFFER_ADD_FIELD +#undef BUFFER_ADD + + buf[sizeof (buf) - 1] = '\0'; + + sl_log (log_severity, buf, NULL); + + return (0); +} /* int sl_notification */ + void module_register (void) { openlog ("collectd", LOG_CONS | LOG_PID, LOG_DAEMON); plugin_register_config ("syslog", sl_config, config_keys, config_keys_num); plugin_register_log ("syslog", sl_log, /* user_data = */ NULL); + plugin_register_notification ("syslog", sl_notification, NULL); plugin_register_shutdown ("syslog", sl_shutdown); } /* void module_register(void) */