Asterisk Logger. More...
#include "asterisk.h"
#include <syslog.h>
#include "asterisk/_private.h"
#include "asterisk/paths.h"
#include "asterisk/logger.h"
#include "asterisk/lock.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 "asterisk/threadstorage.h"
#include "asterisk/strings.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include <signal.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <execinfo.h>
Go to the source code of this file.
Data Structures | |
struct | logchannel |
struct | logchannels |
struct | logmsg |
struct | logmsgs |
struct | verb |
struct | verbosers |
Defines | |
#define | FORMATL "%-35.35s %-8.8s %-9.9s " |
#define | GETTID() getpid() |
#define | LOG_BUF_INIT_SIZE 256 |
#define | MAX_BACKTRACE_FRAMES 20 |
#define | VERBOSE_BUF_INIT_SIZE 256 |
Enumerations | |
enum | logmsgtypes { LOGMSG_NORMAL = 0, LOGMSG_VERBOSE } |
enum | logtypes { LOGTYPE_SYSLOG, LOGTYPE_FILE, LOGTYPE_CONSOLE } |
enum | rotatestrategy { SEQUENTIAL = 1 << 0, ROTATE = 1 << 1, TIMESTAMP = 1 << 2 } |
Functions | |
void | __ast_verbose (const char *file, int line, const char *func, const char *fmt,...) |
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. | |
void | __ast_verbose_ap (const char *file, int line, const char *func, const char *fmt, va_list ap) |
static void | __init_log_buf (void) |
static void | __init_verbose_buf (void) |
static void | _handle_SIGXFSZ (int sig) |
void | ast_backtrace (void) |
struct ast_bt * | ast_bt_create (void) |
void * | ast_bt_destroy (struct ast_bt *bt) |
int | ast_bt_get_addresses (struct ast_bt *bt) |
char ** | ast_bt_get_symbols (void **addresses, size_t num_frames) |
void | ast_child_verbose (int level, const char *fmt,...) |
void | ast_log (int level, const char *file, int line, const char *function, const char *fmt,...) |
send log messages to syslog and/or the console | |
static void | ast_log_vsyslog (struct logmsg *msg) |
int | ast_logger_register_level (const char *name) |
Register a new logger level. | |
void | ast_logger_unregister_level (const char *name) |
Unregister a previously registered logger level. | |
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 | ast_unregister_verbose (void(*v)(const char *string)) |
void | ast_verbose (const char *fmt,...) |
void | close_logger (void) |
static char * | handle_logger_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_rotate (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_set_level (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_logger_show_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
CLI command to show logging system configuration. | |
int | init_logger (void) |
static void | init_logger_chain (int locked) |
static void | logger_print_normal (struct logmsg *logmsg) |
Print a normal log message to the channels. | |
static void | logger_queue_init (void) |
static int | logger_queue_restart (int queue_rotate) |
static int | logger_queue_rt_start (void) |
int | logger_reload (void) |
Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload). | |
static void * | logger_thread (void *data) |
Actual logging thread. | |
static unsigned int | make_components (const char *s, int lineno) |
static struct logchannel * | make_logchannel (const char *channel, const char *components, int lineno) |
static int | reload_logger (int rotate) |
static int | rotate_file (const char *filename) |
static void | update_logchannels (void) |
Variables | |
static struct ast_cli_entry | cli_logger [] |
static int | close_logger_thread = 0 |
static const int | colors [NUMLOGLEVELS] |
Colors used in the console for logging. | |
static char | dateformat [256] = "%b %e %T" |
static char | exec_after_rotate [256] = "" |
static int | filesize_reload_needed |
static unsigned int | global_logmask = 0xFFFF |
static struct sigaction | handle_SIGXFSZ |
static char | hostname [MAXHOSTNAMELEN] |
static char * | levels [NUMLOGLEVELS] |
Logging channels used in the Asterisk logging system. | |
static struct ast_threadstorage | log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , } |
static ast_cond_t | logcond |
struct { | |
unsigned int queue_adaptive_realtime:1 | |
unsigned int queue_log:1 | |
unsigned int queue_log_to_file:1 | |
} | logfiles |
static int | logger_initialized |
static pthread_t | logthread = AST_PTHREADT_NULL |
static FILE * | qlog |
static char | queue_log_name [256] = QUEUELOG |
static int | queuelog_init |
static struct ast_threadstorage | verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } |
Asterisk Logger.
Logging routines
Definition in file logger.c.
#define FORMATL "%-35.35s %-8.8s %-9.9s " |
Referenced by handle_logger_show_channels().
#define VERBOSE_BUF_INIT_SIZE 256 |
Definition at line 216 of file logger.c.
Referenced by __ast_verbose_ap().
enum logmsgtypes |
Definition at line 131 of file logger.c.
00131 { 00132 LOGMSG_NORMAL = 0, 00133 LOGMSG_VERBOSE, 00134 };
enum logtypes |
Definition at line 102 of file logger.c.
00102 { 00103 LOGTYPE_SYSLOG, 00104 LOGTYPE_FILE, 00105 LOGTYPE_CONSOLE, 00106 };
enum rotatestrategy |
Definition at line 88 of file logger.c.
00088 { 00089 SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */ 00090 ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */ 00091 TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */ 00092 } rotatestrategy = SEQUENTIAL;
void __ast_verbose | ( | const char * | file, | |
int | line, | |||
const char * | func, | |||
const char * | fmt, | |||
... | ||||
) |
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.
Send a verbose message (based on verbose level)
Definition at line 1554 of file logger.c.
References __ast_verbose_ap().
01555 { 01556 va_list ap; 01557 01558 va_start(ap, fmt); 01559 __ast_verbose_ap(file, line, func, fmt, ap); 01560 va_end(ap); 01561 }
void __ast_verbose_ap | ( | const char * | file, | |
int | line, | |||
const char * | func, | |||
const char * | fmt, | |||
va_list | ap | |||
) |
Definition at line 1518 of file logger.c.
References __LOG_VERBOSE, ast_alloca, AST_DYNSTR_BUILD_FAILED, ast_localtime(), ast_log(), ast_opt_timestamp, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_tvnow(), verbose_buf, and VERBOSE_BUF_INIT_SIZE.
Referenced by __ast_verbose(), and ast_verbose().
01519 { 01520 struct ast_str *buf = NULL; 01521 int res = 0; 01522 01523 if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) 01524 return; 01525 01526 if (ast_opt_timestamp) { 01527 struct timeval now; 01528 struct ast_tm tm; 01529 char date[40]; 01530 char *datefmt; 01531 01532 now = ast_tvnow(); 01533 ast_localtime(&now, &tm, NULL); 01534 ast_strftime(date, sizeof(date), dateformat, &tm); 01535 datefmt = ast_alloca(strlen(date) + 3 + strlen(fmt) + 1); 01536 sprintf(datefmt, "%c[%s] %s", 127, date, fmt); 01537 fmt = datefmt; 01538 } else { 01539 char *tmp = ast_alloca(strlen(fmt) + 2); 01540 sprintf(tmp, "%c%s", 127, fmt); 01541 fmt = tmp; 01542 } 01543 01544 /* Build string */ 01545 res = ast_str_set_va(&buf, 0, fmt, ap); 01546 01547 /* If the build failed then we can drop this allocated message */ 01548 if (res == AST_DYNSTR_BUILD_FAILED) 01549 return; 01550 01551 ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf)); 01552 }
static void _handle_SIGXFSZ | ( | int | sig | ) | [static] |
Definition at line 941 of file logger.c.
00942 { 00943 /* Indicate need to reload */ 00944 filesize_reload_needed = 1; 00945 }
void ast_backtrace | ( | void | ) |
Definition at line 1488 of file logger.c.
References ast_bt::addresses, ast_bt_create(), ast_bt_destroy(), ast_bt_get_symbols(), ast_debug, ast_log(), free, LOG_DEBUG, LOG_WARNING, and ast_bt::num_frames.
01489 { 01490 #ifdef HAVE_BKTR 01491 struct ast_bt *bt; 01492 int i = 0; 01493 char **strings; 01494 01495 if (!(bt = ast_bt_create())) { 01496 ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n"); 01497 return; 01498 } 01499 01500 if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) { 01501 ast_debug(1, "Got %d backtrace record%c\n", bt->num_frames, bt->num_frames != 1 ? 's' : ' '); 01502 for (i = 3; i < bt->num_frames - 2; i++) { 01503 ast_log(LOG_DEBUG, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]); 01504 } 01505 01506 /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */ 01507 #undef free 01508 free(strings); 01509 } else { 01510 ast_debug(1, "Could not allocate memory for backtrace\n"); 01511 } 01512 ast_bt_destroy(bt); 01513 #else 01514 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n"); 01515 #endif /* defined(HAVE_BKTR) */ 01516 }
struct ast_bt* ast_bt_create | ( | void | ) | [read] |
Definition at line 1308 of file logger.c.
References ast_bt::alloced, ast_bt_get_addresses(), ast_calloc, ast_log(), and LOG_ERROR.
Referenced by ast_backtrace().
01309 { 01310 struct ast_bt *bt = ast_calloc(1, sizeof(*bt)); 01311 if (!bt) { 01312 ast_log(LOG_ERROR, "Unable to allocate memory for backtrace structure!\n"); 01313 return NULL; 01314 } 01315 01316 bt->alloced = 1; 01317 01318 ast_bt_get_addresses(bt); 01319 01320 return bt; 01321 }
void* ast_bt_destroy | ( | struct ast_bt * | bt | ) |
Definition at line 1330 of file logger.c.
References ast_bt::alloced, and ast_free.
Referenced by ast_backtrace().
int ast_bt_get_addresses | ( | struct ast_bt * | bt | ) |
Definition at line 1323 of file logger.c.
References ast_bt::addresses, AST_MAX_BT_FRAMES, and ast_bt::num_frames.
Referenced by __ast_cond_timedwait(), __ast_cond_wait(), __ast_pthread_mutex_lock(), __ast_pthread_mutex_trylock(), __ast_rwlock_rdlock(), __ast_rwlock_timedrdlock(), __ast_rwlock_timedwrlock(), __ast_rwlock_tryrdlock(), __ast_rwlock_trywrlock(), __ast_rwlock_wrlock(), and ast_bt_create().
01324 { 01325 bt->num_frames = backtrace(bt->addresses, AST_MAX_BT_FRAMES); 01326 01327 return 0; 01328 }
char** ast_bt_get_symbols | ( | void ** | addresses, | |
size_t | num_frames | |||
) |
Definition at line 1339 of file logger.c.
References ast_calloc, ast_copy_string(), ast_free, ast_log(), ast_malloc, ast_realloc, ast_strlen_zero(), ast_utils_which(), LOG_DEBUG, and S_OR.
Referenced by ao2_bt(), and ast_backtrace().
01340 { 01341 char **strings = NULL; 01342 #if defined(BETTER_BACKTRACES) 01343 int stackfr; 01344 bfd *bfdobj; /* bfd.h */ 01345 Dl_info dli; /* dlfcn.h */ 01346 long allocsize; 01347 asymbol **syms = NULL; /* bfd.h */ 01348 bfd_vma offset; /* bfd.h */ 01349 const char *lastslash; 01350 asection *section; 01351 const char *file, *func; 01352 unsigned int line; 01353 char address_str[128]; 01354 char msg[1024]; 01355 size_t strings_size; 01356 size_t *eachlen; 01357 #endif 01358 01359 #if defined(BETTER_BACKTRACES) 01360 strings_size = num_frames * sizeof(*strings); 01361 eachlen = ast_calloc(num_frames, sizeof(*eachlen)); 01362 01363 if (!(strings = ast_calloc(num_frames, sizeof(*strings)))) { 01364 return NULL; 01365 } 01366 01367 for (stackfr = 0; stackfr < num_frames; stackfr++) { 01368 int found = 0, symbolcount; 01369 01370 msg[0] = '\0'; 01371 01372 if (!dladdr(addresses[stackfr], &dli)) { 01373 continue; 01374 } 01375 01376 if (strcmp(dli.dli_fname, "asterisk") == 0) { 01377 char asteriskpath[256]; 01378 if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) { 01379 /* This will fail to find symbols */ 01380 ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n"); 01381 dli.dli_fname = "asterisk"; 01382 } 01383 } 01384 01385 lastslash = strrchr(dli.dli_fname, '/'); 01386 if ( (bfdobj = bfd_openr(dli.dli_fname, NULL)) && 01387 bfd_check_format(bfdobj, bfd_object) && 01388 (allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 && 01389 (syms = ast_malloc(allocsize)) && 01390 (symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) { 01391 01392 if (bfdobj->flags & DYNAMIC) { 01393 offset = addresses[stackfr] - dli.dli_fbase; 01394 } else { 01395 offset = addresses[stackfr] - (void *) 0; 01396 } 01397 01398 for (section = bfdobj->sections; section; section = section->next) { 01399 if ( !bfd_get_section_flags(bfdobj, section) & SEC_ALLOC || 01400 section->vma > offset || 01401 section->size + section->vma < offset) { 01402 continue; 01403 } 01404 01405 if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) { 01406 continue; 01407 } 01408 01409 /* file can possibly be null even with a success result from bfd_find_nearest_line */ 01410 file = file ? file : ""; 01411 01412 /* Stack trace output */ 01413 found++; 01414 if ((lastslash = strrchr(file, '/'))) { 01415 const char *prevslash; 01416 for (prevslash = lastslash - 1; *prevslash != '/' && prevslash >= file; prevslash--); 01417 if (prevslash >= file) { 01418 lastslash = prevslash; 01419 } 01420 } 01421 if (dli.dli_saddr == NULL) { 01422 address_str[0] = '\0'; 01423 } else { 01424 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01425 dli.dli_saddr, 01426 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01427 } 01428 snprintf(msg, sizeof(msg), "%s:%u %s()%s", 01429 lastslash ? lastslash + 1 : file, line, 01430 S_OR(func, "???"), 01431 address_str); 01432 01433 break; /* out of section iteration */ 01434 } 01435 } 01436 if (bfdobj) { 01437 bfd_close(bfdobj); 01438 if (syms) { 01439 ast_free(syms); 01440 } 01441 } 01442 01443 /* Default output, if we cannot find the information within BFD */ 01444 if (!found) { 01445 if (dli.dli_saddr == NULL) { 01446 address_str[0] = '\0'; 01447 } else { 01448 snprintf(address_str, sizeof(address_str), " (%p+%lX)", 01449 dli.dli_saddr, 01450 (unsigned long) (addresses[stackfr] - dli.dli_saddr)); 01451 } 01452 snprintf(msg, sizeof(msg), "%s %s()%s", 01453 lastslash ? lastslash + 1 : dli.dli_fname, 01454 S_OR(dli.dli_sname, "<unknown>"), 01455 address_str); 01456 } 01457 01458 if (!ast_strlen_zero(msg)) { 01459 char **tmp; 01460 eachlen[stackfr] = strlen(msg); 01461 if (!(tmp = ast_realloc(strings, strings_size + eachlen[stackfr] + 1))) { 01462 ast_free(strings); 01463 strings = NULL; 01464 break; /* out of stack frame iteration */ 01465 } 01466 strings = tmp; 01467 strings[stackfr] = (char *) strings + strings_size; 01468 ast_copy_string(strings[stackfr], msg, eachlen[stackfr] + 1); 01469 strings_size += eachlen[stackfr] + 1; 01470 } 01471 } 01472 01473 if (strings) { 01474 /* Recalculate the offset pointers */ 01475 strings[0] = (char *) strings + num_frames * sizeof(*strings); 01476 for (stackfr = 1; stackfr < num_frames; stackfr++) { 01477 strings[stackfr] = strings[stackfr - 1] + eachlen[stackfr - 1] + 1; 01478 } 01479 } 01480 #else /* !defined(BETTER_BACKTRACES) */ 01481 strings = backtrace_symbols(addresses, num_frames); 01482 #endif /* defined(BETTER_BACKTRACES) */ 01483 return strings; 01484 }
void ast_child_verbose | ( | int | level, | |
const char * | fmt, | |||
... | ||||
) |
Definition at line 430 of file logger.c.
References ast_free, ast_malloc, and option_verbose.
Referenced by launch_script().
00431 { 00432 char *msg = NULL, *emsg = NULL, *sptr, *eptr; 00433 va_list ap, aq; 00434 int size; 00435 00436 /* Don't bother, if the level isn't that high */ 00437 if (option_verbose < level) { 00438 return; 00439 } 00440 00441 va_start(ap, fmt); 00442 va_copy(aq, ap); 00443 if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) { 00444 va_end(ap); 00445 va_end(aq); 00446 return; 00447 } 00448 va_end(ap); 00449 00450 if (!(msg = ast_malloc(size + 1))) { 00451 va_end(aq); 00452 return; 00453 } 00454 00455 vsnprintf(msg, size + 1, fmt, aq); 00456 va_end(aq); 00457 00458 if (!(emsg = ast_malloc(size * 2 + 1))) { 00459 ast_free(msg); 00460 return; 00461 } 00462 00463 for (sptr = msg, eptr = emsg; ; sptr++) { 00464 if (*sptr == '"') { 00465 *eptr++ = '\\'; 00466 } 00467 *eptr++ = *sptr; 00468 if (*sptr == '\0') { 00469 break; 00470 } 00471 } 00472 ast_free(msg); 00473 00474 fprintf(stdout, "verbose \"%s\" %d\n", emsg, level); 00475 fflush(stdout); 00476 ast_free(emsg); 00477 }
void ast_log | ( | int | level, | |
const char * | file, | |||
int | line, | |||
const char * | function, | |||
const char * | fmt, | |||
... | ||||
) |
send log messages to syslog and/or the console
Used for sending a log message This is the standard logger function. Probably the only way you will invoke it would be something like this: ast_log(AST_LOG_WHATEVER, "Problem with the %s Captain. We should get some more. Will %d be enough?\n", "flux capacitor", 10); where WHATEVER is one of ERROR, DEBUG, EVENT, NOTICE, or WARNING depending on which log you wish to output to. These are implemented as macros, that will provide the function with the needed arguments.
Definition at line 1211 of file logger.c.
References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc_with_stringfields, ast_cond_signal, AST_DYNSTR_BUILD_FAILED, ast_free, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), AST_PTHREADT_NULL, AST_RWLIST_EMPTY, ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_string_field_set, ast_tvnow(), close_logger_thread, GETTID, logmsg::level, levels, logmsg::line, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, LOGMSG_VERBOSE, logthread, option_debug, option_verbose, logmsg::process_id, term_filter_escapes(), and logmsg::type.
Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __analog_handle_event(), __analog_ss_thread(), __ast_answer(), __ast_bridge_technology_register(), __ast_channel_alloc_ap(), __ast_channel_masquerade(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_data_register(), __ast_data_unregister(), __ast_dsp_call_progress(), __ast_format_register(), __ast_http_load(), __ast_mm_init_phase_2(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_register_translator(), __ast_request_and_dial(), __ast_smoother_feed(), __ast_string_field_init(), __ast_udptl_reload(), __ast_verbose_ap(), __attempt_transmit(), __auto_congest(), __dahdi_exception(), __find_callno(), __iax2_poke_noanswer(), __init_manager(), __mgcp_xmit(), __oh323_destroy(), __oh323_new(), __oh323_rtp_create(), __oh323_update_info(), __set_address_from_contact(), __sip_autodestruct(), __sip_pretend_ack(), __sip_reliable_xmit(), __sip_xmit(), __transmit_response(), __unload_module(), _analog_get_index(), _ast_odbc_request_obj2(), _ast_sockaddr_from_sin(), _ast_sockaddr_port(), _ast_sockaddr_set_port(), _ast_sockaddr_to_sin(), _dahdi_get_index(), _dsp_init(), _enum_array_map(), _extension_match_core(), _get_mohbyname(), _lookup_timer(), _macro_exec(), _moh_register(), _sip_show_peers(), _sip_tcp_helper_thread(), _while_exec(), accept_thread(), access_counter_file(), acf_channel_read(), acf_curl_helper(), acf_curlopt_helper(), acf_curlopt_write(), acf_cut_exec(), acf_cut_exec2(), acf_faxopt_read(), acf_faxopt_write(), acf_iaxvar_write(), acf_if(), acf_isexten_exec(), acf_jabberreceive_read(), acf_jabberstatus_read(), acf_mailbox_exists(), acf_meetme_info(), acf_odbc_read(), acf_odbc_write(), acf_sort_exec(), acf_sprintf(), acf_strftime(), acf_strptime(), acf_transaction_write(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_hangup(), actual_load_config(), add_agent(), add_agi_cmd(), add_calltoken_ignore(), add_cc_call_info_to_response(), add_cfg_entry(), add_codec_to_answer(), add_content(), add_email_attachment(), add_event_to_list(), add_exten_to_pattern_tree(), add_extensions(), add_features_datastore(), add_header(), add_ie(), add_in_calls(), add_line(), add_out_calls(), add_priority(), add_publish_event(), add_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_subscribe_event(), add_to_agi(), add_user_extension(), admin_exec(), adsi_begin(), adsi_careful_send(), adsi_get_cpeid(), adsi_get_cpeinfo(), adsi_load_session(), adsi_process(), adsi_prog(), adsi_transmit_message_full(), advanced_options(), ael2_print(), aes_helper(), agent_answer(), agent_call(), agent_fixup(), agent_get_base_channel(), agent_new(), agent_read(), agentmonitoroutgoing_exec(), agi_exec_full(), aji_act_hook(), aji_client_connect(), aji_client_info_handler(), aji_create_buddy(), aji_create_client(), aji_delete_node_list(), aji_devstate_cb(), aji_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_message(), aji_handle_presence(), aji_handle_pubsub_error(), aji_handle_pubsub_event(), aji_handle_subscribe(), aji_initialize(), aji_join_exec(), aji_leave_exec(), aji_load_config(), aji_mwi_cb(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), aji_send_raw_chat(), aji_sendgroup_exec(), aji_set_group_presence(), aji_set_presence(), aji_start_sasl(), aji_status_exec(), alarmreceiver_exec(), alloc_expr_node(), alloc_resampler(), alloc_sub(), alsa_card_init(), alsa_indicate(), alsa_new(), alsa_read(), alsa_request(), alsa_write(), analog_answer(), analog_attempt_transfer(), analog_call(), analog_exception(), analog_handle_init_event(), analog_hangup(), analog_request(), analog_ss_thread(), analogsub_to_dahdisub(), announce_thread(), answer_call(), anti_injection(), aoc_append_ie(), aoc_parse_ie(), app_exec(), append_ie(), append_mailbox(), apply_general_options(), apply_option(), apply_options_full(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_adsi_install_funcs(), ast_agi_register(), ast_agi_send(), ast_agi_unregister(), ast_ais_clm_load_module(), ast_ais_clm_unload_module(), ast_ais_evt_load_module(), ast_ais_evt_unload_module(), ast_aji_create_chat(), ast_aji_invite_chat(), ast_alaw_init(), ast_aoc_create(), ast_aoc_decode(), ast_aoc_encode(), ast_app_dtget(), ast_app_group_match_get_count(), ast_app_run_macro(), ast_append_ha(), ast_apply_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_end_dtmf(), ast_bridge_timelimit(), ast_bt_create(), ast_bt_get_symbols(), ast_calendar_register(), ast_call_forward(), ast_careful_fwrite(), ast_carefulwrite(), ast_cc_get_param(), ast_cc_set_param(), ast_cdr_alloc(), ast_cdr_end(), ast_cdr_engine_init(), ast_cdr_merge(), ast_cdr_register(), ast_cdr_serialize_variables(), ast_cdr_setvar(), ast_cdr_submit_batch(), ast_cel_check_retire_linkedid(), ast_cel_fill_record(), ast_cel_get_ama_flag_name(), ast_cel_linkedid_ref(), ast_channel_audiohook_count_by_source(), ast_channel_audiohook_count_by_source_running(), ast_channel_bridge(), ast_channel_destructor(), ast_channel_log(), ast_channel_make_compatible_helper(), ast_channel_queryoption(), ast_channel_register(), ast_channel_setoption(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_check_signature(), ast_check_signature_bin(), ast_check_timing2(), ast_cli_perms_init(), ast_codec_get_len(), ast_codec_get_samples(), ast_codec_pref_getsize(), ast_config_engine_register(), ast_config_internal_load(), ast_connected_line_build_data(), ast_connected_line_parse_data(), ast_context_find_or_create(), ast_context_remove_extension_callerid2(), ast_context_verify_includes(), ast_data_get(), ast_data_retrieve(), ast_db_gettree(), ast_db_put(), ast_decrypt_bin(), ast_device_state_engine_init(), ast_do_masquerade(), ast_do_pickup(), ast_dsp_busydetect(), ast_dsp_call_progress(), ast_dsp_noise(), ast_dsp_process(), ast_dsp_silence(), ast_dtmf_stream(), ast_enable_distributed_devstate(), ast_enable_packet_fragmentation(), ast_encrypt_bin(), ast_event_cb(), ast_event_check_subscriber(), ast_event_get_cached(), ast_event_get_ie_pltype(), ast_event_get_ie_type_name(), ast_event_get_type_name(), ast_event_new(), ast_event_queue(), ast_event_queue_and_cache(), ast_event_subscribe_new(), ast_extension_close(), ast_fax_log(), ast_fax_state_to_str(), ast_filehelper(), ast_find_ourip(), ast_format_str_reduce(), ast_format_unregister(), ast_framehook_attach(), ast_func_read(), ast_func_read2(), ast_func_write(), ast_get_encoded_char(), ast_get_enum(), ast_get_group(), ast_handle_cc_control_frame(), ast_hangup(), ast_heap_create(), ast_http_get_post_vars(), ast_http_send(), ast_iax2_new(), ast_include_new(), ast_indicate_data(), ast_io_remove(), ast_ivr_menu_run_internal(), ast_jb_put(), ast_linear_stream(), ast_lock_path_flock(), ast_lock_path_lockfile(), ast_logger_register_level(), ast_makesocket(), ast_manager_register_struct(), ast_module_reload(), ast_moh_files_next(), ast_monitor_change_fname(), ast_monitor_start(), ast_monitor_stop(), ast_netsock_bindaddr(), ast_netsock_set_qos(), ast_odbc_direct_execute(), ast_odbc_find_table(), ast_odbc_prepare_and_execute(), ast_odbc_sanity_check(), ast_odbc_smart_execute(), ast_openstream_full(), ast_openvstream(), ast_ouraddrfor(), ast_parse_allow_disallow(), ast_parse_digest(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_run_app(), ast_pbx_run_args(), ast_pbx_start(), ast_pickup_call(), ast_pktccops_gate_alloc(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_queue_cc_frame(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), ast_redirecting_build_data(), ast_redirecting_parse_data(), ast_register_application2(), ast_register_feature(), ast_register_switch(), ast_remotecontrol(), ast_request(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_engine_register2(), ast_rtp_glue_register2(), ast_rtp_instance_bridge(), ast_rtp_instance_early_bridge(), ast_rtp_instance_early_bridge_make_compatible(), ast_rtp_instance_new(), ast_rtp_new(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_write(), ast_safe_fork(), ast_safe_system(), ast_say_date_with_format_da(), ast_say_date_with_format_de(), ast_say_date_with_format_en(), ast_say_date_with_format_es(), ast_say_date_with_format_fr(), ast_say_date_with_format_gr(), ast_say_date_with_format_he(), ast_say_date_with_format_it(), ast_say_date_with_format_nl(), ast_say_date_with_format_pl(), ast_say_date_with_format_pt(), ast_say_date_with_format_th(), ast_say_date_with_format_vi(), ast_say_date_with_format_zh(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_se(), ast_say_number_full_ur(), ast_say_number_full_zh(), ast_sched_del(), ast_sched_runq(), ast_sched_thread_create(), ast_search_dns(), ast_security_event_report(), ast_set_cc_offer_timer(), ast_set_cc_recall_timer(), ast_set_ccbs_available_timer(), ast_set_ccnr_available_timer(), ast_set_owners_and_peers(), ast_set_priority(), ast_set_qos(), ast_sign_bin(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_sockaddr_hash(), ast_sockaddr_parse(), ast_sockaddr_resolve(), ast_sockaddr_split_hostport(), ast_sockaddr_stringify_fmt(), ast_speech_register(), ast_srtp_add_stream(), ast_srtp_change_source(), ast_srtp_policy_alloc(), ast_srtp_protect(), ast_srtp_unprotect(), ast_stopstream(), ast_str_substitute_variables_full(), ast_streamfile(), ast_taskprocessor_get(), ast_taskprocessor_name(), ast_taskprocessor_push(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_close_session_file(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_tls_read_conf(), ast_tps_init(), ast_translate_path_steps(), ast_translator_build_path(), ast_udptl_bridge(), ast_udptl_new_with_bindaddr(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_wait_for_output(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_thread(), attempt_transfer(), au_seek(), au_trunc(), audiohook_read_frame_both(), auth_credentials(), auth_exec(), auth_http_callback(), authenticate(), authenticate_reply(), authenticate_verify(), autoservice_run(), background_detect_exec(), base64_helper(), base_encode(), blr_ebl(), blr_txt(), bridge_array_add(), bridge_call_thread(), bridge_call_thread_launch(), bridge_exec(), bridge_make_compatible(), bridge_p2p_rtp_write(), build_alias(), build_calendar(), build_callno_limits(), build_cc_interfaces_chanvar(), build_channels(), build_conf(), build_device(), build_event_channel(), build_gateway(), build_mapping(), build_parkinglot(), build_peer(), build_route(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), bump_gains(), cache_get_callno_locked(), calc_cost(), calc_metric(), calculate_far_max_ifp(), calculate_local_max_datagram(), caldav_add_event(), caldav_get_events_between(), caldav_load_calendar(), caldav_request(), caldav_write_event(), calendar_busy_exec(), calendar_devstate_change(), calendar_event_notify(), calendar_event_read(), calendar_join_attendees(), calendar_query_exec(), calendar_query_result_exec(), calendar_write_exec(), callerid_feed(), callerid_feed_jp(), callerid_get_dtmf(), callerid_read(), callerid_write(), callerpres_read(), callerpres_write(), canary_thread(), canmatch(), careful_write(), cb_events(), cc_available(), cc_caller_requested(), cc_handle_publish_error(), cccancel_exec(), cdata(), cdr_handler(), cdr_merge_vars(), chan_misdn_log(), chan_ringing(), chanavail_exec(), channel_admin_exec(), channel_spy(), channel_to_session(), chanspy_exec(), check_abstract_reference(), check_access(), check_app_args(), check_auth(), check_break(), check_compat(), check_context_names(), check_continue(), check_day(), check_dow(), check_event_type(), check_expr2_input(), check_for_conference(), check_goto(), check_header(), check_header_fmt(), check_includes(), check_key(), check_label(), check_macro_returns(), check_month(), check_password(), check_post(), check_pval_item(), check_rtp_timeout(), check_srcaddr(), check_switch_expr(), check_timerange(), check_user_full(), check_vars(), check_via(), cleanup_connection(), clear_caller(), clear_dialed_interfaces(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), cli_fax_show_session(), cli_fax_show_sessions(), close_call(), close_client(), close_mailbox(), commit_exec(), compile_script(), complete_dialplan_add_extension(), complete_dialplan_add_ignorepat(), complete_dialplan_add_include(), complete_dialplan_remove_extension(), complete_dialplan_remove_ignorepat(), complete_dialplan_remove_include(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), confbridge_exec(), config_curl(), config_device(), config_function_read(), config_handler(), config_ldap(), config_line(), config_load(), config_module(), config_odbc(), config_parse_variables(), config_pgsql(), config_text_file_load(), connectedline_read(), connectedline_write(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), cops_connect(), cops_gate_cmd(), cops_sendmsg(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), count_lines(), create_addr(), create_dirpath(), create_dynamic_parkinglot(), create_jb(), create_match_char_tree(), create_new_socket(), create_queue_member(), create_video_frame(), create_vmaccount(), crement_function_read(), crypto_load(), csv_log(), csv_quote(), custom_log(), custom_prepare(), cut_internal(), dahdi_answer(), dahdi_bridge(), dahdi_call(), dahdi_callwait(), dahdi_confmute(), dahdi_decoder_framein(), dahdi_decoder_frameout(), dahdi_digit_begin(), dahdi_disable_ec(), dahdi_enable_ec(), dahdi_encoder_framein(), dahdi_encoder_frameout(), dahdi_fake_event(), dahdi_func_write(), dahdi_handle_dtmf(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_open(), dahdi_read(), dahdi_request(), dahdi_restart(), dahdi_ring_phone(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_show_channel(), dahdi_status_data_provider_get(), dahdi_test_timer(), dahdi_timer_set_rate(), dahdi_train_ec(), dahdi_translate(), dahdi_version_data_provider_get(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dahdiscan_exec(), data_channels_provider_handler(), data_result_generate(), data_result_generate_node(), data_search_generate(), data_structure_compatible(), db_get_common(), dbinit(), deadagi_exec(), dec_init(), del_exec(), delete_old_messages(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_pval_item(), destroy_session(), destroy_trans(), determine_starting_point(), device2chan(), device_state_cb(), devstate_cache_cb(), devstate_change_collector_cb(), devstate_write(), dial_exec_full(), dial_handle_playtones(), dialgroup_read(), dialgroup_write(), dialog_ref_debug(), dictate_exec(), digitcollect(), digitdirect(), directory_exec(), disa_exec(), disable_jack_hook(), disable_t38(), dispatch_thread_handler(), display_last_error(), display_nat_warning(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_forward(), do_magic_pickup(), do_message(), do_monitor(), do_notify(), do_pktccops(), do_register(), do_reload(), do_say(), do_waiting(), dump_queue(), dump_queue_members(), dundi_answer_entity(), dundi_answer_query(), dundi_discover(), dundi_encrypt(), dundi_error_output(), dundi_exec(), dundi_helper(), dundi_lookup_internal(), dundi_precache_full(), dundi_precache_internal(), dundi_prop_precache(), dundi_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), duplicate_pseudo(), eagi_exec(), ebl_callback(), enable_jack_hook(), encode_open_type(), endelm(), enum_callback(), enum_query_read(), enum_result_read(), event_channel_destroy(), evt_event_deliver_cb(), ewscal_load_calendar(), exchangecal_get_events_between(), exchangecal_load_calendar(), exchangecal_request(), exchangecal_write_event(), exec(), exec_exec(), execif_exec(), exists(), ext_cmp_pattern_pos(), extension_matches(), extenspy_exec(), external_rtp_create(), extstate_read(), fax_generator_generate(), fax_rate_str_to_int(), fax_session_new(), fax_session_reserve(), fbuf_append(), feature_exec_app(), feature_request_and_dial(), festival_exec(), fetch_icalendar(), ffmpeg_decode(), ffmpeg_encode(), file2format(), file_read(), file_write(), filename_parse(), filestream_close(), filter(), finalize_content(), find_account(), find_cache(), find_call_locked(), find_conf(), find_conf_realtime(), find_desc(), find_details(), find_engine(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), find_or_create_details(), find_pval_goto_item(), find_queue_by_name_rt(), find_sdp(), find_speeddial_by_instance(), find_subchannel_and_lock(), find_subchannel_by_instance_reference(), find_subchannel_by_name(), find_subchannel_by_reference(), find_table(), find_transaction(), find_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), fn_wrapper(), forkcdr_exec(), forward_message(), framein(), func_args(), func_channel_read(), func_channel_write_real(), func_channels_read(), func_check_sipdomain(), func_header_read(), func_inheritance_write(), function_agent(), function_db_delete(), function_db_exists(), function_db_read(), function_db_write(), function_enum(), function_eval(), function_eval2(), function_fieldnum_helper(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g719read(), g719seek(), g719trunc(), g719write(), g723_len(), g723_read(), g723_trunc(), g723_write(), g726_read(), g726_write(), g729_read(), g729_trunc(), g729_write(), generic_execute(), generic_fax_exec(), generic_http_callback(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_calleridname(), get_canmatch_exten(), get_comma(), get_crypto_attrib(), get_destination(), get_domain(), get_ewscal_ids_for(), get_in_brackets_const(), get_in_brackets_full(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_member_penalty(), get_name_and_number(), get_params(), get_pattern_node(), get_range(), get_rdnis(), get_refer_info(), get_timerange(), get_to_address(), get_token(), get_unused_callno(), getdisplaybyname(), getflagbyname(), getkeybyname(), getstatebyname(), getsubbyname(), gosub_exec(), gosubif_exec(), goto_exten(), goto_line(), goto_line_rel(), group_count_function_read(), group_function_write(), gsm_read(), gsm_seek(), gsm_tell(), gsm_trunc(), gsm_write(), gsmtolin_framein(), gtalk_alloc(), gtalk_call(), gtalk_create_candidates(), gtalk_create_member(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_invite(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_ringing_ack(), gtalk_sendhtml(), gtalk_sendtext(), gtalk_show_channels(), gtalk_update_externip(), gtalk_update_stun(), gtalk_write(), h261_decap(), h263_decap(), h263_encap(), h263_open(), h263_read(), h263_trunc(), h263_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), h264_trunc(), h264_write(), handle_alarms(), handle_call_token(), handle_callforward_button(), handle_capabilities_res_message(), handle_cc_subscribe(), handle_clear_alarms(), handle_cli_h323_cycle_gk(), handle_cli_indication_add(), handle_cli_indication_remove(), handle_command_response(), handle_common_options(), handle_devstate_change(), handle_enbloc_call_message(), handle_error(), handle_exec(), handle_getoption(), handle_gosub(), handle_hd_hf(), handle_incoming(), handle_init_event(), handle_input(), handle_invite_replaces(), handle_jack_audio(), handle_keypad_button_message(), handle_message(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_playtones(), handle_recordfile(), handle_register_message(), handle_request(), handle_request_bye(), handle_request_info(), handle_request_invite(), handle_request_notify(), handle_request_options(), handle_request_publish(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_info(), handle_response_invite(), handle_response_message(), handle_response_notify(), handle_response_peerpoke(), handle_response_publish(), handle_response_refer(), handle_response_register(), handle_response_subscribe(), handle_response_update(), handle_soft_key_event_message(), handle_stimulus_message(), handle_t38_options(), handle_tcptls_connection(), handle_transfer_button(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hint_read(), http_post_callback(), iax2_ack_registry(), iax2_bridge(), iax2_call(), iax2_canmatch(), iax2_devicestate(), iax2_do_register(), iax2_dup_variable_datastore(), iax2_exec(), iax2_exists(), iax2_fixup(), iax2_hangup(), iax2_matchmore(), iax2_poke_peer(), iax2_prov_app(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_provision_version(), iax_template_parse(), ical_load_calendar(), icalendar_add_event(), icalendar_update_events(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), ilbc_trunc(), ilbc_write(), ilbctolin_framein(), import_ch(), in_band_indication(), increase_call_count(), init_acf_query(), init_app_class(), init_jack_data(), init_req(), init_resp(), init_timing_thread(), initialize_cc_max_requests(), initialize_udptl(), inotify_daemon(), inprocess_count(), insert_penaltychange(), inspect_module(), internal_ao2_ref(), INTERNAL_OBJ(), invent_message(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jack_hook_callback(), jack_hook_write(), jb_error_output(), jb_get_and_deliver(), jb_warning_output(), jingle_alloc(), jingle_call(), jingle_create_candidates(), jingle_create_member(), jingle_digit(), jingle_free_pvt(), jingle_handle_dtmf(), jingle_hangup_farend(), jingle_indicate(), jingle_is_answered(), jingle_load_config(), jingle_new(), jingle_newcall(), jingle_parser(), jingle_request(), jingle_sendhtml(), jingle_sendtext(), jingle_show_channels(), jingle_write(), join_conference_bridge(), join_queue(), jpeg_read_image(), jpeg_write_image(), key_call(), Keyfavorite(), kqueue_timer_open(), launch_asyncagi(), launch_ha_netscript(), launch_monitor_thread(), launch_netscript(), launch_script(), launch_service(), ldap_loadentry(), ldap_reconnect(), leave_voicemail(), linear_alloc(), linear_generator(), linear_release(), lintogsm_framein(), lintolpc10_framein(), lintoulaw(), listener(), listfilter(), load_column_config(), load_config(), load_config_meetme(), load_dynamic_module(), load_indications(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_pktccops_config(), load_resource(), load_resource_list(), load_tech_calendars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_cleanup(), local_ast_moh_start(), local_call(), local_devicestate(), local_fixup(), local_new(), local_setoption(), local_write(), log_exec(), log_jack_status(), logger_queue_init(), logger_queue_restart(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manage_parked_call(), manage_parkinglot(), manager_log(), manager_modulecheck(), manager_show_dialplan_helper(), manager_sipnotify(), map_video_codec(), masq_park_call(), matchmore(), math(), md5(), measurenoise(), meetme_menu_admin_extended(), meetmemute(), memcpy_decrypt(), memcpy_encrypt(), message_template_build(), message_template_parse_emailbody(), message_template_parse_filebody(), mgcp_call(), mgcp_fixup(), mgcp_indicate(), mgcp_new(), mgcp_reload(), mgcp_request(), mgcp_rtp_read(), mgcp_senddigit_begin(), mgcp_senddigit_end(), mgcp_ss(), mgcp_write(), mgcpsock_read(), milliwatt_generate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_delete_exec(), minivm_greet_exec(), minivm_mwi_exec(), minivm_notify_exec(), minivm_record_exec(), misdn_answer(), misdn_bridge(), misdn_call(), misdn_cfg_get(), misdn_cfg_get_config_string(), misdn_cfg_init(), misdn_cfg_is_msn_valid(), misdn_cfg_update_ptp(), misdn_check_l2l1(), misdn_digit_end(), misdn_facility_exec(), misdn_hangup(), misdn_indication(), misdn_new(), misdn_request(), misdn_send_text(), misdn_set_opt_exec(), misdn_write(), mixmonitor_exec(), mixmonitor_thread(), mkif(), mkintf(), moh_alloc(), moh_class_destructor(), moh_files_alloc(), moh_files_generator(), moh_files_release(), moh_generate(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), mssql_connect(), multicast_rtp_write(), multicast_send_control_packet(), multiplexed_bridge_create(), multiplexed_nudge(), multiplexed_thread_function(), mute_add_audiohook(), mute_fragment(), mwi_send_init(), mwi_send_process_buffer(), mwi_send_process_event(), mwi_sub_event_cb(), mwi_thread(), mwi_unsub_event_cb(), my_all_subchannels_hungup(), my_callwait(), my_dial_digits(), my_distinctive_ring(), my_dsp_set_digitmode(), my_get_callerid(), my_handle_dtmf(), my_handle_notify_message(), my_is_dialing(), my_is_off_hook(), my_send_callerid(), my_set_cadence(), my_set_waitingfordt(), my_start_cid_detect(), my_wink(), nbs_alloc(), nbs_call(), nbs_hangup(), nbs_new(), nbs_request(), nbs_xwrite(), NBScat_exec(), NBScatplay(), netconsole(), new_find_extension(), notify_new_message(), odbc_load_module(), odbc_log(), odbc_obj_connect(), odbc_obj_disconnect(), odbc_register_class(), odbc_release_obj2(), ogg_vorbis_open(), ogg_vorbis_read(), ogg_vorbis_rewrite(), ogg_vorbis_seek(), ogg_vorbis_trunc(), ogg_vorbis_write(), oh323_alloc(), oh323_call(), oh323_digit_begin(), oh323_digit_end(), oh323_fixup(), oh323_hangup(), oh323_indicate(), oh323_read(), oh323_request(), oh323_rtp_read(), oh323_set_rtp_peer(), oh323_write(), old_milliwatt_exec(), onevent(), op_colon(), op_div(), op_eq(), op_eqtilde(), op_func(), op_minus(), op_negate(), op_plus(), op_rem(), op_times(), open_mailbox(), open_stream(), OpenHistory(), originate_exec(), osp_auth(), osp_check_destination(), osp_create_callid(), osp_create_provider(), osp_create_transaction(), osp_create_uuid(), osp_load(), osp_lookup(), osp_next(), osp_uuid2str(), osp_validate_token(), osplookup_exec(), ospnext_exec(), oss_indicate(), oss_new(), oss_request(), page_exec(), park_call_exec(), park_call_full(), park_space_reserve(), parkandannounce_exec(), parked_call_exec(), parkinglot_activate(), parkinglot_activate_cb(), parkinglot_config_read(), parkinglot_is_marked_cb(), parse(), parse_apps(), parse_args(), parse_buffers_policy(), parse_config(), parse_empty_options(), parse_events(), parse_gain_value(), parse_ie(), parse_minse(), parse_moved_contact(), parse_naptr(), parse_options(), parse_register_contact(), parse_request(), parse_session_expires(), parse_srv(), parse_tag(), parse_tone_zone(), parse_via(), ParseBookmark(), parsing(), party_id_build_data(), party_id_write(), party_name_build_data(), party_name_write(), party_number_build_data(), party_number_write(), party_subaddress_build_data(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_hangup(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_saynumber(), pbx_builtin_serialize_variables(), pbx_builtin_setvar(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_exec(), pbx_extension_helper(), pbx_find_extension(), pbx_load_config(), pbx_load_module(), pbx_load_users(), pbx_parseable_goto(), pbx_substitute_variables_helper_full(), pcm_read(), pcm_seek(), pcm_trunc(), pcm_write(), peek_read(), peer_iphash_cb(), peer_set_srcaddr(), peercnt_add(), pgsql_log(), pgsql_reconnect(), phase_e_handler(), phone_call(), phone_digit_end(), phone_exception(), phone_hangup(), phone_indicate(), phone_mini_packet(), phone_new(), phone_read(), phone_request(), phone_setup(), phone_write(), phone_write_buf(), phoneprov_callback(), pickup_by_exten(), pickup_by_group(), pickup_exec(), pickupchan_exec(), pitchshift_helper(), pktccops_add_ippool(), play_message(), play_message_category(), play_message_datetime(), play_message_on_chan(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), policy_set_suite(), pop_exec(), post_raw(), powerof(), pp_each_extension_helper(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), privacy_exec(), private_enum_init(), proc_422_rsp(), proc_session_timer(), process_applicationmap_line(), process_ast_dsp(), process_cn_rfc3389(), process_config(), process_crypto(), process_dahdi(), process_dtmf_rfc2833(), process_echocancel(), process_message_callback(), process_opcode(), process_output(), process_request(), process_returncode(), process_sdp(), process_sdp_a_audio(), process_sdp_c(), process_sdp_o(), process_text_line(), process_via(), profile_set_param(), progress(), proxy_from_config(), proxy_update(), pthread_timer_set_rate(), purge_old_messages(), pvalCheckType(), pvalGlobalsAddStatement(), pvalTopLevAddObject(), pw_cb(), ql_exec(), queue_exec(), queue_file(), queue_function_exists(), queue_function_memberpenalty_read(), queue_function_memberpenalty_write(), queue_function_qac(), queue_function_qac_dep(), queue_function_queuememberlist(), queue_function_queuewaitingcount(), queue_function_var(), queue_reload_request(), queue_set_param(), queue_transfer_fixup(), queue_voice_frame(), quote(), radius_log(), rcv_mac_addr(), rcvfax_exec(), read_agent_config(), read_config(), read_config_maps(), read_exec(), read_password_from_file(), readexten_exec(), readfile_exec(), readmimefile(), realtime_curl(), realtime_destroy_handler(), realtime_directory(), realtime_exec(), realtime_handler(), realtime_ldap_base_ap(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_odbc(), realtime_peer(), realtime_peer_by_addr(), realtime_peer_get_sippeer_helper(), realtime_pgsql(), realtime_require_handler(), realtime_store_handler(), realtime_update2_handler(), realtime_update_handler(), realtime_user(), realtimefield_read(), receive_digit(), receive_message(), receivefax_exec(), receivefax_t38_init(), record_exec(), redirecting_read(), redirecting_write(), refresh_list(), reg_source_db(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_config(), reload_firmware(), reload_followme(), reload_module(), reload_queue_members(), reload_queue_rules(), reload_queues(), reload_single_member(), reload_single_queue(), remote_bridge_loop(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), replace(), replace_callno(), reply_digest(), require_curl(), require_odbc(), require_pgsql(), res_srtp_init(), res_srtp_new(), resample_frame(), reset_conf(), resolve_first(), respprep(), restart_monitor(), restart_pktc_thread(), restart_session_timer(), restore_conference(), restore_gains(), retrans_pkt(), retrydial_exec(), return_exec(), revert_fax_buffers(), rollback_exec(), rotate_file(), rqm_exec(), rt_handle_member_record(), rtp_reload(), run_agi(), run_externnotify(), run_ras(), s_streamwait3(), safe_append(), save_conference(), save_to_folder(), say_date(), say_date_with_format(), say_datetime(), say_datetime_from_now(), say_init_mode(), say_number_full(), say_time(), saycountedadj_exec(), saycountednoun_exec(), scan_service(), scan_thread(), schedule(), scheduled_destroy(), sdp_crypto_activate(), sdp_crypto_offer(), sdp_crypto_process(), sdp_crypto_setup(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_ews_request_and_parse(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendfax_exec(), sendfax_t38_init(), sendimage_exec(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_crypto_policy(), set_destination(), set_fax_t38_caps(), set_format(), set_full_cmd(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_moh_exec(), set_state(), set_ulimit(), set_var(), setcallerid_pres_exec(), setflag(), setformat(), setup_dahdi_int(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_srtp(), setup_stunaddr(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), shift_pop(), show_chanstats_cb(), show_dialplan_helper(), showdisplay(), showkeys(), signal_pipe(), sip_acf_channel_read(), sip_addheader(), sip_call(), sip_cc_monitor_suspend(), sip_check_authtimeout(), sip_cli_notify(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_parse_host(), sip_parse_register_line(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_read(), sip_reg_timeout(), sip_register(), sip_reload(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_setoption(), sip_sipredirect(), sip_st_alloc(), sip_subscribe_mwi(), sip_tcp_read(), sip_tcptls_write(), sip_threadinfo_create(), sip_tls_read(), sip_write(), sipsock_read(), siren14read(), siren14seek(), siren14trunc(), siren14write(), siren7read(), siren7seek(), siren7trunc(), siren7write(), skel_exec(), skinny_call(), skinny_fixup(), skinny_hangup(), skinny_hold(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), skinny_transfer(), skinny_unhold(), skinny_write(), sla_add_trunk_to_station(), sla_build_station(), sla_build_trunk(), sla_load_config(), sla_queue_event_conf(), sla_state(), sla_station_exec(), sla_trunk_exec(), slinear_read(), slinear_seek(), slinear_trunc(), slinear_write(), smdi_load(), smdi_msg_read(), smdi_msg_retrieve_read(), smdi_read(), smdi_toggle_mwi(), smoother_frame_feed(), sms_exec(), sms_generate(), sms_handleincoming(), sms_log(), sms_messagerx2(), sms_process(), sms_readfile(), sms_writefile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), softmix_bridge_thread(), soundcard_init(), soundcard_writeframe(), span_message(), spandsp_fax_new(), spandsp_fax_read(), spandsp_fax_start(), spandsp_fax_write(), spandsp_log(), spandsp_modems(), spawn_dp_lookup(), spawn_mp3(), speex_get_wb_sz_at(), speex_read(), speex_samples(), speex_write(), speextolin_framein(), spy_generate(), sqlite_log(), srv_datastore_setup(), srv_query_read(), srv_result_read(), ssl_close(), ssl_lock(), ssl_verify(), stackpeek_read(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_poll_thread(), start_rtp(), start_session_timer(), start_spying(), start_stream(), startelm(), starttimer(), stop_session_timer(), store_boost(), store_by_peercallno(), store_by_transfercallno(), store_config(), store_config_core(), store_curl(), store_digit(), store_mixer(), store_odbc(), store_pgsql(), store_tone_zone_ring_cadence(), str_to_agent_policy(), str_to_monitor_policy(), stun_monitor_request(), stun_start_monitor(), stun_stop_monitor(), subscribe_event_destroy(), subscript(), substitute_escapes(), swap_subs(), sysinfo_helper(), syslog_log(), system_exec_helper(), t38_tx_packet_handler(), tdd_feed(), tdd_new(), tds_error_handler(), tds_load_module(), tds_log(), tds_message_handler(), testclient_exec(), testserver_exec(), timed_read(), timeout_read(), timeout_write(), timerfd_timer_ack(), timerfd_timer_close(), timerfd_timer_disable_continuous(), timerfd_timer_enable_continuous(), timerfd_timer_get_event(), timerfd_timer_open(), timerfd_timer_set_rate(), timezone_add(), timing_read(), to_number(), to_string(), tonepair_alloc(), tonepair_generator(), tps_processing_function(), tps_taskprocessor_destroy(), tps_taskprocessor_pop(), transfer_exec(), TransferCallStep1(), transmit(), transmit_audio(), transmit_cc_notify(), transmit_invite(), transmit_refer(), transmit_register(), transmit_request_with_auth(), transmit_response(), transmit_response_using_temp(), transmit_response_with_auth(), transmit_response_with_sdp(), transmit_response_with_t38_sdp(), transmit_state_notify(), transmit_t38(), try_calling(), try_firmware(), try_load_key(), try_suggested_sip_codec(), try_transfer(), tryexec_exec(), tvfix(), txt_callback(), unalloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_fixup(), unistim_hangup(), unistim_indicate(), unistim_new(), unistim_request(), unistim_rtp_read(), unistim_senddigit_end(), unistim_sendtext(), unistim_ss(), unistim_write(), unistimsock_read(), unload_module(), unlock_read(), unref_mansession(), unregister_exten(), unshift_push(), unsignal_pipe(), update2_curl(), update2_ldap(), update2_odbc(), update2_pgsql(), update2_prepare(), update_call_counter(), update_common_options(), update_config(), update_curl(), update_header(), update_key(), update_ldap(), update_modem_bits(), update_odbc(), update_pgsql(), update_registry(), update_scoreboard(), update_stats(), upqm_exec(), uridecode(), uriencode(), usage_context_add_ramp(), usage_context_add_spaces(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_check_password_shell(), vm_exec(), vm_execmain(), vm_intro(), vm_newuser(), vm_options(), vmsayname_exec(), volume_write(), vox_read(), vox_seek(), vox_trunc(), vox_write(), wait_file(), wait_file2(), wait_for_answer(), wait_for_winner(), wait_moh_exec(), waitfor_exec(), waitforring_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_trunc(), wav_write(), write_cdr(), write_header(), write_history(), write_password_to_file(), write_stream(), writefile(), xmldoc_build_field(), xmldoc_get_syntax_fun(), xmldoc_string_cleanup(), xmldoc_string_wrap(), yyerror(), and yyparse().
01212 { 01213 struct logmsg *logmsg = NULL; 01214 struct ast_str *buf = NULL; 01215 struct ast_tm tm; 01216 struct timeval now = ast_tvnow(); 01217 int res = 0; 01218 va_list ap; 01219 char datestring[256]; 01220 01221 if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) 01222 return; 01223 01224 if (level != __LOG_VERBOSE && AST_RWLIST_EMPTY(&logchannels)) { 01225 /* 01226 * we don't have the logger chain configured yet, 01227 * so just log to stdout 01228 */ 01229 int result; 01230 va_start(ap, fmt); 01231 result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */ 01232 va_end(ap); 01233 if (result != AST_DYNSTR_BUILD_FAILED) { 01234 term_filter_escapes(ast_str_buffer(buf)); 01235 fputs(ast_str_buffer(buf), stdout); 01236 } 01237 return; 01238 } 01239 01240 /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug 01241 are non-zero; LOG_DEBUG messages can still be displayed if option_debug 01242 is zero, if option_verbose is non-zero (this allows for 'level zero' 01243 LOG_DEBUG messages to be displayed, if the logmask on any channel 01244 allows it) 01245 */ 01246 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) 01247 return; 01248 01249 /* Ignore anything that never gets logged anywhere */ 01250 if (level != __LOG_VERBOSE && !(global_logmask & (1 << level))) 01251 return; 01252 01253 /* Build string */ 01254 va_start(ap, fmt); 01255 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); 01256 va_end(ap); 01257 01258 /* If the build failed, then abort and free this structure */ 01259 if (res == AST_DYNSTR_BUILD_FAILED) 01260 return; 01261 01262 /* Create a new logging message */ 01263 if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128))) 01264 return; 01265 01266 /* Copy string over */ 01267 ast_string_field_set(logmsg, message, ast_str_buffer(buf)); 01268 01269 /* Set type */ 01270 if (level == __LOG_VERBOSE) { 01271 logmsg->type = LOGMSG_VERBOSE; 01272 } else { 01273 logmsg->type = LOGMSG_NORMAL; 01274 } 01275 01276 /* Create our date/time */ 01277 ast_localtime(&now, &tm, NULL); 01278 ast_strftime(datestring, sizeof(datestring), dateformat, &tm); 01279 ast_string_field_set(logmsg, date, datestring); 01280 01281 /* Copy over data */ 01282 logmsg->level = level; 01283 logmsg->line = line; 01284 ast_string_field_set(logmsg, level_name, levels[level]); 01285 ast_string_field_set(logmsg, file, file); 01286 ast_string_field_set(logmsg, function, function); 01287 logmsg->process_id = (long) GETTID(); 01288 01289 /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */ 01290 if (logthread != AST_PTHREADT_NULL) { 01291 AST_LIST_LOCK(&logmsgs); 01292 if (close_logger_thread) { 01293 /* Logger is either closing or closed. We cannot log this message. */ 01294 ast_free(logmsg); 01295 } else { 01296 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01297 ast_cond_signal(&logcond); 01298 } 01299 AST_LIST_UNLOCK(&logmsgs); 01300 } else { 01301 logger_print_normal(logmsg); 01302 ast_free(logmsg); 01303 } 01304 }
static void ast_log_vsyslog | ( | struct logmsg * | msg | ) | [static] |
Definition at line 952 of file logger.c.
References ast_syslog_priority_from_loglevel(), logmsg::file, logmsg::function, logmsg::level, levels, logmsg::line, logmsg::message, logmsg::process_id, and term_strip().
Referenced by logger_print_normal().
00953 { 00954 char buf[BUFSIZ]; 00955 int syslog_level = ast_syslog_priority_from_loglevel(msg->level); 00956 00957 if (syslog_level < 0) { 00958 /* we are locked here, so cannot ast_log() */ 00959 fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level); 00960 return; 00961 } 00962 00963 snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s", 00964 levels[msg->level], msg->process_id, msg->file, msg->line, msg->function, msg->message); 00965 00966 term_strip(buf, buf, strlen(buf) + 1); 00967 syslog(syslog_level, "%s", buf); 00968 }
int ast_logger_register_level | ( | const char * | name | ) |
Register a new logger level.
name | The name of the level to be registered |
-1 | if an error occurs | |
non-zero | level to be used with ast_log for sending messages to this level |
Definition at line 1625 of file logger.c.
References ARRAY_LEN, ast_debug, ast_log(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strdup, available(), levels, LOG_WARNING, and update_logchannels().
Referenced by ast_cc_init(), and load_module().
01626 { 01627 unsigned int level; 01628 unsigned int available = 0; 01629 01630 AST_RWLIST_WRLOCK(&logchannels); 01631 01632 for (level = 0; level < ARRAY_LEN(levels); level++) { 01633 if ((level >= 16) && !available && !levels[level]) { 01634 available = level; 01635 continue; 01636 } 01637 01638 if (levels[level] && !strcasecmp(levels[level], name)) { 01639 ast_log(LOG_WARNING, 01640 "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n", 01641 name); 01642 AST_RWLIST_UNLOCK(&logchannels); 01643 01644 return -1; 01645 } 01646 } 01647 01648 if (!available) { 01649 ast_log(LOG_WARNING, 01650 "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n", 01651 name); 01652 AST_RWLIST_UNLOCK(&logchannels); 01653 01654 return -1; 01655 } 01656 01657 levels[available] = ast_strdup(name); 01658 01659 AST_RWLIST_UNLOCK(&logchannels); 01660 01661 ast_debug(1, "Registered dynamic logger level '%s' with index %d.\n", name, available); 01662 01663 update_logchannels(); 01664 01665 return available; 01666 }
void ast_logger_unregister_level | ( | const char * | name | ) |
Unregister a previously registered logger level.
name | The name of the level to be unregistered |
Definition at line 1668 of file logger.c.
References ARRAY_LEN, ast_debug, ast_free, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, levels, and update_logchannels().
Referenced by cc_shutdown(), load_module(), and unload_module().
01669 { 01670 unsigned int found = 0; 01671 unsigned int x; 01672 01673 AST_RWLIST_WRLOCK(&logchannels); 01674 01675 for (x = 16; x < ARRAY_LEN(levels); x++) { 01676 if (!levels[x]) { 01677 continue; 01678 } 01679 01680 if (strcasecmp(levels[x], name)) { 01681 continue; 01682 } 01683 01684 found = 1; 01685 break; 01686 } 01687 01688 if (found) { 01689 /* take this level out of the global_logmask, to ensure that no new log messages 01690 * will be queued for it 01691 */ 01692 01693 global_logmask &= ~(1 << x); 01694 01695 ast_free(levels[x]); 01696 levels[x] = NULL; 01697 AST_RWLIST_UNLOCK(&logchannels); 01698 01699 ast_debug(1, "Unregistered dynamic logger level '%s' with index %d.\n", name, x); 01700 01701 update_logchannels(); 01702 } else { 01703 AST_RWLIST_UNLOCK(&logchannels); 01704 } 01705 }
void ast_queue_log | ( | const char * | queuename, | |
const char * | callid, | |||
const char * | agent, | |||
const char * | event, | |||
const char * | fmt, | |||
... | ||||
) |
Definition at line 479 of file logger.c.
References args, AST_APP_ARG, ast_check_realtime(), AST_DECLARE_APP_ARGS, ast_localtime(), AST_NONSTANDARD_APP_ARGS, ast_queue_log(), ast_realtime_require_field(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_store_realtime(), ast_strftime(), ast_tvnow(), logfiles, logger_queue_init(), qlog, RQ_CHAR, S_OR, and SENTINEL.
Referenced by aqm_exec(), ast_queue_log(), find_queue_by_name_rt(), handle_queue_add_member(), handle_queue_remove_member(), login_exec(), manager_add_queue_member(), manager_queue_log_custom(), manager_remove_queue_member(), ql_exec(), queue_exec(), queue_transfer_fixup(), reload_logger(), rna(), rqm_exec(), rt_handle_member_record(), set_member_paused(), set_member_penalty(), try_calling(), update_realtime_members(), and wait_our_turn().
00480 { 00481 va_list ap; 00482 struct timeval tv; 00483 struct ast_tm tm; 00484 char qlog_msg[8192]; 00485 int qlog_len; 00486 char time_str[30]; 00487 00488 if (!logger_initialized) { 00489 /* You are too early. We are not open yet! */ 00490 return; 00491 } 00492 if (!queuelog_init) { 00493 AST_RWLIST_WRLOCK(&logchannels); 00494 if (!queuelog_init) { 00495 /* 00496 * We have delayed initializing the queue logging system so 00497 * preloaded realtime modules can get up. We must initialize 00498 * now since someone is trying to log something. 00499 */ 00500 logger_queue_init(); 00501 queuelog_init = 1; 00502 AST_RWLIST_UNLOCK(&logchannels); 00503 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); 00504 } else { 00505 AST_RWLIST_UNLOCK(&logchannels); 00506 } 00507 } 00508 00509 if (ast_check_realtime("queue_log")) { 00510 tv = ast_tvnow(); 00511 ast_localtime(&tv, &tm, NULL); 00512 ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm); 00513 va_start(ap, fmt); 00514 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap); 00515 va_end(ap); 00516 if (logfiles.queue_adaptive_realtime) { 00517 AST_DECLARE_APP_ARGS(args, 00518 AST_APP_ARG(data)[5]; 00519 ); 00520 AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|'); 00521 /* Ensure fields are large enough to receive data */ 00522 ast_realtime_require_field("queue_log", 00523 "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")), 00524 "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")), 00525 "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")), 00526 "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")), 00527 "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")), 00528 SENTINEL); 00529 00530 /* Store the log */ 00531 ast_store_realtime("queue_log", "time", time_str, 00532 "callid", callid, 00533 "queuename", queuename, 00534 "agent", agent, 00535 "event", event, 00536 "data1", S_OR(args.data[0], ""), 00537 "data2", S_OR(args.data[1], ""), 00538 "data3", S_OR(args.data[2], ""), 00539 "data4", S_OR(args.data[3], ""), 00540 "data5", S_OR(args.data[4], ""), 00541 SENTINEL); 00542 } else { 00543 ast_store_realtime("queue_log", "time", time_str, 00544 "callid", callid, 00545 "queuename", queuename, 00546 "agent", agent, 00547 "event", event, 00548 "data", qlog_msg, 00549 SENTINEL); 00550 } 00551 00552 if (!logfiles.queue_log_to_file) { 00553 return; 00554 } 00555 } 00556 00557 if (qlog) { 00558 va_start(ap, fmt); 00559 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); 00560 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap); 00561 va_end(ap); 00562 AST_RWLIST_RDLOCK(&logchannels); 00563 if (qlog) { 00564 fprintf(qlog, "%s\n", qlog_msg); 00565 fflush(qlog); 00566 } 00567 AST_RWLIST_UNLOCK(&logchannels); 00568 } 00569 }
int ast_register_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1575 of file logger.c.
References ast_malloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb::verboser.
Referenced by ast_makesocket(), and print_intro_message().
01576 { 01577 struct verb *verb; 01578 01579 if (!(verb = ast_malloc(sizeof(*verb)))) 01580 return -1; 01581 01582 verb->verboser = v; 01583 01584 AST_RWLIST_WRLOCK(&verbosers); 01585 AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); 01586 AST_RWLIST_UNLOCK(&verbosers); 01587 01588 return 0; 01589 }
int ast_unregister_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1591 of file logger.c.
References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb::verboser.
01592 { 01593 struct verb *cur; 01594 01595 AST_RWLIST_WRLOCK(&verbosers); 01596 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { 01597 if (cur->verboser == v) { 01598 AST_RWLIST_REMOVE_CURRENT(list); 01599 ast_free(cur); 01600 break; 01601 } 01602 } 01603 AST_RWLIST_TRAVERSE_SAFE_END; 01604 AST_RWLIST_UNLOCK(&verbosers); 01605 01606 return cur ? 0 : -1; 01607 }
void ast_verbose | ( | const char * | fmt, | |
... | ||||
) |
Definition at line 1566 of file logger.c.
References __ast_verbose_ap().
01567 { 01568 va_list ap; 01569 01570 va_start(ap, fmt); 01571 __ast_verbose_ap("", 0, "", fmt, ap); 01572 va_end(ap); 01573 }
void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 1164 of file logger.c.
References ARRAY_LEN, ast_cli_unregister_multiple(), ast_cond_signal, ast_free, AST_LIST_LOCK, AST_LIST_REMOVE_HEAD, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, cli_logger, close_logger_thread, f, logchannel::fileptr, logchannel::list, logcond, logthread, and qlog.
Referenced by really_quit().
01165 { 01166 struct logchannel *f = NULL; 01167 struct verb *cur = NULL; 01168 01169 ast_cli_unregister_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01170 01171 logger_initialized = 0; 01172 01173 /* Stop logger thread */ 01174 AST_LIST_LOCK(&logmsgs); 01175 close_logger_thread = 1; 01176 ast_cond_signal(&logcond); 01177 AST_LIST_UNLOCK(&logmsgs); 01178 01179 if (logthread != AST_PTHREADT_NULL) 01180 pthread_join(logthread, NULL); 01181 01182 AST_RWLIST_WRLOCK(&verbosers); 01183 while ((cur = AST_LIST_REMOVE_HEAD(&verbosers, list))) { 01184 ast_free(cur); 01185 } 01186 AST_RWLIST_UNLOCK(&verbosers); 01187 01188 AST_RWLIST_WRLOCK(&logchannels); 01189 01190 if (qlog) { 01191 fclose(qlog); 01192 qlog = NULL; 01193 } 01194 01195 while ((f = AST_LIST_REMOVE_HEAD(&logchannels, list))) { 01196 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 01197 fclose(f->fileptr); 01198 f->fileptr = NULL; 01199 } 01200 ast_free(f); 01201 } 01202 01203 closelog(); /* syslog */ 01204 01205 AST_RWLIST_UNLOCK(&logchannels); 01206 }
static char* handle_logger_reload | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 808 of file logger.c.
References ast_cli(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, reload_logger(), and ast_cli_entry::usage.
00809 { 00810 switch (cmd) { 00811 case CLI_INIT: 00812 e->command = "logger reload"; 00813 e->usage = 00814 "Usage: logger reload\n" 00815 " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n"; 00816 return NULL; 00817 case CLI_GENERATE: 00818 return NULL; 00819 } 00820 if (reload_logger(0)) { 00821 ast_cli(a->fd, "Failed to reload the logger\n"); 00822 return CLI_FAILURE; 00823 } 00824 return CLI_SUCCESS; 00825 }
static char* handle_logger_rotate | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 827 of file logger.c.
References ast_cli(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, reload_logger(), and ast_cli_entry::usage.
00828 { 00829 switch (cmd) { 00830 case CLI_INIT: 00831 e->command = "logger rotate"; 00832 e->usage = 00833 "Usage: logger rotate\n" 00834 " Rotates and Reopens the log files.\n"; 00835 return NULL; 00836 case CLI_GENERATE: 00837 return NULL; 00838 } 00839 if (reload_logger(1)) { 00840 ast_cli(a->fd, "Failed to reload the logger and rotate log files\n"); 00841 return CLI_FAILURE; 00842 } 00843 return CLI_SUCCESS; 00844 }
static char* handle_logger_set_level | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 846 of file logger.c.
References ast_cli_args::argc, ast_cli_args::argv, ARRAY_LEN, ast_cli(), ast_console_toggle_loglevel(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, levels, and ast_cli_entry::usage.
00847 { 00848 int x; 00849 int state; 00850 int level = -1; 00851 00852 switch (cmd) { 00853 case CLI_INIT: 00854 e->command = "logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}"; 00855 e->usage = 00856 "Usage: logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n" 00857 " Set a specific log level to enabled/disabled for this console.\n"; 00858 return NULL; 00859 case CLI_GENERATE: 00860 return NULL; 00861 } 00862 00863 if (a->argc < 5) 00864 return CLI_SHOWUSAGE; 00865 00866 AST_RWLIST_WRLOCK(&logchannels); 00867 00868 for (x = 0; x < ARRAY_LEN(levels); x++) { 00869 if (levels[x] && !strcasecmp(a->argv[3], levels[x])) { 00870 level = x; 00871 break; 00872 } 00873 } 00874 00875 AST_RWLIST_UNLOCK(&logchannels); 00876 00877 state = ast_true(a->argv[4]) ? 1 : 0; 00878 00879 if (level != -1) { 00880 ast_console_toggle_loglevel(a->fd, level, state); 00881 ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off"); 00882 } else 00883 return CLI_SHOWUSAGE; 00884 00885 return CLI_SUCCESS; 00886 }
static char* handle_logger_show_channels | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
CLI command to show logging system configuration.
Definition at line 889 of file logger.c.
References ARRAY_LEN, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, logchannel::disabled, ast_cli_args::fd, logchannel::filename, FORMATL, levels, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, logchannel::type, and ast_cli_entry::usage.
00890 { 00891 #define FORMATL "%-35.35s %-8.8s %-9.9s " 00892 struct logchannel *chan; 00893 switch (cmd) { 00894 case CLI_INIT: 00895 e->command = "logger show channels"; 00896 e->usage = 00897 "Usage: logger show channels\n" 00898 " List configured logger channels.\n"; 00899 return NULL; 00900 case CLI_GENERATE: 00901 return NULL; 00902 } 00903 ast_cli(a->fd, FORMATL, "Channel", "Type", "Status"); 00904 ast_cli(a->fd, "Configuration\n"); 00905 ast_cli(a->fd, FORMATL, "-------", "----", "------"); 00906 ast_cli(a->fd, "-------------\n"); 00907 AST_RWLIST_RDLOCK(&logchannels); 00908 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00909 unsigned int level; 00910 00911 ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), 00912 chan->disabled ? "Disabled" : "Enabled"); 00913 ast_cli(a->fd, " - "); 00914 for (level = 0; level < ARRAY_LEN(levels); level++) { 00915 if ((chan->logmask & (1 << level)) && levels[level]) { 00916 ast_cli(a->fd, "%s ", levels[level]); 00917 } 00918 } 00919 ast_cli(a->fd, "\n"); 00920 } 00921 AST_RWLIST_UNLOCK(&logchannels); 00922 ast_cli(a->fd, "\n"); 00923 00924 return CLI_SUCCESS; 00925 }
int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 1131 of file logger.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_cond_destroy, ast_cond_init, ast_config_AST_LOG_DIR, ast_mkdir(), ast_mutex_destroy, ast_mutex_init, ast_pthread_create, cli_logger, handle_SIGXFSZ, init_logger_chain(), logcond, logger_thread(), and logthread.
Referenced by main().
01132 { 01133 /* auto rotate if sig SIGXFSZ comes a-knockin */ 01134 sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL); 01135 01136 /* Re-initialize the logmsgs mutex. The recursive mutex can be accessed prior 01137 * to Asterisk being forked into the background, which can cause the thread 01138 * ID tracked by the underlying pthread mutex to be different than the ID of 01139 * the thread that unlocks the mutex. Since init_logger is called after the 01140 * fork, it is safe to initialize the mutex here for future accesses. 01141 */ 01142 ast_mutex_destroy(&logmsgs.lock); 01143 ast_mutex_init(&logmsgs.lock); 01144 ast_cond_init(&logcond, NULL); 01145 01146 /* start logger thread */ 01147 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 01148 ast_cond_destroy(&logcond); 01149 return -1; 01150 } 01151 01152 /* register the logger cli commands */ 01153 ast_cli_register_multiple(cli_logger, ARRAY_LEN(cli_logger)); 01154 01155 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 01156 01157 /* create log channels */ 01158 init_logger_chain(0 /* locked */); 01159 logger_initialized = 1; 01160 01161 return 0; 01162 }
static void init_logger_chain | ( | int | locked | ) | [static] |
Definition at line 307 of file logger.c.
References __LOG_ERROR, __LOG_NOTICE, __LOG_WARNING, ast_calloc, ast_config_destroy(), ast_config_load2(), ast_console_puts_mutable(), ast_copy_string(), ast_free, AST_RWLIST_INSERT_HEAD, AST_RWLIST_REMOVE_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), ast_variable_browse(), ast_variable_retrieve(), CONFIG_STATUS_FILEINVALID, errno, ast_variable::lineno, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ast_variable::name, ast_variable::next, qlog, ROTATE, SEQUENTIAL, TIMESTAMP, logchannel::type, ast_variable::value, and var.
Referenced by init_logger(), and reload_logger().
00308 { 00309 struct logchannel *chan; 00310 struct ast_config *cfg; 00311 struct ast_variable *var; 00312 const char *s; 00313 struct ast_flags config_flags = { 0 }; 00314 00315 if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) { 00316 return; 00317 } 00318 00319 /* delete our list of log channels */ 00320 if (!locked) { 00321 AST_RWLIST_WRLOCK(&logchannels); 00322 } 00323 while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) { 00324 ast_free(chan); 00325 } 00326 global_logmask = 0; 00327 if (!locked) { 00328 AST_RWLIST_UNLOCK(&logchannels); 00329 } 00330 00331 errno = 0; 00332 /* close syslog */ 00333 closelog(); 00334 00335 /* If no config file, we're fine, set default options. */ 00336 if (!cfg) { 00337 if (errno) { 00338 fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno)); 00339 } else { 00340 fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n"); 00341 } 00342 if (!(chan = ast_calloc(1, sizeof(*chan)))) { 00343 return; 00344 } 00345 chan->type = LOGTYPE_CONSOLE; 00346 chan->logmask = __LOG_WARNING | __LOG_NOTICE | __LOG_ERROR; 00347 if (!locked) { 00348 AST_RWLIST_WRLOCK(&logchannels); 00349 } 00350 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00351 global_logmask |= chan->logmask; 00352 if (!locked) { 00353 AST_RWLIST_UNLOCK(&logchannels); 00354 } 00355 return; 00356 } 00357 00358 if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) { 00359 if (ast_true(s)) { 00360 if (gethostname(hostname, sizeof(hostname) - 1)) { 00361 ast_copy_string(hostname, "unknown", sizeof(hostname)); 00362 fprintf(stderr, "What box has no hostname???\n"); 00363 } 00364 } else 00365 hostname[0] = '\0'; 00366 } else 00367 hostname[0] = '\0'; 00368 if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) 00369 ast_copy_string(dateformat, s, sizeof(dateformat)); 00370 else 00371 ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat)); 00372 if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) { 00373 logfiles.queue_log = ast_true(s); 00374 } 00375 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) { 00376 logfiles.queue_log_to_file = ast_true(s); 00377 } 00378 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) { 00379 ast_copy_string(queue_log_name, s, sizeof(queue_log_name)); 00380 } 00381 if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) { 00382 ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate)); 00383 } 00384 if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) { 00385 if (strcasecmp(s, "timestamp") == 0) { 00386 rotatestrategy = TIMESTAMP; 00387 } else if (strcasecmp(s, "rotate") == 0) { 00388 rotatestrategy = ROTATE; 00389 } else if (strcasecmp(s, "sequential") == 0) { 00390 rotatestrategy = SEQUENTIAL; 00391 } else { 00392 fprintf(stderr, "Unknown rotatestrategy: %s\n", s); 00393 } 00394 } else { 00395 if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) { 00396 rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL; 00397 fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n"); 00398 } 00399 } 00400 00401 if (!locked) { 00402 AST_RWLIST_WRLOCK(&logchannels); 00403 } 00404 var = ast_variable_browse(cfg, "logfiles"); 00405 for (; var; var = var->next) { 00406 if (!(chan = make_logchannel(var->name, var->value, var->lineno))) { 00407 /* Print error message directly to the consoles since the lock is held 00408 * and we don't want to unlock with the list partially built */ 00409 ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR); 00410 ast_console_puts_mutable(var->name, __LOG_ERROR); 00411 ast_console_puts_mutable("'\n", __LOG_ERROR); 00412 continue; 00413 } 00414 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00415 global_logmask |= chan->logmask; 00416 } 00417 00418 if (qlog) { 00419 fclose(qlog); 00420 qlog = NULL; 00421 } 00422 00423 if (!locked) { 00424 AST_RWLIST_UNLOCK(&logchannels); 00425 } 00426 00427 ast_config_destroy(cfg); 00428 }
static void logger_print_normal | ( | struct logmsg * | logmsg | ) | [static] |
Print a normal log message to the channels.
Definition at line 971 of file logger.c.
References __LOG_VERBOSE, ast_console_puts_mutable(), ast_log_vsyslog(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdupa, ast_string_field_set, ast_strlen_zero(), ast_verb, COLOR_BRWHITE, colors, logmsg::date, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, logmsg::file, logchannel::filename, logchannel::fileptr, logmsg::function, logmsg::level, logmsg::level_name, logmsg::line, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::message, logmsg::process_id, reload_logger(), term_color(), term_strip(), logchannel::type, and verb::verboser.
Referenced by ast_log(), and logger_thread().
00972 { 00973 struct logchannel *chan = NULL; 00974 char buf[BUFSIZ]; 00975 struct verb *v = NULL; 00976 00977 if (logmsg->level == __LOG_VERBOSE) { 00978 char *tmpmsg = ast_strdupa(logmsg->message + 1); 00979 /* Iterate through the list of verbosers and pass them the log message string */ 00980 AST_RWLIST_RDLOCK(&verbosers); 00981 AST_RWLIST_TRAVERSE(&verbosers, v, list) 00982 v->verboser(logmsg->message); 00983 AST_RWLIST_UNLOCK(&verbosers); 00984 ast_string_field_set(logmsg, message, tmpmsg); 00985 } 00986 00987 AST_RWLIST_RDLOCK(&logchannels); 00988 00989 if (!AST_RWLIST_EMPTY(&logchannels)) { 00990 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00991 /* If the channel is disabled, then move on to the next one */ 00992 if (chan->disabled) 00993 continue; 00994 /* Check syslog channels */ 00995 if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) { 00996 ast_log_vsyslog(logmsg); 00997 /* Console channels */ 00998 } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) { 00999 char linestr[128]; 01000 char tmp1[80], tmp2[80], tmp3[80], tmp4[80]; 01001 01002 /* If the level is verbose, then skip it */ 01003 if (logmsg->level == __LOG_VERBOSE) 01004 continue; 01005 01006 /* Turn the numerical line number into a string */ 01007 snprintf(linestr, sizeof(linestr), "%d", logmsg->line); 01008 /* Build string to print out */ 01009 snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s", 01010 logmsg->date, 01011 term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)), 01012 logmsg->process_id, 01013 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)), 01014 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), 01015 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)), 01016 logmsg->message); 01017 /* Print out */ 01018 ast_console_puts_mutable(buf, logmsg->level); 01019 /* File channels */ 01020 } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) { 01021 int res = 0; 01022 01023 /* If no file pointer exists, skip it */ 01024 if (!chan->fileptr) { 01025 continue; 01026 } 01027 01028 /* Print out to the file */ 01029 res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s", 01030 logmsg->date, logmsg->level_name, logmsg->process_id, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ)); 01031 if (res <= 0 && !ast_strlen_zero(logmsg->message)) { 01032 fprintf(stderr, "**** Asterisk Logging Error: ***********\n"); 01033 if (errno == ENOMEM || errno == ENOSPC) 01034 fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename); 01035 else 01036 fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno)); 01037 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno)); 01038 chan->disabled = 1; 01039 } else if (res > 0) { 01040 fflush(chan->fileptr); 01041 } 01042 } 01043 } 01044 } else if (logmsg->level != __LOG_VERBOSE) { 01045 fputs(logmsg->message, stdout); 01046 } 01047 01048 AST_RWLIST_UNLOCK(&logchannels); 01049 01050 /* If we need to reload because of the file size, then do so */ 01051 if (filesize_reload_needed) { 01052 reload_logger(-1); 01053 ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 01054 } 01055 01056 return; 01057 }
static void logger_queue_init | ( | void | ) | [static] |
Definition at line 1107 of file logger.c.
References ast_config_AST_LOG_DIR, ast_log(), ast_unload_realtime(), errno, LOG_ERROR, logfiles, logger_queue_rt_start(), and qlog.
Referenced by ast_queue_log().
01108 { 01109 ast_unload_realtime("queue_log"); 01110 if (logfiles.queue_log) { 01111 char qfname[PATH_MAX]; 01112 01113 if (logger_queue_rt_start()) { 01114 return; 01115 } 01116 01117 /* Open the log file. */ 01118 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, 01119 queue_log_name); 01120 if (qlog) { 01121 /* Just in case it was already open. */ 01122 fclose(qlog); 01123 } 01124 qlog = fopen(qfname, "a"); 01125 if (!qlog) { 01126 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 01127 } 01128 } 01129 }
static int logger_queue_restart | ( | int | queue_rotate | ) | [static] |
Definition at line 707 of file logger.c.
References ast_config_AST_LOG_DIR, ast_log(), errno, LOG_ERROR, logger_queue_rt_start(), qlog, and rotate_file().
Referenced by reload_logger().
00708 { 00709 int res = 0; 00710 char qfname[PATH_MAX]; 00711 00712 if (logger_queue_rt_start()) { 00713 return res; 00714 } 00715 00716 snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00717 if (qlog) { 00718 /* Just in case it was still open. */ 00719 fclose(qlog); 00720 qlog = NULL; 00721 } 00722 if (queue_rotate) { 00723 rotate_file(qfname); 00724 } 00725 00726 /* Open the log file. */ 00727 qlog = fopen(qfname, "a"); 00728 if (!qlog) { 00729 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 00730 res = -1; 00731 } 00732 return res; 00733 }
static int logger_queue_rt_start | ( | void | ) | [static] |
Definition at line 672 of file logger.c.
References ast_check_realtime(), ast_realtime_require_field(), logfiles, RQ_CHAR, RQ_DATETIME, and SENTINEL.
Referenced by logger_queue_init(), and logger_queue_restart().
00673 { 00674 if (ast_check_realtime("queue_log")) { 00675 if (!ast_realtime_require_field("queue_log", 00676 "time", RQ_DATETIME, 26, 00677 "data1", RQ_CHAR, 20, 00678 "data2", RQ_CHAR, 20, 00679 "data3", RQ_CHAR, 20, 00680 "data4", RQ_CHAR, 20, 00681 "data5", RQ_CHAR, 20, 00682 SENTINEL)) { 00683 logfiles.queue_adaptive_realtime = 1; 00684 } else { 00685 logfiles.queue_adaptive_realtime = 0; 00686 } 00687 00688 if (!logfiles.queue_log_to_file) { 00689 /* Don't open the log file. */ 00690 return 1; 00691 } 00692 } 00693 return 0; 00694 }
int logger_reload | ( | void | ) |
Reload the logger module without rotating log files (also used from loader.c during a full Asterisk reload).
Reload logger without rotating log files.
Definition at line 800 of file logger.c.
References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.
00801 { 00802 if (reload_logger(0)) { 00803 return RESULT_FAILURE; 00804 } 00805 return RESULT_SUCCESS; 00806 }
static void* logger_thread | ( | void * | data | ) | [static] |
Actual logging thread.
Definition at line 1060 of file logger.c.
References ast_cond_wait, ast_free, AST_LIST_EMPTY, AST_LIST_FIRST, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_LOCK, AST_LIST_NEXT, AST_LIST_UNLOCK, close_logger_thread, logchannel::list, logcond, logger_print_normal(), and logchannel::next.
Referenced by init_logger().
01061 { 01062 struct logmsg *next = NULL, *msg = NULL; 01063 01064 for (;;) { 01065 /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */ 01066 AST_LIST_LOCK(&logmsgs); 01067 if (AST_LIST_EMPTY(&logmsgs)) { 01068 if (close_logger_thread) { 01069 AST_LIST_UNLOCK(&logmsgs); 01070 break; 01071 } else { 01072 ast_cond_wait(&logcond, &logmsgs.lock); 01073 } 01074 } 01075 next = AST_LIST_FIRST(&logmsgs); 01076 AST_LIST_HEAD_INIT_NOLOCK(&logmsgs); 01077 AST_LIST_UNLOCK(&logmsgs); 01078 01079 /* Otherwise go through and process each message in the order added */ 01080 while ((msg = next)) { 01081 /* Get the next entry now so that we can free our current structure later */ 01082 next = AST_LIST_NEXT(msg, list); 01083 01084 /* Depending on the type, send it to the proper function */ 01085 logger_print_normal(msg); 01086 01087 /* Free the data since we are done */ 01088 ast_free(msg); 01089 } 01090 01091 /* If we should stop, then stop */ 01092 if (close_logger_thread) 01093 break; 01094 } 01095 01096 return NULL; 01097 }
static unsigned int make_components | ( | const char * | s, | |
int | lineno | |||
) | [static] |
Definition at line 223 of file logger.c.
References ARRAY_LEN, ast_skip_blanks(), ast_strdupa, and levels.
Referenced by make_logchannel(), and update_logchannels().
00224 { 00225 char *w; 00226 unsigned int res = 0; 00227 char *stringp = ast_strdupa(s); 00228 unsigned int x; 00229 00230 while ((w = strsep(&stringp, ","))) { 00231 w = ast_skip_blanks(w); 00232 00233 if (!strcmp(w, "*")) { 00234 res = 0xFFFFFFFF; 00235 break; 00236 } else for (x = 0; x < ARRAY_LEN(levels); x++) { 00237 if (levels[x] && !strcasecmp(w, levels[x])) { 00238 res |= (1 << x); 00239 break; 00240 } 00241 } 00242 } 00243 00244 return res; 00245 }
static struct logchannel* make_logchannel | ( | const char * | channel, | |
const char * | components, | |||
int | lineno | |||
) | [static, read] |
Definition at line 247 of file logger.c.
References __LOG_ERROR, ast_calloc, ast_config_AST_LOG_DIR, ast_console_puts_mutable(), ast_copy_string(), ast_free, ast_strlen_zero(), ast_syslog_facility(), logchannel::components, errno, logchannel::facility, logchannel::filename, logchannel::fileptr, logchannel::lineno, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, make_components(), and logchannel::type.
Referenced by init_logger_chain().
00248 { 00249 struct logchannel *chan; 00250 char *facility; 00251 00252 if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1))) 00253 return NULL; 00254 00255 strcpy(chan->components, components); 00256 chan->lineno = lineno; 00257 00258 if (!strcasecmp(channel, "console")) { 00259 chan->type = LOGTYPE_CONSOLE; 00260 } else if (!strncasecmp(channel, "syslog", 6)) { 00261 /* 00262 * syntax is: 00263 * syslog.facility => level,level,level 00264 */ 00265 facility = strchr(channel, '.'); 00266 if (!facility++ || !facility) { 00267 facility = "local0"; 00268 } 00269 00270 chan->facility = ast_syslog_facility(facility); 00271 00272 if (chan->facility < 0) { 00273 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n"); 00274 ast_free(chan); 00275 return NULL; 00276 } 00277 00278 chan->type = LOGTYPE_SYSLOG; 00279 ast_copy_string(chan->filename, channel, sizeof(chan->filename)); 00280 openlog("asterisk", LOG_PID, chan->facility); 00281 } else { 00282 if (!ast_strlen_zero(hostname)) { 00283 snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s", 00284 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname); 00285 } else { 00286 snprintf(chan->filename, sizeof(chan->filename), "%s/%s", 00287 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel); 00288 } 00289 if (!(chan->fileptr = fopen(chan->filename, "a"))) { 00290 /* Can't do real logging here since we're called with a lock 00291 * so log to any attached consoles */ 00292 ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR); 00293 ast_console_puts_mutable(chan->filename, __LOG_ERROR); 00294 ast_console_puts_mutable("': ", __LOG_ERROR); 00295 ast_console_puts_mutable(strerror(errno), __LOG_ERROR); 00296 ast_console_puts_mutable("'\n", __LOG_ERROR); 00297 ast_free(chan); 00298 return NULL; 00299 } 00300 chan->type = LOGTYPE_FILE; 00301 } 00302 chan->logmask = make_components(chan->components, lineno); 00303 00304 return chan; 00305 }
static int reload_logger | ( | int | rotate | ) | [static] |
Definition at line 735 of file logger.c.
References ast_config_AST_LOG_DIR, ast_mkdir(), ast_queue_log(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_unload_realtime(), ast_verb, logchannel::disabled, EVENT_FLAG_SYSTEM, f, logchannel::filename, logchannel::fileptr, init_logger_chain(), logchannel::list, logfiles, logger_queue_restart(), manager_event, qlog, and rotate_file().
Referenced by handle_logger_reload(), handle_logger_rotate(), logger_print_normal(), and logger_reload().
00736 { 00737 int queue_rotate = rotate; 00738 struct logchannel *f; 00739 int res = 0; 00740 00741 AST_RWLIST_WRLOCK(&logchannels); 00742 00743 if (qlog) { 00744 if (rotate < 0) { 00745 /* Check filesize - this one typically doesn't need an auto-rotate */ 00746 if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */ 00747 fclose(qlog); 00748 qlog = NULL; 00749 } else { 00750 queue_rotate = 0; 00751 } 00752 } else { 00753 fclose(qlog); 00754 qlog = NULL; 00755 } 00756 } else { 00757 queue_rotate = 0; 00758 } 00759 00760 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 00761 00762 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 00763 if (f->disabled) { 00764 f->disabled = 0; /* Re-enable logging at reload */ 00765 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename); 00766 } 00767 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00768 int rotate_this = 0; 00769 if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */ 00770 /* Be more proactive about rotating massive log files */ 00771 rotate_this = 1; 00772 } 00773 fclose(f->fileptr); /* Close file */ 00774 f->fileptr = NULL; 00775 if (rotate || rotate_this) { 00776 rotate_file(f->filename); 00777 } 00778 } 00779 } 00780 00781 filesize_reload_needed = 0; 00782 00783 init_logger_chain(1 /* locked */); 00784 00785 ast_unload_realtime("queue_log"); 00786 if (logfiles.queue_log) { 00787 res = logger_queue_restart(queue_rotate); 00788 AST_RWLIST_UNLOCK(&logchannels); 00789 ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); 00790 ast_verb(1, "Asterisk Queue Logger restarted\n"); 00791 } else { 00792 AST_RWLIST_UNLOCK(&logchannels); 00793 } 00794 00795 return res; 00796 }
static int rotate_file | ( | const char * | filename | ) | [static] |
Definition at line 571 of file logger.c.
References ARRAY_LEN, ast_channel_unref, ast_dummy_channel_alloc, ast_log(), ast_safe_system(), ast_strlen_zero(), LOG_WARNING, pbx_builtin_setvar_helper(), pbx_substitute_variables_helper(), ROTATE, SEQUENTIAL, and TIMESTAMP.
Referenced by logger_queue_restart(), and reload_logger().
00572 { 00573 char old[PATH_MAX]; 00574 char new[PATH_MAX]; 00575 int x, y, which, found, res = 0, fd; 00576 char *suffixes[4] = { "", ".gz", ".bz2", ".Z" }; 00577 00578 switch (rotatestrategy) { 00579 case SEQUENTIAL: 00580 for (x = 0; ; x++) { 00581 snprintf(new, sizeof(new), "%s.%d", filename, x); 00582 fd = open(new, O_RDONLY); 00583 if (fd > -1) 00584 close(fd); 00585 else 00586 break; 00587 } 00588 if (rename(filename, new)) { 00589 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00590 res = -1; 00591 } else { 00592 filename = new; 00593 } 00594 break; 00595 case TIMESTAMP: 00596 snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL)); 00597 if (rename(filename, new)) { 00598 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00599 res = -1; 00600 } else { 00601 filename = new; 00602 } 00603 break; 00604 case ROTATE: 00605 /* Find the next empty slot, including a possible suffix */ 00606 for (x = 0; ; x++) { 00607 found = 0; 00608 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00609 snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]); 00610 fd = open(new, O_RDONLY); 00611 if (fd > -1) { 00612 close(fd); 00613 found = 1; 00614 break; 00615 } 00616 } 00617 if (!found) { 00618 break; 00619 } 00620 } 00621 00622 /* Found an empty slot */ 00623 for (y = x; y > 0; y--) { 00624 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00625 snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]); 00626 fd = open(old, O_RDONLY); 00627 if (fd > -1) { 00628 /* Found the right suffix */ 00629 close(fd); 00630 snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]); 00631 if (rename(old, new)) { 00632 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00633 res = -1; 00634 } 00635 break; 00636 } 00637 } 00638 } 00639 00640 /* Finally, rename the current file */ 00641 snprintf(new, sizeof(new), "%s.0", filename); 00642 if (rename(filename, new)) { 00643 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00644 res = -1; 00645 } else { 00646 filename = new; 00647 } 00648 } 00649 00650 if (!ast_strlen_zero(exec_after_rotate)) { 00651 struct ast_channel *c = ast_dummy_channel_alloc(); 00652 char buf[512]; 00653 00654 pbx_builtin_setvar_helper(c, "filename", filename); 00655 pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf)); 00656 if (c) { 00657 c = ast_channel_unref(c); 00658 } 00659 if (ast_safe_system(buf) == -1) { 00660 ast_log(LOG_WARNING, "error executing '%s'\n", buf); 00661 } 00662 } 00663 return res; 00664 }
static void update_logchannels | ( | void | ) | [static] |
Definition at line 1609 of file logger.c.
References AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::components, logchannel::lineno, logchannel::list, logchannel::logmask, and make_components().
Referenced by ast_logger_register_level(), and ast_logger_unregister_level().
01610 { 01611 struct logchannel *cur; 01612 01613 AST_RWLIST_WRLOCK(&logchannels); 01614 01615 global_logmask = 0; 01616 01617 AST_RWLIST_TRAVERSE(&logchannels, cur, list) { 01618 cur->logmask = make_components(cur->components, cur->lineno); 01619 global_logmask |= cur->logmask; 01620 } 01621 01622 AST_RWLIST_UNLOCK(&logchannels); 01623 }
struct ast_cli_entry cli_logger[] [static] |
Definition at line 934 of file logger.c.
Referenced by close_logger(), and init_logger().
int close_logger_thread = 0 [static] |
Definition at line 154 of file logger.c.
Referenced by ast_log(), close_logger(), and logger_thread().
const int colors[NUMLOGLEVELS] [static] |
Colors used in the console for logging.
Definition at line 180 of file logger.c.
Referenced by logger_print_normal().
char dateformat[256] = "%b %e %T" [static] |
Definition at line 78 of file logger.c.
Referenced by build_device().
char exec_after_rotate[256] = "" [static] |
int filesize_reload_needed [static] |
unsigned int global_logmask = 0xFFFF [static] |
struct sigaction handle_SIGXFSZ [static] |
{ .sa_handler = _handle_SIGXFSZ, .sa_flags = SA_RESTART, }
Definition at line 947 of file logger.c.
Referenced by init_logger().
char hostname[MAXHOSTNAMELEN] [static] |
Definition at line 100 of file logger.c.
Referenced by app_exec(), ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), main(), netconsole(), set_destination(), sip_parse_register_line(), sip_subscribe_mwi(), and tds_load_module().
char* levels[NUMLOGLEVELS] [static] |
Logging channels used in the Asterisk logging system.
The first 16 levels are reserved for system usage, and the remaining levels are reserved for usage by dynamic levels registered via ast_logger_register_level.
Definition at line 169 of file logger.c.
Referenced by ast_log(), ast_log_vsyslog(), ast_logger_register_level(), ast_logger_unregister_level(), ast_network_puts_mutable(), handle_logger_set_level(), handle_logger_show_channels(), and make_components().
struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , } [static] |
ast_cond_t logcond [static] |
Definition at line 153 of file logger.c.
Referenced by ast_log(), close_logger(), init_logger(), and logger_thread().
struct { ... } logfiles [static] |
Referenced by ast_queue_log(), init_logger_chain(), logger_queue_init(), logger_queue_rt_start(), and reload_logger().
int logger_initialized [static] |
pthread_t logthread = AST_PTHREADT_NULL [static] |
Definition at line 152 of file logger.c.
Referenced by ast_log(), close_logger(), and init_logger().
FILE* qlog [static] |
Definition at line 156 of file logger.c.
Referenced by ast_queue_log(), close_logger(), init_logger_chain(), logger_queue_init(), logger_queue_restart(), and reload_logger().
unsigned int queue_adaptive_realtime |
char queue_log_name[256] = QUEUELOG [static] |
unsigned int queue_log_to_file |
int queuelog_init [static] |
struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , } [static] |
Definition at line 215 of file logger.c.
Referenced by __ast_verbose_ap().