#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <syslog.h>
#include "asterisk.h"
#include "asterisk/logger.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 "asterisk/utils.h"
#include "asterisk/manager.h"
Include dependency graph for logger.c:

Go to the source code of this file.
Defines | |
| #define | FORMATL "%-35.35s %-8.8s %-9.9s " |
| #define | GETTID() getpid() |
| #define | MAX_MSG_QUEUE 200 |
| #define | SYSLOG_NAMES |
| #define | SYSLOG_NLEVELS sizeof(syslog_level_map) / sizeof(int) |
Enumerations | |
| enum | logtypes { LOGTYPE_SYSLOG, LOGTYPE_FILE, LOGTYPE_CONSOLE } |
Functions | |
| void | ast_log (int level, const char *file, int line, const char *function, const char *fmt,...) |
| static void | ast_log_vsyslog (int level, const char *file, int line, const char *function, const char *fmt, va_list args) |
| AST_MUTEX_DEFINE_STATIC (loglock) | |
| AST_MUTEX_DEFINE_STATIC (msglist_lock) | |
| void | ast_queue_log (const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...) |
| 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)) |
| void | ast_verbose (const char *fmt,...) |
| int | ast_verbose_dmesg (void(*v)(const char *string, int opos, int replacelast, int complete)) |
| void | close_logger (void) |
| static int | handle_logger_reload (int fd, int argc, char *argv[]) |
| static int | handle_logger_rotate (int fd, int argc, char *argv[]) |
| static int | handle_logger_show_channels (int fd, int argc, char *argv[]) |
| static int | handle_SIGXFSZ (int sig) |
| int | init_logger (void) |
| static void | init_logger_chain (void) |
| static int | make_components (char *s, int lineno) |
| static struct logchannel * | make_logchannel (char *channel, char *components, int lineno) |
| int | reload_logger (int rotate) |
Variables | |
| static int | colors [] |
| static char | dateformat [256] = "%b %e %T" |
| static FILE * | eventlog = NULL |
| static int | filesize_reload_needed = 0 |
| static int | global_logmask = -1 |
| static char | hostname [MAXHOSTNAMELEN] |
| static struct msglist * | last |
| static char * | levels [] |
| static struct msglist * | list |
| static struct logchannel * | logchannels = NULL |
| struct { | |
| unsigned int event_log:1 | |
| unsigned int queue_log:1 | |
| } | logfiles |
| static char | logger_reload_help [] |
| static char | logger_rotate_help [] |
| static struct ast_cli_entry | logger_show_channels_cli |
| static char | logger_show_channels_help [] |
| static int | msgcnt = 0 |
| static FILE * | qlog = NULL |
| static struct ast_cli_entry | reload_logger_cli |
| static struct ast_cli_entry | rotate_logger_cli |
| static int | syslog_level_map [] |
| static struct verb * | verboser |
Logging routines
Definition in file logger.c.
|
|
Referenced by handle_logger_show_channels(). |
|
|
Definition at line 75 of file logger.c. Referenced by ast_log(), and ast_log_vsyslog(). |
|
|
Definition at line 66 of file logger.c. Referenced by ast_verbose(). |
|
|
|
|
|
Definition at line 54 of file logger.c. Referenced by ast_log_vsyslog(). |
|
|
Definition at line 98 of file logger.c. 00098 {
00099 LOGTYPE_SYSLOG,
00100 LOGTYPE_FILE,
00101 LOGTYPE_CONSOLE,
00102 };
|
|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
|
Definition at line 660 of file logger.c. References __LOG_DEBUG, __LOG_DTMF, __LOG_VERBOSE, GETTID, levels, s, syslog_level_map, SYSLOG_NLEVELS, and term_strip(). Referenced by ast_log(). 00661 {
00662 char buf[BUFSIZ];
00663 char *s;
00664
00665 if (level >= SYSLOG_NLEVELS) {
00666 /* we are locked here, so cannot ast_log() */
00667 fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", level);
00668 return;
00669 }
00670 if (level == __LOG_VERBOSE) {
00671 snprintf(buf, sizeof(buf), "VERBOSE[%ld]: ", (long)GETTID());
00672 level = __LOG_DEBUG;
00673 } else if (level == __LOG_DTMF) {
00674 snprintf(buf, sizeof(buf), "DTMF[%ld]: ", (long)GETTID());
00675 level = __LOG_DEBUG;
00676 } else {
00677 snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: ",
00678 levels[level], (long)GETTID(), file, line, function);
00679 }
00680 s = buf + strlen(buf);
00681 vsnprintf(s, sizeof(buf) - strlen(buf), fmt, args);
00682 term_strip(s, s, strlen(s) + 1);
00683 syslog(syslog_level_map[level], "%s", buf);
00684 }
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||
|
Definition at line 363 of file logger.c. References ast_mutex_lock(), ast_mutex_unlock(), and qlog. Referenced by __login_exec(), action_agent_callback_login(), agent_hangup(), agent_logoff(), init_logger(), queue_exec(), reload_logger(), set_member_paused(), try_calling(), and wait_our_turn(). 00364 {
00365 va_list ap;
00366 ast_mutex_lock(&loglock);
00367 if (qlog) {
00368 va_start(ap, fmt);
00369 fprintf(qlog, "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
00370 vfprintf(qlog, fmt, ap);
00371 fprintf(qlog, "\n");
00372 va_end(ap);
00373 fflush(qlog);
00374 }
00375 ast_mutex_unlock(&loglock);
00376 }
|
|
|
Definition at line 926 of file logger.c. References ast_mutex_lock(), ast_mutex_unlock(), list, malloc, msglist::msg, verb::next, msglist::next, verb::verboser, and verboser. Referenced by ast_makesocket(), main(), and show_console(). 00927 {
00928 struct msglist *m;
00929 struct verb *tmp;
00930 /* XXX Should be more flexible here, taking > 1 verboser XXX */
00931 if ((tmp = malloc(sizeof (struct verb)))) {
00932 tmp->verboser = v;
00933 ast_mutex_lock(&msglist_lock);
00934 tmp->next = verboser;
00935 verboser = tmp;
00936 m = list;
00937 while(m) {
00938 /* Send all the existing entries that we have queued (i.e. they're likely to have missed) */
00939 v(m->msg, 0, 0, 1);
00940 m = m->next;
00941 }
00942 ast_mutex_unlock(&msglist_lock);
00943 return 0;
00944 }
00945 return -1;
00946 }
|
|
|
Definition at line 948 of file logger.c. References ast_mutex_lock(), ast_mutex_unlock(), free, verb::next, verboser, and verb::verboser. Referenced by exit_now(). 00949 {
00950 int res = -1;
00951 struct verb *tmp, *tmpl=NULL;
00952 ast_mutex_lock(&msglist_lock);
00953 tmp = verboser;
00954 while(tmp) {
00955 if (tmp->verboser == v) {
00956 if (tmpl)
00957 tmpl->next = tmp->next;
00958 else
00959 verboser = tmp->next;
00960 free(tmp);
00961 break;
00962 }
00963 tmpl = tmp;
00964 tmp = tmp->next;
00965 }
00966 if (tmp)
00967 res = 0;
00968 ast_mutex_unlock(&msglist_lock);
00969 return res;
00970 }
|
|
||||||||||||
|
|
Definition at line 912 of file logger.c. References ast_mutex_lock(), ast_mutex_unlock(), list, msglist::msg, and msglist::next. 00913 {
00914 struct msglist *m;
00915 ast_mutex_lock(&msglist_lock);
00916 m = list;
00917 while(m) {
00918 /* Send all the existing entries that we have queued (i.e. they're likely to have missed) */
00919 v(m->msg, 0, 0, 1);
00920 m = m->next;
00921 }
00922 ast_mutex_unlock(&msglist_lock);
00923 return 0;
00924 }
|
|
|
Definition at line 640 of file logger.c. References ast_mutex_lock(), ast_mutex_unlock(), free, last, list, msglist::msg, msgcnt, and msglist::next. Referenced by quit_handler(). 00641 {
00642 struct msglist *m, *tmp;
00643
00644 ast_mutex_lock(&msglist_lock);
00645 m = list;
00646 while(m) {
00647 if (m->msg) {
00648 free(m->msg);
00649 }
00650 tmp = m->next;
00651 free(m);
00652 m = tmp;
00653 }
00654 list = last = NULL;
00655 msgcnt = 0;
00656 ast_mutex_unlock(&msglist_lock);
00657 return;
00658 }
|
|
||||||||||||||||
|
Definition at line 499 of file logger.c. References ast_cli(), reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS. 00500 {
00501 if(reload_logger(0)) {
00502 ast_cli(fd, "Failed to reload the logger\n");
00503 return RESULT_FAILURE;
00504 } else
00505 return RESULT_SUCCESS;
00506 }
|
|
||||||||||||||||
|
Definition at line 508 of file logger.c. References ast_cli(), reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS. 00509 {
00510 if(reload_logger(1)) {
00511 ast_cli(fd, "Failed to reload the logger and rotate log files\n");
00512 return RESULT_FAILURE;
00513 } else
00514 return RESULT_SUCCESS;
00515 }
|
|
||||||||||||||||
|
Definition at line 519 of file logger.c. References __LOG_DEBUG, __LOG_DTMF, __LOG_ERROR, __LOG_EVENT, __LOG_NOTICE, __LOG_VERBOSE, __LOG_WARNING, ast_cli(), ast_mutex_lock(), ast_mutex_unlock(), logchannel::disabled, logchannel::filename, FORMATL, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, logchannel::next, RESULT_SUCCESS, and logchannel::type. 00520 {
00521 #define FORMATL "%-35.35s %-8.8s %-9.9s "
00522 struct logchannel *chan;
00523
00524 ast_mutex_lock(&loglock);
00525
00526 chan = logchannels;
00527 ast_cli(fd,FORMATL, "Channel", "Type", "Status");
00528 ast_cli(fd, "Configuration\n");
00529 ast_cli(fd,FORMATL, "-------", "----", "------");
00530 ast_cli(fd, "-------------\n");
00531 while (chan) {
00532 ast_cli(fd, FORMATL, chan->filename, chan->type==LOGTYPE_CONSOLE ? "Console" : (chan->type==LOGTYPE_SYSLOG ? "Syslog" : "File"),
00533 chan->disabled ? "Disabled" : "Enabled");
00534 ast_cli(fd, " - ");
00535 if (chan->logmask & (1 << __LOG_DEBUG))
00536 ast_cli(fd, "Debug ");
00537 if (chan->logmask & (1 << __LOG_DTMF))
00538 ast_cli(fd, "DTMF ");
00539 if (chan->logmask & (1 << __LOG_VERBOSE))
00540 ast_cli(fd, "Verbose ");
00541 if (chan->logmask & (1 << __LOG_WARNING))
00542 ast_cli(fd, "Warning ");
00543 if (chan->logmask & (1 << __LOG_NOTICE))
00544 ast_cli(fd, "Notice ");
00545 if (chan->logmask & (1 << __LOG_ERROR))
00546 ast_cli(fd, "Error ");
00547 if (chan->logmask & (1 << __LOG_EVENT))
00548 ast_cli(fd, "Event ");
00549 ast_cli(fd, "\n");
00550 chan = chan->next;
00551 }
00552 ast_cli(fd, "\n");
00553
00554 ast_mutex_unlock(&loglock);
00555
00556 return RESULT_SUCCESS;
00557 }
|
|
|
Definition at line 592 of file logger.c. References filesize_reload_needed. Referenced by init_logger(). 00593 {
00594 /* Indicate need to reload */
00595 filesize_reload_needed = 1;
00596 return 0;
00597 }
|
|
|
Definition at line 599 of file logger.c. References ast_cli_register(), ast_config_AST_LOG_DIR, ast_log(), ast_queue_log(), ast_verbose(), EVENTLOG, eventlog, handle_SIGXFSZ(), init_logger_chain(), LOG_ERROR, LOG_EVENT, logfiles, option_verbose, qlog, and QUEUELOG. Referenced by main(). 00600 {
00601 char tmp[256];
00602 int res = 0;
00603
00604 /* auto rotate if sig SIGXFSZ comes a-knockin */
00605 (void) signal(SIGXFSZ,(void *) handle_SIGXFSZ);
00606
00607 /* register the relaod logger cli command */
00608 ast_cli_register(&reload_logger_cli);
00609 ast_cli_register(&rotate_logger_cli);
00610 ast_cli_register(&logger_show_channels_cli);
00611
00612 mkdir((char *)ast_config_AST_LOG_DIR, 0755);
00613
00614 /* create log channels */
00615 init_logger_chain();
00616
00617 /* create the eventlog */
00618 if (logfiles.event_log) {
00619 mkdir((char *)ast_config_AST_LOG_DIR, 0755);
00620 snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG);
00621 eventlog = fopen((char *)tmp, "a");
00622 if (eventlog) {
00623 ast_log(LOG_EVENT, "Started Asterisk Event Logger\n");
00624 if (option_verbose)
00625 ast_verbose("Asterisk Event Logger Started %s\n",(char *)tmp);
00626 } else {
00627 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno));
00628 res = -1;
00629 }
00630 }
00631
00632 if (logfiles.queue_log) {
00633 snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, QUEUELOG);
00634 qlog = fopen(tmp, "a");
00635 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", "");
00636 }
00637 return res;
00638 }
|
|
|
Definition at line 289 of file logger.c. References ast_config_destroy(), ast_config_load(), ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_true(), ast_variable_browse(), ast_variable_retrieve(), cfg, dateformat, free, global_logmask, hostname, ast_variable::lineno, LOG_WARNING, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), malloc, ast_variable::name, ast_variable::next, logchannel::next, s, logchannel::type, ast_variable::value, and var. Referenced by init_logger(), and reload_logger(). 00290 {
00291 struct logchannel *chan, *cur;
00292 struct ast_config *cfg;
00293 struct ast_variable *var;
00294 char *s;
00295
00296 /* delete our list of log channels */
00297 ast_mutex_lock(&loglock);
00298 chan = logchannels;
00299 while (chan) {
00300 cur = chan->next;
00301 free(chan);
00302 chan = cur;
00303 }
00304 logchannels = NULL;
00305 ast_mutex_unlock(&loglock);
00306
00307 global_logmask = 0;
00308 /* close syslog */
00309 closelog();
00310
00311 cfg = ast_config_load("logger.conf");
00312
00313 /* If no config file, we're fine, set default options. */
00314 if (!cfg) {
00315 fprintf(stderr, "Unable to open logger.conf: %s\n", strerror(errno));
00316 chan = malloc(sizeof(struct logchannel));
00317 memset(chan, 0, sizeof(struct logchannel));
00318 chan->type = LOGTYPE_CONSOLE;
00319 chan->logmask = 28; /*warning,notice,error */
00320 chan->next = logchannels;
00321 logchannels = chan;
00322 global_logmask |= chan->logmask;
00323 return;
00324 }
00325
00326 ast_mutex_lock(&loglock);
00327 if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) {
00328 if(ast_true(s)) {
00329 if(gethostname(hostname, sizeof(hostname)-1)) {
00330 ast_copy_string(hostname, "unknown", sizeof(hostname));
00331 ast_log(LOG_WARNING, "What box has no hostname???\n");
00332 }
00333 } else
00334 hostname[0] = '\0';
00335 } else
00336 hostname[0] = '\0';
00337 if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) {
00338 ast_copy_string(dateformat, s, sizeof(dateformat));
00339 } else
00340 ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat));
00341 if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) {
00342 logfiles.queue_log = ast_true(s);
00343 }
00344 if ((s = ast_variable_retrieve(cfg, "general", "event_log"))) {
00345 logfiles.event_log = ast_true(s);
00346 }
00347
00348 var = ast_variable_browse(cfg, "logfiles");
00349 while(var) {
00350 chan = make_logchannel(var->name, var->value, var->lineno);
00351 if (chan) {
00352 chan->next = logchannels;
00353 logchannels = chan;
00354 global_logmask |= chan->logmask;
00355 }
00356 var = var->next;
00357 }
00358
00359 ast_config_destroy(cfg);
00360 ast_mutex_unlock(&loglock);
00361 }
|
|
||||||||||||
|
Definition at line 141 of file logger.c. References __LOG_DEBUG, __LOG_DTMF, __LOG_ERROR, __LOG_EVENT, __LOG_NOTICE, __LOG_VERBOSE, __LOG_WARNING, and strsep(). Referenced by make_logchannel(). 00142 {
00143 char *w;
00144 int res = 0;
00145 char *stringp=NULL;
00146 stringp=s;
00147 w = strsep(&stringp, ",");
00148 while(w) {
00149 while(*w && (*w < 33))
00150 w++;
00151 if (!strcasecmp(w, "error"))
00152 res |= (1 << __LOG_ERROR);
00153 else if (!strcasecmp(w, "warning"))
00154 res |= (1 << __LOG_WARNING);
00155 else if (!strcasecmp(w, "notice"))
00156 res |= (1 << __LOG_NOTICE);
00157 else if (!strcasecmp(w, "event"))
00158 res |= (1 << __LOG_EVENT);
00159 else if (!strcasecmp(w, "debug"))
00160 res |= (1 << __LOG_DEBUG);
00161 else if (!strcasecmp(w, "verbose"))
00162 res |= (1 << __LOG_VERBOSE);
00163 else if (!strcasecmp(w, "dtmf"))
00164 res |= (1 << __LOG_DTMF);
00165 else {
00166 fprintf(stderr, "Logfile Warning: Unknown keyword '%s' at line %d of logger.conf\n", w, lineno);
00167 }
00168 w = strsep(&stringp, ",");
00169 }
00170 return res;
00171 }
|
|
||||||||||||||||
|
Definition at line 173 of file logger.c. References ast_config_AST_LOG_DIR, ast_strlen_zero(), logchannel::facility, free, hostname, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, make_components(), and malloc. Referenced by init_logger_chain(). 00174 {
00175 struct logchannel *chan;
00176 char *facility;
00177 #ifndef SOLARIS
00178 CODE *cptr;
00179 #endif
00180
00181 if (ast_strlen_zero(channel))
00182 return NULL;
00183 chan = malloc(sizeof(struct logchannel));
00184
00185 if (!chan) /* Can't allocate memory */
00186 return NULL;
00187
00188 memset(chan, 0, sizeof(struct logchannel));
00189 if (!strcasecmp(channel, "console")) {
00190 chan->type = LOGTYPE_CONSOLE;
00191 } else if (!strncasecmp(channel, "syslog", 6)) {
00192 /*
00193 * syntax is:
00194 * syslog.facility => level,level,level
00195 */
00196 facility = strchr(channel, '.');
00197 if(!facility++ || !facility) {
00198 facility = "local0";
00199 }
00200
00201 #ifndef SOLARIS
00202 /*
00203 * Walk through the list of facilitynames (defined in sys/syslog.h)
00204 * to see if we can find the one we have been given
00205 */
00206 chan->facility = -1;
00207 cptr = facilitynames;
00208 while (cptr->c_name) {
00209 if (!strcasecmp(facility, cptr->c_name)) {
00210 chan->facility = cptr->c_val;
00211 break;
00212 }
00213 cptr++;
00214 }
00215 #else
00216 chan->facility = -1;
00217 if (!strcasecmp(facility, "kern"))
00218 chan->facility = LOG_KERN;
00219 else if (!strcasecmp(facility, "USER"))
00220 chan->facility = LOG_USER;
00221 else if (!strcasecmp(facility, "MAIL"))
00222 chan->facility = LOG_MAIL;
00223 else if (!strcasecmp(facility, "DAEMON"))
00224 chan->facility = LOG_DAEMON;
00225 else if (!strcasecmp(facility, "AUTH"))
00226 chan->facility = LOG_AUTH;
00227 else if (!strcasecmp(facility, "SYSLOG"))
00228 chan->facility = LOG_SYSLOG;
00229 else if (!strcasecmp(facility, "LPR"))
00230 chan->facility = LOG_LPR;
00231 else if (!strcasecmp(facility, "NEWS"))
00232 chan->facility = LOG_NEWS;
00233 else if (!strcasecmp(facility, "UUCP"))
00234 chan->facility = LOG_UUCP;
00235 else if (!strcasecmp(facility, "CRON"))
00236 chan->facility = LOG_CRON;
00237 else if (!strcasecmp(facility, "LOCAL0"))
00238 chan->facility = LOG_LOCAL0;
00239 else if (!strcasecmp(facility, "LOCAL1"))
00240 chan->facility = LOG_LOCAL1;
00241 else if (!strcasecmp(facility, "LOCAL2"))
00242 chan->facility = LOG_LOCAL2;
00243 else if (!strcasecmp(facility, "LOCAL3"))
00244 chan->facility = LOG_LOCAL3;
00245 else if (!strcasecmp(facility, "LOCAL4"))
00246 chan->facility = LOG_LOCAL4;
00247 else if (!strcasecmp(facility, "LOCAL5"))
00248 chan->facility = LOG_LOCAL5;
00249 else if (!strcasecmp(facility, "LOCAL6"))
00250 chan->facility = LOG_LOCAL6;
00251 else if (!strcasecmp(facility, "LOCAL7"))
00252 chan->facility = LOG_LOCAL7;
00253 #endif /* Solaris */
00254
00255 if (0 > chan->facility) {
00256 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
00257 free(chan);
00258 return NULL;
00259 }
00260
00261 chan->type = LOGTYPE_SYSLOG;
00262 snprintf(chan->filename, sizeof(chan->filename), "%s", channel);
00263 openlog("asterisk", LOG_PID, chan->facility);
00264 } else {
00265 if (channel[0] == '/') {
00266 if(!ast_strlen_zero(hostname)) {
00267 snprintf(chan->filename, sizeof(chan->filename) - 1,"%s.%s", channel, hostname);
00268 } else {
00269 ast_copy_string(chan->filename, channel, sizeof(chan->filename));
00270 }
00271 }
00272
00273 if(!ast_strlen_zero(hostname)) {
00274 snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s",(char *)ast_config_AST_LOG_DIR, channel, hostname);
00275 } else {
00276 snprintf(chan->filename, sizeof(chan->filename), "%s/%s", (char *)ast_config_AST_LOG_DIR, channel);
00277 }
00278 chan->fileptr = fopen(chan->filename, "a");
00279 if (!chan->fileptr) {
00280 /* Can't log here, since we're called with a lock */
00281 fprintf(stderr, "Logger Warning: Unable to open log file '%s': %s\n", chan->filename, strerror(errno));
00282 }
00283 chan->type = LOGTYPE_FILE;
00284 }
00285 chan->logmask = make_components(components, lineno);
00286 return chan;
00287 }
|
|
|
Definition at line 378 of file logger.c. References ast_config_AST_LOG_DIR, AST_CONFIG_MAX_PATH, ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_queue_log(), ast_verbose(), logchannel::disabled, EVENT_FLAG_SYSTEM, eventlog, EVENTLOG, logchannel::filename, logchannel::fileptr, filesize_reload_needed, init_logger_chain(), LOG_ERROR, LOG_EVENT, logfiles, manager_event(), logchannel::next, option_verbose, qlog, and QUEUELOG. Referenced by ast_log(), handle_logger_reload(), handle_logger_rotate(), and main(). 00379 {
00380 char old[AST_CONFIG_MAX_PATH] = "";
00381 char new[AST_CONFIG_MAX_PATH];
00382 int event_rotate = rotate, queue_rotate = rotate;
00383 struct logchannel *f;
00384 FILE *myf;
00385 int x, res = 0;
00386
00387 ast_mutex_lock(&msglist_lock); /* to avoid deadlock */
00388 ast_mutex_lock(&loglock);
00389 if (eventlog)
00390 fclose(eventlog);
00391 else
00392 event_rotate = 0;
00393 eventlog = NULL;
00394
00395 if (qlog)
00396 fclose(qlog);
00397 else
00398 queue_rotate = 0;
00399 qlog = NULL;
00400
00401 mkdir((char *)ast_config_AST_LOG_DIR, 0755);
00402
00403 f = logchannels;
00404 while(f) {
00405 if (f->disabled) {
00406 f->disabled = 0; /* Re-enable logging at reload */
00407 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename);
00408 }
00409 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
00410 fclose(f->fileptr); /* Close file */
00411 f->fileptr = NULL;
00412 if(rotate) {
00413 ast_copy_string(old, f->filename, sizeof(old));
00414
00415 for(x=0;;x++) {
00416 snprintf(new, sizeof(new), "%s.%d", f->filename, x);
00417 myf = fopen((char *)new, "r");
00418 if (myf) {
00419 fclose(myf);
00420 } else {
00421 break;
00422 }
00423 }
00424
00425 /* do it */
00426 if (rename(old,new))
00427 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new);
00428 }
00429 }
00430 f = f->next;
00431 }
00432
00433 filesize_reload_needed = 0;
00434
00435 init_logger_chain();
00436
00437 if (logfiles.event_log) {
00438 snprintf(old, sizeof(old), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG);
00439 if (event_rotate) {
00440 for (x=0;;x++) {
00441 snprintf(new, sizeof(new), "%s/%s.%d", (char *)ast_config_AST_LOG_DIR, EVENTLOG,x);
00442 myf = fopen((char *)new, "r");
00443 if (myf) /* File exists */
00444 fclose(myf);
00445 else
00446 break;
00447 }
00448
00449 /* do it */
00450 if (rename(old,new))
00451 ast_log(LOG_ERROR, "Unable to rename file '%s' to '%s'\n", old, new);
00452 }
00453
00454 eventlog = fopen(old, "a");
00455 if (eventlog) {
00456 ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n");
00457 if (option_verbose)
00458 ast_verbose("Asterisk Event Logger restarted\n");
00459 } else {
00460 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno));
00461 res = -1;
00462 }
00463 }
00464
00465 if (logfiles.queue_log) {
00466 snprintf(old, sizeof(old), "%s/%s", (char *)ast_config_AST_LOG_DIR, QUEUELOG);
00467 if (queue_rotate) {
00468 for (x = 0; ; x++) {
00469 snprintf(new, sizeof(new), "%s/%s.%d", (char *)ast_config_AST_LOG_DIR, QUEUELOG, x);
00470 myf = fopen((char *)new, "r");
00471 if (myf) /* File exists */
00472 fclose(myf);
00473 else
00474 break;
00475 }
00476
00477 /* do it */
00478 if (rename(old, new))
00479 ast_log(LOG_ERROR, "Unable to rename file '%s' to '%s'\n", old, new);
00480 }
00481
00482 qlog = fopen(old, "a");
00483 if (qlog) {
00484 ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", "");
00485 ast_log(LOG_EVENT, "Restarted Asterisk Queue Logger\n");
00486 if (option_verbose)
00487 ast_verbose("Asterisk Queue Logger restarted\n");
00488 } else {
00489 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
00490 res = -1;
00491 }
00492 }
00493 ast_mutex_unlock(&loglock);
00494 ast_mutex_unlock(&msglist_lock);
00495
00496 return res;
00497 }
|
|
|
Definition at line 131 of file logger.c. Referenced by ast_log(). |
|
|
Definition at line 79 of file logger.c. Referenced by ast_log(), ast_verbose(), and init_logger_chain(). |
|
|
|
|
|
Definition at line 118 of file logger.c. Referenced by ast_log(), init_logger(), and reload_logger(). |
|
|
Definition at line 83 of file logger.c. Referenced by ast_log(), handle_SIGXFSZ(), and reload_logger(). |
|
|
Definition at line 84 of file logger.c. Referenced by ast_log(), and init_logger_chain(). |
|
|
Definition at line 96 of file logger.c. Referenced by ast_remotecontrol(), cli_prompt(), iax2_register(), init_logger_chain(), main(), make_logchannel(), mssql_connect(), netconsole(), set_destination(), sip_register(), tds_load_module(), and tds_unload_module(). |
|
|
|
Definition at line 121 of file logger.c. Referenced by ast_log(), and ast_log_vsyslog(). |
|
|
|
|
|
|
|
|
Referenced by ast_log(), init_logger(), init_logger_chain(), and reload_logger(). |
|
|
Initial value: "Usage: logger reload\n" " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n" |
|
|
Initial value: "Usage: logger rotate\n" " Rotates and Reopens the log files.\n" |
|
|
Initial value:
{ { "logger", "show", "channels", NULL },
handle_logger_show_channels, "List configured log channels",
logger_show_channels_help }
|
|
|
Initial value: "Usage: logger show channels\n" " Show configured logger channels.\n" |
|
|
Definition at line 116 of file logger.c. Referenced by ast_verbose(), and close_logger(). |
|
|
Definition at line 119 of file logger.c. Referenced by ast_queue_log(), init_logger(), and reload_logger(). |
|
|
|
|
|
Initial value:
{ { "logger", "reload", NULL },
handle_logger_reload, "Reopens the log files",
logger_reload_help }
|
|
|
Initial value:
{ { "logger", "rotate", NULL },
handle_logger_rotate, "Rotates and reopens the log files",
logger_rotate_help }
|
|
|
Definition at line 44 of file logger.c. Referenced by ast_log_vsyslog(). |
|
|
Referenced by ast_register_verbose(), ast_unregister_verbose(), ast_verbose(), exit_now(), and show_console(). |
1.4.2