From 236fe3d131200760f5441c40d6b1faa0886c6513 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sat, 20 Dec 2008 14:56:08 +0000 Subject: [PATCH] change event_socket to have more info about log lines git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10893 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- libs/esl/fs_cli.c | 53 +++++++------ libs/esl/src/esl.c | 22 +++++- src/include/switch_log.h | 2 +- .../mod_event_socket/mod_event_socket.c | 74 ++++++++++++------- src/switch_log.c | 4 +- 5 files changed, 101 insertions(+), 54 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index bf2ba11348..c52a61b4cb 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -71,30 +71,34 @@ static void *msg_thread_run(esl_thread_t *me, void *obj) if (handle->last_event) { const char *type = esl_event_get_header(handle->last_event, "content-type"); - if (!strcasecmp(type, "log/data")) { - int level = 0; - if (strstr(handle->last_event->body, "[CONSOLE]")) { - level = 0; - } else if (strstr(handle->last_event->body, "[ALERT]")) { - level = 1; - } else if (strstr(handle->last_event->body, "[CRIT]")) { - level = 2; - } else if (strstr(handle->last_event->body, "[ERROR]")) { - level = 3; - } else if (strstr(handle->last_event->body, "[WARNING]")) { - level = 4; - } else if (strstr(handle->last_event->body, "[NOTICE]")) { - level = 5; - } else if (strstr(handle->last_event->body, "[INFO]")) { - level = 6; - } else if (strstr(handle->last_event->body, "[DEBUG]")) { - level = 7; - } + int known = 0; - printf("%s%s%s", COLORS[level], handle->last_event->body, ESL_SEQ_DEFAULT_COLOR); - } else if (0 && !strcasecmp(type, "text/disconnect-notice")) { - running = thread_running = 0; - } else { + if (!esl_strlen_zero(type)) { + if (!strcasecmp(type, "log/data")) { + int level = 0, tchannel = 0; + const char *lname = esl_event_get_header(handle->last_event, "log-level"); + const char *channel = esl_event_get_header(handle->last_event, "text-channel"); + const char *file = esl_event_get_header(handle->last_event, "log-file"); + + if (channel) { + tchannel = atoi(channel); + } + + if (lname) { + level = atoi(lname); + } + + if (tchannel == 0 || (file && !strcmp(file, "switch_console.c"))) { + printf("%s%s%s", COLORS[level], handle->last_event->body, ESL_SEQ_DEFAULT_COLOR); + } + known++; + } else if (!strcasecmp(type, "text/disconnect-notice")) { + running = thread_running = 0; + known++; + } + } + + if (!known) { printf("INCOMING DATA [%s]\n%s", type, handle->last_event->body); } } @@ -108,6 +112,7 @@ static void *msg_thread_run(esl_thread_t *me, void *obj) done: thread_running = 0; + esl_log(ESL_LOG_DEBUG, "Thread Done\n"); return NULL; } @@ -181,7 +186,7 @@ int main(int argc, char *argv[]) signal(SIGINT, handle_SIGINT); gethostname(hostname, sizeof(hostname)); - handle.debug = 0; + handle.debug = 1; if (esl_config_open_file(&cfg, cfile)) { diff --git a/libs/esl/src/esl.c b/libs/esl/src/esl.c index 60e7ad66c2..0f7ea83b28 100644 --- a/libs/esl/src/esl.c +++ b/libs/esl/src/esl.c @@ -446,7 +446,6 @@ esl_status_t esl_recv(esl_handle_t *handle) rrval = recv(handle->sock, c, 1, 0); if (rrval == 0) { - if (++zc >= 100) { esl_disconnect(handle); return ESL_FAIL; @@ -588,6 +587,27 @@ esl_status_t esl_recv(esl_handle_t *handle) free(body); + if ((cl = esl_event_get_header(handle->last_ievent, "content-length"))) { + esl_ssize_t sofar = 0; + + len = atol(cl); + body = malloc(len+1); + esl_assert(body); + *(body + len) = '\0'; + + do { + esl_ssize_t r; + if ((r = recv(handle->sock, body + sofar, len - sofar, 0)) < 0) { + strerror_r(handle->errno, handle->err, sizeof(handle->err)); + goto fail; + } + sofar += r; + } while (sofar < len); + + handle->last_ievent->body = body; + } + + if (handle->debug) { char *foo; esl_event_serialize(handle->last_ievent, &foo, ESL_FALSE); diff --git a/src/include/switch_log.h b/src/include/switch_log.h index 01efc164a3..0c60c3ea45 100644 --- a/src/include/switch_log.h +++ b/src/include/switch_log.h @@ -63,7 +63,7 @@ SWITCH_BEGIN_EXTERN_C char *content; const char *userdata; /* To maintain abi, only add new elements to the end of this struct and do not delete any elements */ - + switch_text_channel_t channel; } switch_log_node_t; typedef switch_status_t (*switch_log_function_t) (const switch_log_node_t *node, switch_log_level_t level); diff --git a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c index 9aa285056d..2d0c435637 100644 --- a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c +++ b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c @@ -134,29 +134,32 @@ static void launch_listener_thread(listener_t *listener); static switch_status_t socket_logger(const switch_log_node_t *node, switch_log_level_t level) { listener_t *l; - + switch_mutex_lock(globals.listener_mutex); for (l = listen_list.listeners; l; l = l->next) { if (switch_test_flag(l, LFLAG_LOG) && l->level >= node->level) { - char *data = strdup(node->data); - if (data) { - if (switch_queue_trypush(l->log_queue, data) == SWITCH_STATUS_SUCCESS) { - if (l->lost_logs) { - int ll = l->lost_logs; - switch_event_t *event; - l->lost_logs = 0; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Lost %d log lines!\n", ll); - if (switch_event_create(&event, SWITCH_EVENT_TRAP) == SWITCH_STATUS_SUCCESS) { - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "info", "lost %d log lines", ll); - switch_event_fire(&event); - } + switch_log_node_t *dnode = malloc(sizeof(*node)); + + switch_assert(dnode); + *dnode = *node; + dnode->data = strdup(node->data); + switch_assert(dnode->data); + + if (switch_queue_trypush(l->log_queue, dnode) == SWITCH_STATUS_SUCCESS) { + if (l->lost_logs) { + int ll = l->lost_logs; + switch_event_t *event; + l->lost_logs = 0; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Lost %d log lines!\n", ll); + if (switch_event_create(&event, SWITCH_EVENT_TRAP) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "info", "lost %d log lines", ll); + switch_event_fire(&event); } - } else { - switch_safe_free(data); - l->lost_logs++; } } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n"); + switch_safe_free(dnode->data); + switch_safe_free(dnode); + l->lost_logs++; } } } @@ -171,7 +174,11 @@ static void flush_listener(listener_t *listener, switch_bool_t flush_log, switch if (listener->log_queue) { while (switch_queue_trypop(listener->log_queue, &pop) == SWITCH_STATUS_SUCCESS) { - if (pop) free(pop); + switch_log_node_t *dnode = (switch_log_node_t *) pop; + if (dnode) { + free(dnode->data); + free(dnode); + } } } @@ -981,17 +988,32 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event, if (!*mbuf) { if (switch_test_flag(listener, LFLAG_LOG)) { if (switch_queue_trypop(listener->log_queue, &pop) == SWITCH_STATUS_SUCCESS) { - char *data = (char *) pop; - - - if (data) { - switch_snprintf(buf, sizeof(buf), "Content-Type: log/data\nContent-Length: %" SWITCH_SSIZE_T_FMT "\n\n", strlen(data)); + switch_log_node_t *dnode = (switch_log_node_t *) pop; + + if (dnode->data) { + switch_snprintf(buf, sizeof(buf), + "Content-Type: log/data\n" + "Content-Length: %" SWITCH_SSIZE_T_FMT "\n" + "Log-Level: %d\n" + "Text-Channel: %d\n" + "Log-File: %s\n" + "Log-Func: %s\n" + "Log->Line: %d\n" + "\n", + strlen(dnode->data), + dnode->level, + dnode->channel, + dnode->file, + dnode->func, + dnode->line + ); len = strlen(buf); switch_socket_send(listener->sock, buf, &len); - len = strlen(data); - switch_socket_send(listener->sock, data, &len); + len = strlen(dnode->data); + switch_socket_send(listener->sock, dnode->data, &len); - free(data); + free(dnode->data); + free(dnode); } do_sleep = 0; } diff --git a/src/switch_log.c b/src/switch_log.c index 5db4e9105d..e1961c70ce 100644 --- a/src/switch_log.c +++ b/src/switch_log.c @@ -352,7 +352,7 @@ SWITCH_DECLARE(void) switch_log_printf(switch_text_channel_t channel, const char node = malloc(sizeof(*node)); switch_assert(node); } - + node->data = data; data = NULL; switch_set_string(node->file, filep); @@ -361,7 +361,7 @@ SWITCH_DECLARE(void) switch_log_printf(switch_text_channel_t channel, const char node->level = level; node->content = content; node->timestamp = now; - + node->channel = channel; if (switch_queue_trypush(LOG_QUEUE, node) != SWITCH_STATUS_SUCCESS) { free(node->data);