#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <asterisk/lock.h>
#include <asterisk/options.h>
#include <asterisk/channel.h>
#include <asterisk/config.h>
#include <asterisk/term.h>
#include <asterisk/cli.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <sys/stat.h>
#include "asterisk.h"
#include "astconf.h"
#include <syslog.h>
#include <asterisk/logger.h>
Go to the source code of this file.
Data Structures | |
struct | msglist |
struct | logchannel |
struct | verb |
Defines | |
#define | SYSLOG_NAMES |
#define | SYSLOG_NLEVELS 6 |
#define | MAX_MSG_QUEUE 200 |
Functions | |
int | reload_logger (int rotate) |
int | init_logger (void) |
void | ast_log (int level, const char *file, int line, const char *function, const char *fmt,...) |
void | ast_verbose (const char *fmt,...) |
int | ast_verbose_dmesg (void(*v)(const char *string, int opos, int replacelast, int complete)) |
int | ast_register_verbose (void(*v)(const char *string, int opos, int replacelast, int complete)) |
int | ast_unregister_verbose (void(*v)(const char *string, int opos, int replacelast, int complete)) |
|
Definition at line 49 of file logger.c. Referenced by ast_verbose(). |
|
Value: /* so we can map syslog facilities names to their numeric values, from <syslog.h> which is included by logger.h */ |
|
|
|
Definition at line 408 of file logger.c. References __LOG_DEBUG, __LOG_EVENT, __LOG_VERBOSE, ast_console_puts(), ast_log(), ast_mutex_lock, ast_mutex_unlock, ast_verbose(), COLOR_BRWHITE, LOG_EVENT, option_debug, option_verbose, reload_logger(), and term_color().
00408 { 00409 struct logchannel *chan; 00410 char buf[BUFSIZ]; 00411 time_t t; 00412 struct tm tm; 00413 char date[256]; 00414 00415 va_list ap; 00416 00417 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) { 00418 return; 00419 } 00420 00421 /* begin critical section */ 00422 ast_mutex_lock(&loglock); 00423 00424 time(&t); 00425 localtime_r(&t, &tm); 00426 strftime(date, sizeof(date), "%b %e %T", &tm); 00427 00428 00429 if (level == __LOG_EVENT) { 00430 va_start(ap, fmt); 00431 00432 fprintf(eventlog, "%s asterisk[%d]: ", date, getpid()); 00433 vfprintf(eventlog, fmt, ap); 00434 fflush(eventlog); 00435 00436 va_end(ap); 00437 ast_mutex_unlock(&loglock); 00438 return; 00439 } 00440 00441 if (logchannels) { 00442 chan = logchannels; 00443 while(chan) { 00444 if (chan->syslog && (chan->logmask & (1 << level))) { 00445 va_start(ap, fmt); 00446 ast_log_vsyslog(level, file, line, function, fmt, ap); 00447 va_end(ap); 00448 } else if ((chan->logmask & (1 << level)) && (chan->console)) { 00449 char linestr[128]; 00450 char tmp1[80], tmp2[80], tmp3[80], tmp4[80]; 00451 00452 if(level != __LOG_VERBOSE) { 00453 sprintf(linestr, "%d", line); 00454 snprintf(buf, sizeof(buf), "%s %s[%ld]: %s:%s %s: ", 00455 date, 00456 term_color(tmp1, levels[level], colors[level], 0, sizeof(tmp1)), 00457 (long)pthread_self(), 00458 term_color(tmp2, file, COLOR_BRWHITE, 0, sizeof(tmp2)), 00459 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), 00460 term_color(tmp4, function, COLOR_BRWHITE, 0, sizeof(tmp4))); 00461 00462 ast_console_puts(buf); 00463 va_start(ap, fmt); 00464 vsnprintf(buf, sizeof(buf), fmt, ap); 00465 va_end(ap); 00466 ast_console_puts(buf); 00467 } 00468 } else if ((chan->logmask & (1 << level)) && (chan->fileptr)) { 00469 snprintf(buf, sizeof(buf), "%s %s[%ld]: ", date, 00470 levels[level], (long)pthread_self()); 00471 fprintf(chan->fileptr, buf); 00472 va_start(ap, fmt); 00473 vsnprintf(buf, sizeof(buf), fmt, ap); 00474 va_end(ap); 00475 fputs(buf, chan->fileptr); 00476 fflush(chan->fileptr); 00477 } 00478 chan = chan->next; 00479 } 00480 } else { 00481 /* 00482 * we don't have the logger chain configured yet, 00483 * so just log to stdout 00484 */ 00485 if (level != __LOG_VERBOSE) { 00486 va_start(ap, fmt); 00487 vsnprintf(buf, sizeof(buf), fmt, ap); 00488 va_end(ap); 00489 fputs(buf, stdout); 00490 } 00491 } 00492 00493 ast_mutex_unlock(&loglock); 00494 /* end critical section */ 00495 if (pending_logger_reload) { 00496 reload_logger(1); 00497 ast_log(LOG_EVENT,"Rotated Logs Per SIGXFSZ\n"); 00498 if (option_verbose) 00499 ast_verbose("Rotated Logs Per SIGXFSZ\n"); 00500 } 00501 } 00502 |
|
Definition at line 582 of file logger.c. References ast_mutex_lock, ast_mutex_unlock, and malloc. Referenced by main().
00582 { 00583 struct msglist *m; 00584 struct verb *tmp; 00585 /* XXX Should be more flexible here, taking > 1 verboser XXX */ 00586 if ((tmp = malloc(sizeof (struct verb)))) { 00587 tmp->verboser = v; 00588 ast_mutex_lock(&msglist_lock); 00589 tmp->next = verboser; 00590 verboser = tmp; 00591 m = list; 00592 while(m) { 00593 /* Send all the existing entries that we have queued (i.e. they're likely to have missed) */ 00594 v(m->msg, 0, 0, 1); 00595 m = m->next; 00596 } 00597 ast_mutex_unlock(&msglist_lock); 00598 return 0; 00599 } 00600 return -1; 00601 } 00602 |
|
Definition at line 604 of file logger.c. References ast_mutex_lock, ast_mutex_unlock, and free.
00604 { 00605 int res = -1; 00606 struct verb *tmp, *tmpl=NULL; 00607 ast_mutex_lock(&msglist_lock); 00608 tmp = verboser; 00609 while(tmp) { 00610 if (tmp->verboser == v) { 00611 if (tmpl) 00612 tmpl->next = tmp->next; 00613 else 00614 verboser = tmp->next; 00615 free(tmp); 00616 break; 00617 } 00618 tmpl = tmp; 00619 tmp = tmp->next; 00620 } 00621 if (tmp) 00622 res = 0; 00623 ast_mutex_unlock(&msglist_lock); 00624 return res; 00625 } 00626 } |
|
Definition at line 504 of file logger.c. References ast_log(), ast_mutex_lock, ast_mutex_unlock, free, LOG_ERROR, LOG_VERBOSE, malloc, MAX_MSG_QUEUE, and strdup.
00504 { 00505 static char stuff[4096]; 00506 static int pos = 0, opos; 00507 static int replacelast = 0, complete; 00508 struct msglist *m; 00509 struct verb *v; 00510 va_list ap; 00511 va_start(ap, fmt); 00512 ast_mutex_lock(&msglist_lock); 00513 vsnprintf(stuff + pos, sizeof(stuff) - pos, fmt, ap); 00514 opos = pos; 00515 pos = strlen(stuff); 00516 if (fmt[strlen(fmt)-1] == '\n') 00517 complete = 1; 00518 else 00519 complete=0; 00520 if (complete) { 00521 if (msgcnt < MAX_MSG_QUEUE) { 00522 /* Allocate new structure */ 00523 m = malloc(sizeof(struct msglist)); 00524 msgcnt++; 00525 } else { 00526 /* Recycle the oldest entry */ 00527 m = list; 00528 list = list->next; 00529 free(m->msg); 00530 } 00531 if (m) { 00532 m->msg = strdup(stuff); 00533 if (m->msg) { 00534 if (last) 00535 last->next = m; 00536 else 00537 list = m; 00538 m->next = NULL; 00539 last = m; 00540 } else { 00541 msgcnt--; 00542 ast_log(LOG_ERROR, "Out of memory\n"); 00543 free(m); 00544 } 00545 } 00546 } 00547 if (verboser) { 00548 v = verboser; 00549 while(v) { 00550 v->verboser(stuff, opos, replacelast, complete); 00551 v = v->next; 00552 } 00553 } /* else 00554 fprintf(stdout, stuff + opos); */ 00555 00556 ast_log(LOG_VERBOSE, stuff); 00557 00558 if (fmt[strlen(fmt)-1] != '\n') 00559 replacelast = 1; 00560 else 00561 replacelast = pos = 0; 00562 va_end(ap); 00563 00564 ast_mutex_unlock(&msglist_lock); 00565 } 00566 |
|
Definition at line 568 of file logger.c. References ast_mutex_lock, and ast_mutex_unlock.
00568 { 00569 struct msglist *m; 00570 m = list; 00571 ast_mutex_lock(&msglist_lock); 00572 while(m) { 00573 /* Send all the existing entries that we have queued (i.e. they're likely to have missed) */ 00574 v(m->msg, 0, 0, 1); 00575 m = m->next; 00576 } 00577 ast_mutex_unlock(&msglist_lock); 00578 return 0; 00579 } 00580 |
|
Definition at line 355 of file logger.c. References ast_cli_register(), ast_config_AST_LOG_DIR, ast_log(), ast_verbose(), EVENTLOG, LOG_ERROR, LOG_EVENT, and option_verbose. Referenced by main().
00355 { 00356 char tmp[256]; 00357 00358 /* auto rotate if sig SIGXFSZ comes a-knockin */ 00359 (void) signal(SIGXFSZ,(void *) handle_SIGXFSZ); 00360 00361 /* register the relaod logger cli command */ 00362 ast_cli_register(&reload_logger_cli); 00363 ast_cli_register(&rotate_logger_cli); 00364 00365 /* create the eventlog */ 00366 mkdir((char *)ast_config_AST_LOG_DIR, 0755); 00367 snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG); 00368 eventlog = fopen((char *)tmp, "a"); 00369 if (eventlog) { 00370 init_logger_chain(); 00371 ast_log(LOG_EVENT, "Started Asterisk Event Logger\n"); 00372 if (option_verbose) 00373 ast_verbose("Asterisk Event Logger Started %s\n",(char *)tmp); 00374 return 0; 00375 } else 00376 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); 00377 00378 init_logger_chain(); 00379 00380 /* create log channels */ 00381 init_logger_chain(); 00382 return -1; 00383 } 00384 |
|
Definition at line 225 of file logger.c. References ast_config_AST_LOG_DIR, AST_CONFIG_MAX_PATH, ast_log(), ast_mutex_lock, ast_mutex_unlock, ast_verbose(), EVENTLOG, LOG_ERROR, LOG_EVENT, and option_verbose. Referenced by ast_log().
00225 { 00226 char old[AST_CONFIG_MAX_PATH]; 00227 char new[AST_CONFIG_MAX_PATH]; 00228 struct logchannel *f; 00229 FILE *myf; 00230 00231 int x; 00232 ast_mutex_lock(&loglock); 00233 if (eventlog) 00234 fclose(eventlog); 00235 else 00236 rotate = 0; 00237 eventlog = NULL; 00238 00239 00240 00241 mkdir((char *)ast_config_AST_LOG_DIR, 0755); 00242 snprintf(old, sizeof(old), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG); 00243 00244 if(rotate) { 00245 for(x=0;;x++) { 00246 snprintf(new, sizeof(new), "%s/%s.%d", (char *)ast_config_AST_LOG_DIR, EVENTLOG,x); 00247 myf = fopen((char *)new, "r"); 00248 if(myf) 00249 fclose(myf); 00250 else 00251 break; 00252 } 00253 00254 /* do it */ 00255 if (rename(old,new)) 00256 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00257 } 00258 00259 eventlog = fopen(old, "a"); 00260 00261 f = logchannels; 00262 while(f) { 00263 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00264 fclose(f->fileptr); 00265 f->fileptr = NULL; 00266 if(rotate) { 00267 strncpy(old, f->filename, sizeof(old)); 00268 00269 for(x=0;;x++) { 00270 snprintf(new, sizeof(new), "%s.%d", f->filename, x); 00271 myf = fopen((char *)new, "r"); 00272 if (myf) { 00273 fclose(myf); 00274 } else { 00275 break; 00276 } 00277 } 00278 00279 /* do it */ 00280 if (rename(old,new)) 00281 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00282 } 00283 } 00284 f = f->next; 00285 } 00286 00287 ast_mutex_unlock(&loglock); 00288 00289 if (eventlog) { 00290 init_logger_chain(); 00291 ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n"); 00292 if (option_verbose) 00293 ast_verbose("Asterisk Event Logger restarted\n"); 00294 return 0; 00295 } else 00296 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); 00297 init_logger_chain(); 00298 pending_logger_reload = 0; 00299 return -1; 00300 } 00301 |