From 9cc9fab87ab18b3ab52b2f7cd8898a5e8c899aae Mon Sep 17 00:00:00 2001 From: tilghman Date: Sun, 26 Feb 2006 16:26:39 +0000 Subject: Bug 5950 - reenable queue log rotation; also, eliminate redundant code git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@11165 f38db490-d61c-443f-a65b-d21fe96a405b --- include/asterisk/logger.h | 1 + logger.c | 178 +++++++++++++++++++++------------------------- 2 files changed, 82 insertions(+), 97 deletions(-) diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h index de8268fd3..ac764baa4 100644 --- a/include/asterisk/logger.h +++ b/include/asterisk/logger.h @@ -34,6 +34,7 @@ extern "C" { #endif #define EVENTLOG "event_log" +#define QUEUELOG "queue_log" #define DEBUG_M(a) { \ a; \ diff --git a/logger.c b/logger.c index a6e07d6f8..0a397ff46 100644 --- a/logger.c +++ b/logger.c @@ -51,7 +51,7 @@ static int syslog_level_map[] = { LOG_DEBUG }; -#define SYSLOG_NLEVELS 6 +#define SYSLOG_NLEVELS sizeof(syslog_level_map) / sizeof(int) #include "asterisk/logger.h" #include "asterisk/lock.h" @@ -116,6 +116,7 @@ static struct logchannel *logchannels = NULL; static int msgcnt = 0; static FILE *eventlog = NULL; +static FILE *qlog = NULL; static char *levels[] = { "DEBUG", @@ -359,13 +360,10 @@ static void init_logger_chain(void) ast_mutex_unlock(&loglock); } -static FILE *qlog = NULL; -AST_MUTEX_DEFINE_STATIC(qloglock); - void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt, ...) { va_list ap; - ast_mutex_lock(&qloglock); + ast_mutex_lock(&loglock); if (qlog) { va_start(ap, fmt); fprintf(qlog, "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); @@ -374,67 +372,32 @@ void ast_queue_log(const char *queuename, const char *callid, const char *agent, va_end(ap); fflush(qlog); } - ast_mutex_unlock(&qloglock); -} - -static void queue_log_init(void) -{ - char filename[256]; - int reloaded = 0; - - ast_mutex_lock(&qloglock); - if (qlog) { - reloaded = 1; - fclose(qlog); - qlog = NULL; - } - snprintf(filename, sizeof(filename), "%s/%s", (char *)ast_config_AST_LOG_DIR, "queue_log"); - if (logfiles.queue_log) { - qlog = fopen(filename, "a"); - } - ast_mutex_unlock(&qloglock); - if (reloaded) - ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); - else - ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); + ast_mutex_unlock(&loglock); } int reload_logger(int rotate) { char old[AST_CONFIG_MAX_PATH] = ""; char new[AST_CONFIG_MAX_PATH]; + int event_rotate = rotate, queue_rotate = rotate; struct logchannel *f; FILE *myf; - int x; + int x, res = 0; ast_mutex_lock(&loglock); if (eventlog) fclose(eventlog); else - rotate = 0; + event_rotate = 0; eventlog = NULL; - mkdir((char *)ast_config_AST_LOG_DIR, 0755); - snprintf(old, sizeof(old), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG); - - if (logfiles.event_log) { - if (rotate) { - for (x=0;;x++) { - snprintf(new, sizeof(new), "%s/%s.%d", (char *)ast_config_AST_LOG_DIR, EVENTLOG,x); - myf = fopen((char *)new, "r"); - if (myf) /* File exists */ - fclose(myf); - else - break; - } - - /* do it */ - if (rename(old,new)) - fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); - } + if (qlog) + fclose(qlog); + else + queue_rotate = 0; + qlog = NULL; - eventlog = fopen(old, "a"); - } + mkdir((char *)ast_config_AST_LOG_DIR, 0755); f = logchannels; while(f) { @@ -466,24 +429,69 @@ int reload_logger(int rotate) f = f->next; } - ast_mutex_unlock(&loglock); - filesize_reload_needed = 0; init_logger_chain(); - queue_log_init(); if (logfiles.event_log) { + snprintf(old, sizeof(old), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG); + if (event_rotate) { + for (x=0;;x++) { + snprintf(new, sizeof(new), "%s/%s.%d", (char *)ast_config_AST_LOG_DIR, EVENTLOG,x); + myf = fopen((char *)new, "r"); + if (myf) /* File exists */ + fclose(myf); + else + break; + } + + /* do it */ + if (rename(old,new)) + ast_log(LOG_ERROR, "Unable to rename file '%s' to '%s'\n", old, new); + } + + eventlog = fopen(old, "a"); if (eventlog) { ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n"); if (option_verbose) ast_verbose("Asterisk Event Logger restarted\n"); - return 0; - } else + } else { ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); - } else - return 0; - return -1; + res = -1; + } + } + + if (logfiles.queue_log) { + snprintf(old, sizeof(old), "%s/%s", (char *)ast_config_AST_LOG_DIR, QUEUELOG); + if (queue_rotate) { + for (x = 0; ; x++) { + snprintf(new, sizeof(new), "%s/%s.%d", (char *)ast_config_AST_LOG_DIR, QUEUELOG, x); + myf = fopen((char *)new, "r"); + if (myf) /* File exists */ + fclose(myf); + else + break; + } + + /* do it */ + if (rename(old, new)) + ast_log(LOG_ERROR, "Unable to rename file '%s' to '%s'\n", old, new); + } + + qlog = fopen(old, "a"); + if (qlog) { + ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); + ast_log(LOG_EVENT, "Restarted Asterisk Queue Logger\n"); + if (option_verbose) + ast_verbose("Asterisk Queue Logger restarted\n"); + } else { + ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); + res = -1; + } + } + ast_mutex_unlock(&loglock); + + return res; } static int handle_logger_reload(int fd, int argc, char *argv[]) @@ -589,6 +597,7 @@ static int handle_SIGXFSZ(int sig) int init_logger(void) { char tmp[256]; + int res = 0; /* auto rotate if sig SIGXFSZ comes a-knockin */ (void) signal(SIGXFSZ,(void *) handle_SIGXFSZ); @@ -598,12 +607,11 @@ int init_logger(void) ast_cli_register(&rotate_logger_cli); ast_cli_register(&logger_show_channels_cli); + mkdir((char *)ast_config_AST_LOG_DIR, 0755); + /* create log channels */ init_logger_chain(); - /* initialize queue logger */ - queue_log_init(); - /* create the eventlog */ if (logfiles.event_log) { mkdir((char *)ast_config_AST_LOG_DIR, 0755); @@ -613,13 +621,18 @@ int init_logger(void) ast_log(LOG_EVENT, "Started Asterisk Event Logger\n"); if (option_verbose) ast_verbose("Asterisk Event Logger Started %s\n",(char *)tmp); - return 0; - } else + } else { ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); - } else - return 0; + res = -1; + } + } - return -1; + if (logfiles.queue_log) { + snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, QUEUELOG); + qlog = fopen(tmp, "a"); + ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); + } + return res; } void close_logger(void) @@ -642,35 +655,6 @@ void close_logger(void) return; } -static void strip_coloring(char *str) -{ - char *src, *dest, *end; - - if (!str) - return; - - /* find the first potential escape sequence in the string */ - - src = strchr(str, '\033'); - if (!src) - return; - - dest = src; - while (*src) { - /* at the top of this loop, *src will always be an ESC character */ - if ((src[1] == '[') && ((end = strchr(src + 2, 'm')))) - src = end + 1; - else - *dest++ = *src++; - - /* copy characters, checking for ESC as we go */ - while (*src && (*src != '\033')) - *dest++ = *src++; - } - - *dest = '\0'; -} - static void ast_log_vsyslog(int level, const char *file, int line, const char *function, const char *fmt, va_list args) { char buf[BUFSIZ]; @@ -693,7 +677,7 @@ static void ast_log_vsyslog(int level, const char *file, int line, const char *f } s = buf + strlen(buf); vsnprintf(s, sizeof(buf) - strlen(buf), fmt, args); - strip_coloring(s); + term_strip(s, s, strlen(s) + 1); syslog(syslog_level_map[level], "%s", buf); } @@ -795,7 +779,7 @@ void ast_log(int level, const char *file, int line, const char *function, const va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); - strip_coloring(buf); + term_strip(buf, buf, sizeof(buf)); fputs(buf, chan->fileptr); fflush(chan->fileptr); } -- cgit v1.2.3