\r
#define DEFAULT_FORMAT "${data}" \r
#define DEFAULT_LIMIT 0x7FFFFFFF\r
-#define WARM_FUZZY_OFFSET 64\r
+#define WARM_FUZZY_OFFSET 256\r
#define MAX_ROT 4096 /* why not */\r
static const uint8_t STATIC_LEVELS[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};\r
\r
return;\r
}\r
\r
+static switch_status_t mod_logfile_rotate(void);\r
+\r
+static switch_status_t mod_logfile_openlogfile(switch_bool_t check)\r
+{\r
+ unsigned int flags = 0;\r
+ switch_file_t *afd;\r
+ switch_status_t stat;\r
+\r
+ flags |= SWITCH_FOPEN_CREATE;\r
+ flags |= SWITCH_FOPEN_READ;\r
+ flags |= SWITCH_FOPEN_WRITE;\r
+ flags |= SWITCH_FOPEN_APPEND;\r
+\r
+ stat = switch_file_open(&afd, globals.logfile, flags, SWITCH_FPROT_UREAD|SWITCH_FPROT_UWRITE, module_pool);\r
+ if (stat != SWITCH_STATUS_SUCCESS) {\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
+\r
+ globals.log_afd = afd;\r
+\r
+ globals.log_size = switch_file_get_size(globals.log_afd);\r
+\r
+ if (check && globals.log_size >= globals.roll_size) {\r
+ mod_logfile_rotate();\r
+ }\r
+\r
+ return SWITCH_STATUS_SUCCESS;\r
+}\r
+\r
+\r
/* rotate the log file */\r
static switch_status_t mod_logfile_rotate(void)\r
{\r
unsigned int i = 0;\r
- unsigned int flags = 0;\r
char *p = NULL;\r
- char *q = NULL;\r
switch_status_t stat = 0;\r
- switch_size_t nbytes = 1024;\r
- switch_file_t *l_afd = NULL;\r
- switch_memory_pool_t *pool = NULL;\r
int64_t offset = 0;\r
+ switch_memory_pool_t *pool;\r
+ switch_time_exp_t tm;\r
+ char date[80] = "";\r
+ switch_size_t retsize;\r
+\r
+ switch_time_exp_lt(&tm, switch_time_now());\r
+ switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d-%H-%M-%S", &tm);\r
\r
globals.log_size = 0;\r
- switch_core_new_memory_pool(&pool); \r
\r
stat = switch_file_seek(globals.log_afd, SWITCH_SEEK_SET, &offset);\r
\r
return SWITCH_STATUS_FALSE;\r
\r
p = malloc(strlen(globals.logfile)+WARM_FUZZY_OFFSET);\r
- if (!p) {\r
- return SWITCH_STATUS_FALSE;\r
- }\r
-\r
- q = malloc(1024);\r
- if (!q) {\r
- free(p);\r
- return SWITCH_STATUS_FALSE;\r
- }\r
+ assert(p);\r
\r
memset(p, '\0', strlen(globals.logfile)+WARM_FUZZY_OFFSET);\r
\r
+ switch_core_new_memory_pool(&pool);\r
+ \r
for (i=1; i < MAX_ROT; i++) {\r
- sprintf((char *)p, "%s.%i", globals.logfile, i);\r
-\r
- stat = switch_file_open(&l_afd, p, SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD, pool);\r
-\r
- if (stat == SWITCH_STATUS_SUCCESS) {\r
- switch_file_close(l_afd);\r
- continue;\r
- }\r
- flags |= SWITCH_FOPEN_READ;\r
- flags |= SWITCH_FOPEN_WRITE;\r
- flags |= SWITCH_FOPEN_CREATE;\r
-\r
- stat = switch_file_open(&l_afd, p, flags , SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE ,pool);\r
- if (stat == SWITCH_STATUS_SUCCESS)\r
- break;\r
+ sprintf((char *)p, "%s.%s.%i", globals.logfile, date, i);\r
+ if (switch_file_exists(p, pool) == SWITCH_STATUS_SUCCESS) {\r
+ continue;\r
+ }\r
+ \r
+ switch_file_close(globals.log_afd);\r
+ switch_file_rename(globals.logfile, p, pool);\r
+ mod_logfile_openlogfile(SWITCH_FALSE);\r
+ break;\r
}\r
\r
- while ((stat = switch_file_read(globals.log_afd, q, &nbytes)) == SWITCH_STATUS_SUCCESS) {\r
- switch_file_write(l_afd, q, &nbytes);\r
- memset(q, '\0', 1024);\r
- nbytes = 1024;\r
- }\r
-\r
- offset = 0;\r
- stat = switch_file_seek(globals.log_afd, SWITCH_SEEK_SET, &offset);\r
free(p);\r
- free(q);\r
- return SWITCH_STATUS_SUCCESS;\r
-}\r
-\r
-static switch_status_t mod_logfile_openlogfile(void)\r
-{\r
- unsigned int flags = 0;\r
- switch_file_t *afd;\r
- switch_status_t stat;\r
- switch_memory_pool_t *pool;\r
-\r
- flags |= SWITCH_FOPEN_CREATE;\r
- flags |= SWITCH_FOPEN_READ;\r
- flags |= SWITCH_FOPEN_WRITE;\r
- flags |= SWITCH_FOPEN_APPEND;\r
-\r
- switch_core_new_memory_pool(&pool); \r
- stat = switch_file_open(&afd, globals.logfile,flags,SWITCH_FPROT_UREAD|SWITCH_FPROT_UWRITE, pool);\r
- if (stat != SWITCH_STATUS_SUCCESS) {\r
- return SWITCH_STATUS_FALSE;\r
- }\r
-\r
- globals.log_afd = afd;\r
-\r
- globals.log_size = switch_file_get_size(globals.log_afd);\r
+ \r
\r
- if (globals.log_size >= globals.roll_size) {\r
- mod_logfile_rotate();\r
- }\r
+ switch_core_destroy_memory_pool(&pool);\r
\r
return SWITCH_STATUS_SUCCESS;\r
}\r
\r
+\r
+#if 0\r
/* write to the actual logfile */\r
static switch_status_t mod_logfile_write(char *fmt, ...) \r
{\r
\r
globals.log_size += len;\r
\r
- /* we may want to hold back on this for preformance reasons */\r
if (globals.log_size >= globals.roll_size) {\r
mod_logfile_rotate();\r
}\r
\r
return SWITCH_STATUS_SUCCESS;\r
}\r
+#endif\r
\r
-static switch_status_t mod_logfile_logger(const switch_log_node_t *node, switch_log_level_t level)\r
+/* write to the actual logfile */\r
+static switch_status_t mod_logfile_raw_write(char *log_data) \r
{\r
- char line_no[sizeof(int)*8+1];\r
- char date[80] = "";\r
- switch_time_exp_t time;\r
- switch_size_t retsize;\r
- char *message = NULL;\r
-\r
- if (!levels[node->level].on) {\r
- return SWITCH_STATUS_SUCCESS;\r
- }\r
+ switch_size_t len;\r
+ len = strlen(log_data);\r
\r
- message = (char *)malloc(strlen(globals.format)+2);\r
- switch_copy_string(message, globals.format, strlen(globals.format)+1);\r
+ if (len <= 0)\r
+ return SWITCH_STATUS_FALSE;\r
\r
- message = switch_string_replace(message, "${message}", node->content);\r
+ if (switch_file_write(globals.log_afd, log_data, &len) != SWITCH_STATUS_SUCCESS) {\r
+ switch_file_close(globals.log_afd);\r
+ mod_logfile_openlogfile(SWITCH_TRUE);\r
+ }\r
+ \r
+ globals.log_size += len;\r
\r
- if (switch_time_exp_lt(&time, node->timestamp) != SWITCH_STATUS_SUCCESS) {\r
- return SWITCH_STATUS_FALSE;\r
+ if (globals.log_size >= globals.roll_size) {\r
+ mod_logfile_rotate();\r
}\r
\r
- switch_strftime(date, &retsize, sizeof(date), "%Y-%m-%d %T", &time);\r
-\r
- message = switch_string_replace(message, "${time}", date);\r
- message = switch_string_replace(message, "${file}", node->file);\r
- message = switch_string_replace(message, "${func}", node->func);\r
+ return SWITCH_STATUS_SUCCESS;\r
+}\r
\r
- snprintf(line_no, sizeof(line_no), "%d", node->line);\r
- message = switch_string_replace(message, "${line}", line_no);\r
+static switch_status_t mod_logfile_logger(const switch_log_node_t *node, switch_log_level_t level)\r
+{\r
\r
- if (!switch_strlen_zero(message)) {\r
- mod_logfile_write("%s", message);\r
- }\r
+ if (levels[node->level].on) {\r
+ mod_logfile_raw_write(node->data);\r
+ }\r
\r
return SWITCH_STATUS_SUCCESS;\r
}\r
return status;\r
}\r
\r
- mod_logfile_openlogfile();\r
+ mod_logfile_openlogfile(SWITCH_TRUE);\r
\r
switch_log_bind_logger(mod_logfile_logger, SWITCH_LOG_DEBUG);\r
\r