From e79f87216aac7a214e33407071f161bbc3f21132 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Thu, 10 Jul 2014 10:25:20 -0400 Subject: [PATCH] mod_graylog2: additional fields can now be specified by adding LOG_FIELDS[name=string_value,@#name=number_value] to beginning of log. Added _microtimestamp additional field since graylog2 only has millisecond timestamp precision. --- src/mod/loggers/mod_graylog2/mod_graylog2.c | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/mod/loggers/mod_graylog2/mod_graylog2.c b/src/mod/loggers/mod_graylog2/mod_graylog2.c index 44f5286ee8..2fe5213914 100644 --- a/src/mod/loggers/mod_graylog2/mod_graylog2.c +++ b/src/mod/loggers/mod_graylog2/mod_graylog2.c @@ -22,6 +22,7 @@ * * Contributor(s): * Christopher Rienzo + * Michael McGuinness * * mod_graylog2.c -- Graylog2 GELF logger * @@ -81,6 +82,9 @@ static char *to_gelf(const switch_log_node_t *node, switch_log_level_t log_level char *full_message = node->content; char short_message[151]; char *short_message_end = NULL; + char *parsed_full_message = NULL; + char *field_name = NULL; + switch_event_t *log_fields = NULL; cJSON_AddItemToObject(gelf, "version", cJSON_CreateString("1.1")); if ((hostname = switch_core_get_variable("hostname")) && !zstr(hostname)) { @@ -90,6 +94,7 @@ static char *to_gelf(const switch_log_node_t *node, switch_log_level_t log_level } switch_snprintf(timestamp, 32, "%"SWITCH_UINT64_T_FMT".%d", (uint64_t)(node->timestamp / 1000000), node->timestamp % 1000000); cJSON_AddItemToObject(gelf, "timestamp", cJSON_CreateString(timestamp)); + cJSON_AddItemToObject(gelf, "_microtimestamp", cJSON_CreateNumber(node->timestamp)); cJSON_AddItemToObject(gelf, "level", cJSON_CreateNumber(to_graylog2_level(log_level))); cJSON_AddItemToObject(gelf, "_ident", cJSON_CreateString("freeswitch")); cJSON_AddItemToObject(gelf, "_pid", cJSON_CreateNumber((int)getpid())); @@ -111,6 +116,27 @@ static char *to_gelf(const switch_log_node_t *node, switch_log_level_t log_level if (*full_message == '\n') { full_message++; } + + /* parse list of fields, if any */ + if (strncmp(full_message, "LOG_FIELDS", 10) == 0) { + if (switch_event_create_brackets(full_message+10, '[', ']', ',', &log_fields, &parsed_full_message, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { + + switch_event_header_t *hp; + for (hp = log_fields->headers; hp; hp = hp->next) { + if (strncmp(hp->name, "@#", 2) == 0) { + field_name = switch_mprintf("_%s", hp->name + 2); + cJSON_AddItemToObject(gelf, field_name, cJSON_CreateNumber(strtod(hp->value, NULL))); + } else { + field_name = switch_mprintf("_%s", hp->name); + cJSON_AddItemToObject(gelf, field_name, cJSON_CreateString(hp->value)); + } + free(field_name); + } + + switch_event_destroy(&log_fields); + full_message = parsed_full_message; + } + } cJSON_AddItemToObject(gelf, "full_message", cJSON_CreateString(full_message)); @@ -122,6 +148,11 @@ static char *to_gelf(const switch_log_node_t *node, switch_log_level_t log_level gelf_text = cJSON_PrintUnformatted(gelf); cJSON_Delete(gelf); + + if (parsed_full_message != NULL) { + free(parsed_full_message); + } + return gelf_text; }