#include <stdarg.h>#include <stdio.h>#include <unistd.h>#include <time.h>#include <asterisk/lock.h>#include <asterisk/logger.h>#include <asterisk/options.h>#include <asterisk/channel.h>#include <asterisk/config.h>#include <asterisk/term.h>#include <string.h>#include <stdlib.h>#include <errno.h>#include <pthread.h>#include <sys/stat.h>#include "asterisk.h"#include "astconf.h"Go to the source code of this file.
Data Structures | |
| struct | logfile |
| struct | msglist |
| struct | verb |
Defines | |
| #define | MAX_MSG_QUEUE 200 |
Functions | |
| int | init_logger (void) |
| int | reload_logger (void) |
| void | ast_log (int level, const char *file, int line, const char *function, const char *fmt,...) |
| Used for sending a log message. | |
| void | ast_verbose (const char *fmt,...) |
| Send a verbose message (based on verbose level). | |
| 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 32 of file logger.c. Referenced by ast_verbose(). |
|
||||||||||||||||||||||||||||
|
Used for sending a log message. Cannot use ast_log() from locked section of ast_log()! ast_log(LOG_WARNING, "Unable to retrieve local time?\n"); * Definition at line 222 of file logger.c. References ast_mutex_lock, ast_mutex_unlock, COLOR_BRWHITE, option_debug, option_verbose, and term_color().
00223 {
00224 char date[256];
00225 char tmp[80];
00226 char tmp2[80];
00227 char tmp3[80];
00228 char tmp4[80];
00229 char linestr[80];
00230 time_t t;
00231 struct tm tm;
00232 struct logfile *f;
00233
00234 va_list ap;
00235 if (!option_verbose && !option_debug && (!level)) {
00236 return;
00237 }
00238 ast_mutex_lock(&loglock);
00239 if (level == 1 /* Event */) {
00240 time(&t);
00241 localtime_r(&t,&tm);
00242 if (&tm) {
00243 /* Log events into the event log file, with a different format */
00244 strftime(date, sizeof(date), "%b %e %T", &tm);
00245 fprintf(eventlog, "%s asterisk[%d]: ", date, getpid());
00246 va_start(ap, fmt);
00247 vfprintf(eventlog, fmt, ap);
00248 va_end(ap);
00249 fflush(eventlog);
00250 } else
00251 /** Cannot use ast_log() from locked section of ast_log()!
00252 ast_log(LOG_WARNING, "Unable to retrieve local time?\n"); **/
00253 fprintf(stderr, "ast_log: Unable to retrieve local time for %ld?\n", (long)t);
00254 } else {
00255 if (logfiles) {
00256 f = logfiles;
00257 while(f) {
00258 if (f->logflags & (1 << level) && f->f) {
00259 if ((f->f != stdout) && (f->f != stderr)) {
00260 time(&t);
00261 localtime_r(&t,&tm);
00262 strftime(date, sizeof(date), "%b %e %T", &tm);
00263 fprintf(f->f, "%s %s[%ld]: File %s, Line %d (%s): ", date, levels[level], (long)pthread_self(), file, line, function);
00264 } else {
00265 sprintf(linestr, "%d", line);
00266 fprintf(f->f, "%s[%ld]: File %s, Line %s (%s): ",
00267 term_color(tmp, levels[level], colors[level], 0, sizeof(tmp)),
00268 (long)pthread_self(),
00269 term_color(tmp2, file, COLOR_BRWHITE, 0, sizeof(tmp2)),
00270 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
00271 term_color(tmp4, function, COLOR_BRWHITE, 0, sizeof(tmp4)));
00272 }
00273 va_start(ap, fmt);
00274 vfprintf(f->f, fmt, ap);
00275 va_end(ap);
00276 fflush(f->f);
00277 }
00278 f = f->next;
00279 }
00280 } else {
00281 fprintf(stdout, "%s[%ld]: File %s, Line %d (%s): ", levels[level], (long)pthread_self(), file, line, function);
00282 va_start(ap, fmt);
00283 vfprintf(stdout, fmt, ap);
00284 va_end(ap);
00285 fflush(stdout);
00286 }
00287 }
00288 ast_mutex_unlock(&loglock);
00289 }
|
|
|
Definition at line 366 of file logger.c. References ast_mutex_lock, ast_mutex_unlock, and malloc. Referenced by main().
00367 {
00368 struct msglist *m;
00369 struct verb *tmp;
00370 /* XXX Should be more flexible here, taking > 1 verboser XXX */
00371 if ((tmp = malloc(sizeof (struct verb)))) {
00372 tmp->verboser = v;
00373 ast_mutex_lock(&msglist_lock);
00374 tmp->next = verboser;
00375 verboser = tmp;
00376 m = list;
00377 while(m) {
00378 /* Send all the existing entries that we have queued (i.e. they're likely to have missed) */
00379 v(m->msg, 0, 0, 1);
00380 m = m->next;
00381 }
00382 ast_mutex_unlock(&msglist_lock);
00383 return 0;
00384 }
00385 return -1;
00386 }
|
|
|
Definition at line 388 of file logger.c. References ast_mutex_lock, ast_mutex_unlock, and free.
00389 {
00390 int res = -1;
00391 struct verb *tmp, *tmpl=NULL;
00392 ast_mutex_lock(&msglist_lock);
00393 tmp = verboser;
00394 while(tmp) {
00395 if (tmp->verboser == v) {
00396 if (tmpl)
00397 tmpl->next = tmp->next;
00398 else
00399 verboser = tmp->next;
00400 free(tmp);
00401 break;
00402 }
00403 tmpl = tmp;
00404 tmp = tmp->next;
00405 }
00406 if (tmp)
00407 res = 0;
00408 ast_mutex_unlock(&msglist_lock);
00409 return res;
00410 }
|
|
||||||||||||
|
Send a verbose message (based on verbose level). This works like ast_log, but prints verbose messages to the console depending on verbosity level set. ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing"); This will print the message to the console if the verbose level is set to a level >= 3 Note the abscence of a comma after the VERBOSE_PREFIX_3. This is important. VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined. Definition at line 291 of file logger.c. References ast_log(), ast_mutex_lock, ast_mutex_unlock, free, LOG_DEBUG, malloc, MAX_MSG_QUEUE, and strdup.
00292 {
00293 static char stuff[4096];
00294 static int pos = 0, opos;
00295 static int replacelast = 0, complete;
00296 struct msglist *m;
00297 struct verb *v;
00298 va_list ap;
00299 va_start(ap, fmt);
00300 ast_mutex_lock(&msglist_lock);
00301 vsnprintf(stuff + pos, sizeof(stuff) - pos, fmt, ap);
00302 opos = pos;
00303 pos = strlen(stuff);
00304 if (fmt[strlen(fmt)-1] == '\n')
00305 complete = 1;
00306 else
00307 complete=0;
00308 if (complete) {
00309 if (msgcnt < MAX_MSG_QUEUE) {
00310 /* Allocate new structure */
00311 m = malloc(sizeof(struct msglist));
00312 msgcnt++;
00313 } else {
00314 /* Recycle the oldest entry */
00315 m = list;
00316 list = list->next;
00317 free(m->msg);
00318 }
00319 if (m) {
00320 m->msg = strdup(stuff);
00321 if (m->msg) {
00322 if (last)
00323 last->next = m;
00324 else
00325 list = m;
00326 m->next = NULL;
00327 last = m;
00328 } else {
00329 msgcnt--;
00330 ast_log(LOG_DEBUG, "Out of memory\n");
00331 free(m);
00332 }
00333 }
00334 }
00335 if (verboser) {
00336 v = verboser;
00337 while(v) {
00338 v->verboser(stuff, opos, replacelast, complete);
00339 v = v->next;
00340 }
00341 } /* else
00342 fprintf(stdout, stuff + opos); */
00343
00344 if (fmt[strlen(fmt)-1] != '\n')
00345 replacelast = 1;
00346 else
00347 replacelast = pos = 0;
00348 va_end(ap);
00349 ast_mutex_unlock(&msglist_lock);
00350 }
|
|
|
Definition at line 352 of file logger.c. References ast_mutex_lock, and ast_mutex_unlock.
00353 {
00354 struct msglist *m;
00355 m = list;
00356 ast_mutex_lock(&msglist_lock);
00357 while(m) {
00358 /* Send all the existing entries that we have queued (i.e. they're likely to have missed) */
00359 v(m->msg, 0, 0, 1);
00360 m = m->next;
00361 }
00362 ast_mutex_unlock(&msglist_lock);
00363 return 0;
00364 }
|
|
|
Definition at line 181 of file logger.c. References ast_config_AST_LOG_DIR, AST_CONFIG_MAX_PATH, ast_log(), ast_verbose(), EVENTLOG, LOG_ERROR, LOG_EVENT, and option_verbose. Referenced by main().
00182 {
00183 char tmp[AST_CONFIG_MAX_PATH];
00184 mkdir((char *)ast_config_AST_LOG_DIR, 0755);
00185 snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG);
00186 eventlog = fopen((char *)tmp, "a");
00187 if (eventlog) {
00188 init_logger_chain();
00189 ast_log(LOG_EVENT, "Started Asterisk Event Logger\n");
00190 if (option_verbose)
00191 ast_verbose("Asterisk Event Logger Started %s\n",(char *)tmp);
00192 return 0;
00193 } else
00194 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno));
00195 init_logger_chain();
00196 return -1;
00197 }
|
|
|
Definition at line 199 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.
00200 {
00201 char tmp[AST_CONFIG_MAX_PATH];
00202 ast_mutex_lock(&loglock);
00203 if (eventlog)
00204 fclose(eventlog);
00205 mkdir((char *)ast_config_AST_LOG_DIR, 0755);
00206 snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG);
00207 eventlog = fopen((char *)tmp, "a");
00208 ast_mutex_unlock(&loglock);
00209
00210 if (eventlog) {
00211 init_logger_chain();
00212 ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n");
00213 if (option_verbose)
00214 ast_verbose("Asterisk Event Logger restarted\n");
00215 return 0;
00216 } else
00217 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno));
00218 init_logger_chain();
00219 return -1;
00220 }
|
1.3.4