[Freeswitch-branches] [commit] r5187 - freeswitch/branches/anthonyl/fs-branch/src/mod/loggers/mod_log2file
Author: anthonyl Date: Tue May 15 23:15:36 2007 New Revision: 5187 Modified: freeswitch/branches/anthonyl/fs-branch/src/mod/loggers/mod_log2file/mod_log2file.c Log: more apr integration. the size checking is now totally apr Modified: freeswitch/branches/anthonyl/fs-branch/src/mod/loggers/mod_log2file/mod_log2file.c ============================================================================== --- freeswitch/branches/anthonyl/fs-branch/src/mod/loggers/mod_log2file/mod_log2file.c (original) +++ freeswitch/branches/anthonyl/fs-branch/src/mod/loggers/mod_log2file/mod_log2file.c Tue May 15 23:15:36 2007 @@ -1,6 +1,5 @@ /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005/2006, James Martelletti <james@nerdc0re.com> * * Version: MPL 1.1 * @@ -38,7 +37,7 @@ #define DEFAULT_LOGFILE "/var/log/freeswitch" #define DEFAULT_LIMIT 0x7FFFFFFF #define WARM_FUZZY_OFFSET 64 - +#define MAX_ROT 4096 /* why not */ static const uint8_t STATIC_LEVELS[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; static const char modname[] = "mod_log2file"; @@ -53,13 +52,31 @@ static struct { unsigned int log_fd; unsigned int log_size; /* keep the log size in check for rotation */ + unsigned int roll_size; /* the size that we want to rotate the file at */ unsigned char *logfile; unsigned char *format; + apr_file_t *log_afd; } globals; SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_logfile, globals.logfile) SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_format, globals.format) - + +/* i know this is strange but it's the fastest way i could think of managing log levels. */ +/* i'd rather not try to search something each time we get a message to log */ +struct level_set { + int level; + int on; +}static levels[] = { + {SWITCH_LOG_EMERG, 0}, /* 0 */ + {SWITCH_LOG_ALERT, 0}, /* 1 */ + {SWITCH_LOG_CRIT, 0}, /* 2 */ + {SWITCH_LOG_ERROR, 0}, /* 3 */ + {SWITCH_LOG_WARNING, 0}, /* 4 */ + {SWITCH_LOG_NOTICE, 0}, /* 5 */ + {SWITCH_LOG_INFO, 0}, /* 6 */ + {SWITCH_LOG_DEBUG, 0}, /* 7 */ + {SWITCH_LOG_CONSOLE, 0}, /* 8 */ +}; static switch_loadable_module_interface_t log2file_module_interface = { /*.module_name */ modname, /*.endpoint_interface */ NULL, @@ -73,42 +90,98 @@ /*.directory_interface */ NULL }; -static void del_mapping(char *var) { - if (!strcasecmp(var, "all")) { - all_level = -1; - return; - } - switch_core_hash_insert(log_hash, var, NULL); +/* this may exist somewhere else in the code? */ +static void log_type2str(switch_log_level_t type) +{ + switch(type) { + case SWITCH_LOG_CONSOLE: + printf("[CONSOLE] "); + break; + case SWITCH_LOG_DEBUG: + printf("[DEBUG] "); + break; + case SWITCH_LOG_INFO: + printf("[INFO] "); + break; + case SWITCH_LOG_NOTICE: + printf("[NOTICE] "); + break; + case SWITCH_LOG_WARNING: + printf("[WARNING] "); + break; + case SWITCH_LOG_ERROR: + printf("[ERROR] "); + break; + case SWITCH_LOG_CRIT: + printf("[CRIT] "); + break; + case SWITCH_LOG_ALERT: + printf("[ALERT] "); + break; + case SWITCH_LOG_EMERG: + printf("[EMERG] "); + break; + default: + break; + } + return; } -static void add_mapping(char *var, char *val) +void process_levels(char *p) { - char *name; - - if (!strcasecmp(var, "all")) { - all_level = (int8_t) switch_log_str2level(val); - return; - } - - if (!(name = switch_core_hash_find(name_hash, var))) { - name = switch_core_strdup(module_pool, var); - switch_core_hash_insert(name_hash, name, name); - } - - del_mapping(name); - switch_core_hash_insert(log_hash, name, (void *) &STATIC_LEVELS[(uint8_t)switch_log_str2level(val)]); + char *q; + + while (q = strsep(&p, ",")) { + if (!strncasecmp(q, "emerg", strlen(q))) { + levels[SWITCH_LOG_EMERG].on = 1; + } else if (!strncasecmp(q, "alert", strlen(q))) { + levels[SWITCH_LOG_ALERT].on = 1; + } else if (!strncasecmp(q, "crit", strlen(q))) { + levels[SWITCH_LOG_CRIT].on = 1; + } else if (!strncasecmp(q, "error", strlen(q))) { + levels[SWITCH_LOG_ERROR].on = 1; + } else if (!strncasecmp(q, "warn", strlen(q))) { + levels[SWITCH_LOG_WARNING].on = 1; + } else if (!strncasecmp(q, "notice", strlen(q))) { + levels[SWITCH_LOG_NOTICE].on = 1; + } else if (!strncasecmp(q, "info", strlen(q))) { + levels[SWITCH_LOG_INFO].on = 1; + } else if (!strncasecmp(q, "debug", strlen(q))) { + levels[SWITCH_LOG_DEBUG].on = 1; + } else if (!strncasecmp(q, "console", strlen(q))) { + levels[SWITCH_LOG_CONSOLE].on = 1; + } else if (!strncasecmp(q, "all", strlen(q))) { + int i; + printf("all option!\n"); + for (i=0; i < (sizeof(levels) / sizeof(struct level_set)); i++) { + levels[i].on = 1; + } + } + + } + return; } - static switch_status_t mod_log2file_openlogfile(void) { int fd; + apr_file_t *afd; + apr_status_t stat; + stat = apr_file_open(&afd, globals.logfile, + APR_READ | APR_WRITE | APR_APPEND, NULL, NULL); + + if (stat != APR_SUCCESS) { + return SWITCH_STATUS_FALSE; + } + /* locate where we want to log file to be */ fd = fopen(globals.logfile, "a+"); + if (!fd) { return SWITCH_STATUS_FALSE; - } - globals.log_fd = fd; + } + + globals.log_afd = afd; mod_log2file_check(); return SWITCH_STATUS_SUCCESS; } @@ -139,24 +212,25 @@ return SWITCH_STATUS_FALSE; } memset(p, '\0', strlen(globals.logfile)+WARM_FUZZY_OFFSET); - for (i=1;i<MAX_UINT; i++) { + for (i=1;i<MAX_ROT; i++) { sprintf(p, "%s.%i", globals.logfile, i); - fd = fopen(p, 'w+'); - if (fd) + fd = fopen(p, "r"); + if (fd != NULL) { + fclose(fd); + continue; + } + if(fd = fopen(p, "w")) break; + } - - do { - memset(q, '\0', 1024); - ret = fread(q, 1024, 1, globals.log_fd); - fwrite(q, 1024, 1, fd); - globals.log_size = off; - } while(ret); - + while( ret = fread(q, 1024, 1, globals.log_fd)) { + fwrite(q, 1024, 1, fd); + memset(q, '\0', 1024); + } + /* now we need to resize the original file to 0 */ + /* or just remove it */ ret = fseek(globals.log_fd, 0, SEEK_SET); - fclose(fd); - free(p); free(q); return SWITCH_STATUS_SUCCESS; @@ -165,13 +239,16 @@ /* check the size of the file for rotation */ static switch_status_t mod_log2file_check(void) { + apr_status_t stat; + apr_finfo_t finfo; off_t off; - - if((off = ftello(globals.log_fd)) < 0) { + + stat = apr_file_info_get(&finfo, APR_FINFO_SIZE, &globals.log_afd); + + if (stat != APR_SUCCESS) return SWITCH_STATUS_FALSE; - } - - if (off >= DEFAULT_LIMIT) { + + if (finfo.size >= globals.roll_size) { return mod_log2file_rotate(); } @@ -203,48 +280,57 @@ static switch_status_t mod_log2file_logger(const switch_log_node_t *node, switch_log_level_t level) { - char *message = NULL; + uint8_t *lookup = NULL; char line_no[sizeof(int)*8+1]; char date[80] = ""; - uint8_t *lookup = NULL; - switch_log_level_t level = SWITCH_LOG_DEBUG; switch_time_exp_t time; switch_size_t retsize; - - message = (char *)malloc(strlen(globals.format)+2); + char *message = NULL; - if (!message) { - return SWITCH_STATUS_FALSE; + if (!levels[node->level].on) { + return SWITCH_STATUS_SUCCESS; } - switch_copy_string(message, globals.format, strlen(globals.format)+1); - - message = switch_string_replace(message, "${data}", node->data); - message = switch_string_replace(message, "${message}", node->content); - - if (switch_time_exp_lt(&time, node->timestamp) != SWITCH_STATUS_SUCCESS) { - free(message); - return SWITCH_STATUS_FALSE; + message = (char *)malloc(strlen(globals.format)+2); + switch_copy_string(message, globals.format, strlen(globals.format)+1); + + message = switch_string_replace(message, "${message}", node->content); + + if (switch_time_exp_lt(&time, node->timestamp) != SWITCH_STATUS_SUCCESS) { + return SWITCH_STATUS_FALSE; } switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &time); + message = switch_string_replace(message, "${time}", date); - message = switch_string_replace(message, "${file}", node->file); message = switch_string_replace(message, "${func}", node->func); snprintf(line_no, sizeof(line_no), "%d", node->line); message = switch_string_replace(message, "${line}", line_no); - + + /* work with the log type */ + log_type2str(node->level); + printf("\n"); + printf("Type: (%i)\n", node->level); + if (node->file) + printf("File: %s\n", node->file); + if (node->line) + printf("Line: %i\n", node->line); + if (node->func) + printf("Func: %s\n", node->func); + if (node->data) + printf("Data: %s\n", node->data); + if (node->content) + printf("Cont: %s\n", node->content); + + if (!switch_strlen_zero(message)) { mod_log2file_write("%s", message); } - - free(message); - + return SWITCH_STATUS_SUCCESS; } - static switch_status_t load_config(void) { char *cf = "log2file.conf"; @@ -261,36 +347,43 @@ set_global_logfile(val); } else if (!strcmp(var, "format")) { set_global_format(val); - } - + } else if (!strcmp(var, "level")) { + process_levels(val); + } else if (!strcmp(var, "rollover")) { + globals.roll_size = atoi(val); + } } } switch_xml_free(xml); } - + if (globals.roll_size == 0) { + globals.roll_size = DEFAULT_LIMIT; + } if (switch_strlen_zero(globals.logfile)) { set_global_logfile(DEFAULT_LOGFILE); } - if (switch_strlen_zero(globals.format)) { set_global_format(DEFAULT_FORMAT); } - return 0; } SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **interface, char *filename) { switch_status_t status; - *interface = &log2file_module_interface; + if (switch_core_new_memory_pool(&module_pool) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "OH OH no pool\n"); + return SWITCH_STATUS_TERM; + } + + *interface = &log2file_module_interface; + if ((status=load_config()) != SWITCH_STATUS_SUCCESS) { return status; } - mod_log2file_openlogfile(); switch_log_bind_logger(mod_log2file_logger, SWITCH_LOG_DEBUG); - return SWITCH_STATUS_SUCCESS; }
participants (1)
-
Freeswitch SVN