#include "asterisk.h"
#include "asterisk/_private.h"
#include "asterisk/paths.h"
#include <signal.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <execinfo.h>
#include <syslog.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"
Go to the source code of this file.
Data Structures | |
struct | logchannel |
struct | logchannels |
struct | logmsg |
struct | logmsgs |
struct | verb |
struct | verbosers |
Defines | |
#define | _ASTERISK_LOGGER_H |
#define | FORMATL "%-35.35s %-8.8s %-9.9s " |
#define | GETTID() getpid() |
#define | LOG_BUF_INIT_SIZE 256 |
#define | MAX_BACKTRACE_FRAMES 20 |
#define | SYSLOG_NAMES |
#define | SYSLOG_NLEVELS sizeof(syslog_level_map) / sizeof(int) |
#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 | |
static void | __init_log_buf (void) |
static void | __init_verbose_buf (void) |
void | ast_backtrace (void) |
void | ast_log (int level, const char *file, int line, const char *function, const char *fmt,...) |
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(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. | |
static void | ast_log_vsyslog (int level, const char *file, int line, const char *function, char *str, long pid) |
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,...) |
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 | 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_show_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
CLI command to show logging system configuration. | |
static int | handle_SIGXFSZ (int sig) |
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_print_verbose (struct logmsg *logmsg) |
Print a verbose message to the verbosers. | |
int | logger_reload (void) |
Reload logger without rotating log files. | |
static void * | logger_thread (void *data) |
Actual logging thread. | |
static 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) |
Variables | |
static struct ast_cli_entry | cli_logger [] |
static int | close_logger_thread |
static int | colors [] |
Colors used in the console for logging. | |
static char | dateformat [256] = "%b %e %T" |
static FILE * | eventlog |
static char | exec_after_rotate [256] = "" |
static int | filesize_reload_needed |
static int | global_logmask = -1 |
static char | hostname [MAXHOSTNAMELEN] |
static char * | levels [] |
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 event_log:1 | |
unsigned int queue_log:1 | |
} | logfiles |
static pthread_t | logthread = AST_PTHREADT_NULL |
static FILE * | qlog |
static char | queue_log_name [256] = QUEUELOG |
static int | syslog_level_map [] |
static struct ast_threadstorage | verbose_buf = { .once = PTHREAD_ONCE_INIT, .key_init = __init_verbose_buf , .custom_init = NULL , } |
Logging routines
Definition in file logger.c.
#define FORMATL "%-35.35s %-8.8s %-9.9s " |
Referenced by handle_logger_show_channels().
#define MAX_BACKTRACE_FRAMES 20 |
#define SYSLOG_NLEVELS sizeof(syslog_level_map) / sizeof(int) |
#define VERBOSE_BUF_INIT_SIZE 256 |
enum logmsgtypes |
enum logtypes |
Definition at line 109 of file logger.c.
00110 { 00111 LOGTYPE_SYSLOG, 00112 LOGTYPE_FILE, 00113 LOGTYPE_CONSOLE,
enum rotatestrategy |
Definition at line 96 of file logger.c.
00097 { 00098 SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */ 00099 ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */ 00100 TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */
void ast_backtrace | ( | void | ) |
Definition at line 1083 of file logger.c.
References ast_calloc, ast_debug, ast_free, ast_log(), free, LOG_WARNING, and MAX_BACKTRACE_FRAMES.
01085 { 01086 #ifdef HAVE_BKTR 01087 int count = 0, i = 0; 01088 void **addresses; 01089 char **strings; 01090 01091 if ((addresses = ast_calloc(MAX_BACKTRACE_FRAMES, sizeof(*addresses)))) { 01092 count = backtrace(addresses, MAX_BACKTRACE_FRAMES); 01093 if ((strings = backtrace_symbols(addresses, count))) { 01094 ast_debug(1, "Got %d backtrace record%c\n", count, count != 1 ? 's' : ' '); 01095 for (i = 0; i < count; i++) { 01096 #if __WORDSIZE == 32 01097 ast_log(LOG_DEBUG, "#%d: [%08X] %s\n", i, (unsigned int)addresses[i], strings[i]); 01098 #elif __WORDSIZE == 64 01099 ast_log(LOG_DEBUG, "#%d: [%016lX] %s\n", i, (unsigned long)addresses[i], strings[i]); 01100 #endif 01101 } 01102 free(strings); 01103 } else { 01104 ast_debug(1, "Could not allocate memory for backtrace\n"); 01105 } 01106 ast_free(addresses); 01107 } 01108 #else 01109 ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n"); 01110 #endif
void ast_log | ( | int | level, | |
const char * | file, | |||
int | line, | |||
const char * | function, | |||
const char * | fmt, | |||
... | ||||
) |
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(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.
level | Type of log event | |
file | Will be provided by the LOG_* macro | |
line | Will be provided by the LOG_* macro | |
function | Will be provided by the LOG_* macro | |
fmt | This is what is important. The format is the same as your favorite breed of printf. You know how that works, right? :-) |
Definition at line 996 of file logger.c.
References __LOG_DEBUG, __LOG_VERBOSE, ast_calloc, ast_cond_signal(), ast_copy_string(), 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_set_va, ast_str_thread_get(), ast_strftime(), ast_tvnow(), buf, GETTID, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, logthread, option_debug, option_verbose, and term_filter_escapes().
Referenced by __adsi_transmit_messages(), __agent_start_monitoring(), __ast_answer(), __ast_channel_alloc_ap(), __ast_check_signature(), __ast_check_signature_bin(), __ast_cli_register(), __ast_cli_unregister(), __ast_custom_function_register(), __ast_decrypt_bin(), __ast_encrypt_bin(), __ast_format_register(), __ast_pbx_run(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_register_translator(), __ast_request_and_dial(), __ast_rtp_reload(), __ast_sign_bin(), __ast_smoother_feed(), __ast_string_field_init(), __ast_udptl_reload(), __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_destroy(), __sip_pretend_ack(), __sip_reliable_xmit(), __sip_xmit(), __transmit_response(), __unload_module(), _ast_adsi_get_cpeid(), _ast_adsi_get_cpeinfo(), _ast_adsi_load_session(), _ast_adsi_transmit_message_full(), _enum_array_map(), _extension_match_core(), _macro_exec(), _while_exec(), accept_thread(), access_counter_file(), acf_channel_read(), acf_channel_write(), acf_curl_exec(), acf_cut_exec(), acf_iaxvar_write(), acf_if(), acf_isexten_exec(), acf_jabberstatus_read(), acf_mailbox_exists(), acf_odbc_read(), acf_odbc_write(), acf_sort_exec(), acf_strftime(), acf_strptime(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_login(), add_agent(), add_agi_cmd(), add_cfg_entry(), add_codec_to_answer(), add_exten_to_pattern_tree(), add_features_datastores(), add_header(), add_in_calls(), add_line(), add_out_calls(), add_realm_authentication(), add_redirect(), add_rt_multi_cfg_entry(), add_sdp(), add_sip_domain(), add_to_agi(), admin_exec(), adsi_begin(), adsi_careful_send(), adsi_process(), adsi_prog(), advanced_options(), agent_answer(), agent_call(), agent_fixup(), agent_get_base_channel(), agent_hangup(), agent_new(), agent_read(), agent_request(), agent_set_base_channel(), agentmonitoroutgoing_exec(), agi_exec_full(), aji_act_hook(), aji_client_connect(), aji_client_info_handler(), aji_create_buddy(), aji_create_client(), aji_dinfo_handler(), aji_ditems_handler(), aji_find_version(), aji_handle_presence(), aji_handle_subscribe(), aji_initialize(), aji_load_config(), aji_pruneregister(), aji_recv(), aji_recv_loop(), aji_register_approve_handler(), aji_register_query_handler(), aji_reload(), aji_send_exec(), 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(), announce_thread(), answer_call(), anti_injection(), ao2_callback(), ao2_ref(), app_exec(), apply_general_options(), apply_option(), apply_outgoing(), aqm_exec(), ast_add_extension2_lockopt(), ast_agi_register(), ast_agi_send(), ast_agi_unregister(), ast_aji_create_chat(), ast_aji_invite_chat(), ast_aji_join_chat(), ast_aji_send_chat(), ast_alaw_init(), ast_app_dtget(), ast_app_parse_options(), ast_app_parse_options64(), ast_append_ha(), ast_async_goto(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_backtrace(), ast_best_codec(), ast_bridge_call(), ast_bridge_call_thread(), ast_call_forward(), ast_careful_fwrite(), ast_carefulwrite(), ast_cdr_alloc(), ast_cdr_end(), ast_cdr_engine_init(), ast_cdr_merge(), ast_cdr_noanswer(), ast_cdr_register(), ast_cdr_serialize_variables(), ast_cdr_setvar(), ast_cdr_submit_batch(), ast_channel_audiohook_count_by_source(), ast_channel_audiohook_count_by_source_running(), ast_channel_bridge(), ast_channel_free(), ast_channel_make_compatible_helper(), ast_channel_masquerade(), ast_channel_queryoption(), ast_channel_register(), ast_channel_setoption(), ast_channel_start_silence_generator(), ast_channel_stop_silence_generator(), ast_check_timing(), ast_codec_get_len(), ast_codec_get_samples(), ast_config_engine_register(), ast_config_internal_load(), ast_context_find_or_create(), ast_context_remove_extension_callerid2(), ast_context_verify_includes(), ast_db_get(), ast_db_gettree(), ast_db_put(), ast_device_state_engine_init(), ast_do_masquerade(), ast_dsp_busydetect(), ast_dsp_call_progress(), ast_dsp_digitdetect(), ast_dsp_process(), ast_dsp_silence(), ast_dtmf_stream(), ast_el_read_char(), ast_enable_packet_fragmentation(), ast_event_check_subscriber(), ast_event_get_cached(), ast_event_new(), ast_event_queue(), ast_event_queue_and_cache(), ast_event_subscribe(), ast_extension_close(), ast_feature_request_and_dial(), ast_filehelper(), ast_find_ourip(), ast_format_unregister(), ast_func_read(), ast_func_write(), ast_get_encoded_char(), ast_get_group(), ast_get_indication_zone(), ast_get_ip_or_srv(), ast_hangup(), 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_make_file_from_fd(), ast_makesocket(), ast_manager_register_struct(), ast_manager_unregister(), ast_merge_contexts_and_delete(), 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_prepare_and_execute(), ast_odbc_request_obj(), ast_odbc_sanity_check(), ast_odbc_smart_execute(), ast_openstream_full(), ast_openvstream(), ast_ouraddrfor(), ast_parse_allow_disallow(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_run_app(), ast_pbx_start(), ast_pickup_call(), ast_playtones_start(), ast_process_pending_reloads(), ast_prod(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_read_generator_actions(), ast_read_image(), ast_read_textfile(), ast_readaudio_callback(), ast_readconfig(), ast_readfile(), ast_readvideo_callback(), ast_record_review(), 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_bridge(), ast_rtp_codec_setpref(), ast_rtp_early_bridge(), ast_rtp_make_compatible(), ast_rtp_new_with_bindaddr(), ast_rtp_proto_register(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_senddigit_begin(), ast_rtp_senddigit_continuation(), ast_rtp_senddigit_end(), ast_rtp_write(), 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_tw(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_tw(), ast_search_dns(), ast_set_priority(), ast_sip_ouraddrfor(), ast_slinfactory_feed(), ast_smoother_read(), ast_speech_register(), ast_stopstream(), ast_streamfile(), ast_stun_request(), ast_tcptls_client_start(), ast_tcptls_server_read(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_tcptls_server_write(), ast_translate_path_steps(), ast_translator_build_path(), ast_tryconnect(), ast_udptl_bridge(), ast_udptl_get_error_correction_scheme(), ast_udptl_get_far_max_datagram(), ast_udptl_get_local_max_datagram(), ast_udptl_new_with_bindaddr(), ast_udptl_offered_from_local(), ast_udptl_proto_register(), ast_udptl_read(), ast_udptl_set_error_correction_scheme(), ast_udptl_set_far_max_datagram(), ast_udptl_set_local_max_datagram(), ast_udptl_write(), ast_ulaw_init(), ast_unload_resource(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_unregister_indication_country(), ast_verbose(), ast_wait_for_output(), ast_waitfor_nandfds(), ast_waitfordigit_full(), ast_write(), ast_writefile(), ast_writestream(), ast_yyerror(), async_wait(), asyncgoto_exec(), attempt_reconnect(), attempt_thread(), attempt_transfer(), audiohook_read_frame_both(), auth_exec(), authenticate(), authenticate_reply(), authenticate_verify(), auto_congest(), autoservice_run(), available(), background_detect_exec(), base64_decode(), base64_encode(), base_encode(), board_setup(), bridge_exec(), bridge_native_loop(), build_alias(), build_channels(), build_conf(), build_device(), build_filename(), build_gateway(), build_mapping(), build_peer(), build_reply_digest(), build_route(), build_rpid(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), bump_gains(), cache_get_callno_locked(), calc_cost(), calc_metric(), callerid_feed(), callerid_feed_jp(), callerid_get_dtmf(), callerid_read(), callerid_write(), callerpres_write(), canary_thread(), canmatch(), careful_write(), cb_events(), cb_extensionstate(), cdr_handler(), cdr_merge_vars(), chan_misdn_log(), chan_ringing(), chanavail_exec(), chandup(), channel_admin_exec(), channel_to_session(), chanspy_exec(), check_access(), check_auth(), check_compat(), check_for_conference(), check_header(), check_key(), check_post(), check_rtp_timeout(), check_srcaddr(), check_user_full(), check_vars(), check_via(), cleanup_connection(), clear_caller(), clearcbone(), cleardisplay(), clearflag(), cleartimer(), cli_prompt(), close_call(), close_client(), close_mailbox(), 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_queue_rule_show(), complete_span_helper(), complete_transfer(), compose_func_args(), compress_subclass(), conf_add(), conf_del(), conf_exec(), conf_flush(), conf_queue_dtmf(), conf_run(), config_curl(), config_handler(), config_ldap(), config_module(), config_odbc(), config_pgsql(), config_text_file_load(), connection_made(), console_autoanswer(), console_cmd(), console_indicate(), console_request(), console_video_start(), context_merge(), controlplayback_exec(), convertcap(), copy(), copy_header(), copy_message(), copy_rules(), copy_via_headers(), count_exec(), create_addr(), create_dirpath(), create_jb(), create_match_char_tree(), create_queue_member(), create_video_frame(), create_vmaccount(), crypto_load(), csv_log(), 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_get_index(), dahdi_handle_dtmfup(), dahdi_handle_event(), dahdi_hangup(), dahdi_indicate(), dahdi_link(), dahdi_new(), dahdi_open(), dahdi_pri_error(), dahdi_pri_message(), dahdi_read(), dahdi_request(), dahdi_restart(), dahdi_ring_phone(), dahdi_sendtext(), dahdi_set_hook(), dahdi_setoption(), dahdi_show_channel(), dahdi_train_ec(), dahdi_translate(), dahdi_write(), dahdi_write_frame(), dahdiras_exec(), dbinit(), deadagi_exec(), dec_init(), del_exec(), destroy_curl(), destroy_odbc(), destroy_pgsql(), destroy_session(), destroy_trans(), device_state_cb(), devstate_write(), dial_exec_full(), dialgroup_read(), dialgroup_write(), dictate_exec(), digitcollect(), digitdirect(), directory_exec(), disa_exec(), disable_jack_hook(), display_last_error(), dns_parse_answer(), dnsmgr_init(), dnsmgr_refresh(), do_autokill(), do_directory(), do_forward(), do_idle_thread(), do_monitor(), do_parking_thread(), do_register(), do_reload(), do_say(), do_scheduler(), do_timelimit(), do_waiting(), dump_agents(), 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_query(), dundi_query_read(), dundi_result_read(), dundi_rexmit(), dundi_send(), dundi_xmit(), dundifunc_read(), eagi_exec(), enable_jack_hook(), encode_open_type(), enum_callback(), enum_query_read(), enum_result_read(), eventhandler(), exec(), exec_exec(), execif_exec(), exists(), ext_cmp1(), extenspy_exec(), external_rtp_create(), extstate_read(), fax_generator_generate(), fbuf_append(), feature_exec_app(), features_alloc(), features_call(), features_new(), festival_exec(), ffmpeg_decode(), ffmpeg_encode(), file_read(), filter(), find_account(), find_cache(), find_call_locked(), find_conf(), find_conf_realtime(), find_desc(), find_line_by_instance(), find_matching_endwhile(), find_or_create(), 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_transcoders(), findmeexec(), finish_bookmark(), flash_exec(), fn_wrapper(), forkcdr_exec(), forward_message(), framein(), func_args(), func_channel_read(), func_channel_write(), 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_gosub(), function_ilink(), function_realtime_read(), function_realtime_readdestroy(), function_realtime_store(), function_realtime_write(), function_sipchaninfo_read(), function_sippeer(), function_txtcidname(), g723_len(), g723_read(), g723_write(), g726_read(), g726_write(), g729_read(), g729_write(), generic_execute(), generic_prepare(), get_agi_cmd(), get_alarms(), get_also_info(), get_button_template(), get_canmatch_exten(), get_destination(), get_in_brackets(), get_input(), get_ip_and_port_from_sdp(), get_lock(), get_member_penalty(), get_mohbyname(), get_params(), get_range(), get_rdnis(), get_refer_info(), get_timerange(), get_to_address(), get_token(), 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_write(), gsmtolin_framein(), gtalk_alloc(), gtalk_call(), gtalk_create_candidates(), gtalk_create_member(), gtalk_digit(), gtalk_free_pvt(), gtalk_handle_dtmf(), gtalk_hangup_farend(), gtalk_indicate(), gtalk_invite(), gtalk_invite_response(), gtalk_is_accepted(), gtalk_is_answered(), gtalk_load_config(), gtalk_new(), gtalk_newcall(), gtalk_parser(), gtalk_request(), gtalk_sendhtml(), gtalk_show_channels(), gtalk_write(), gui_init(), h261_decap(), h263_decap(), h263_encap(), h263_open(), h263_read(), h263_write(), h263p_decap(), h263p_encap(), h264_decap(), h264_encap(), h264_open(), h264_read(), h264_write(), handle_alarms(), handle_callforward_button(), handle_capabilities_res_message(), handle_cli_agi_add_cmd(), handle_cli_h323_cycle_gk(), handle_cli_indication_add(), handle_cli_indication_remove(), handle_cli_radio_tune(), handle_cli_rpt_lstats(), handle_command_response(), handle_common_options(), 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_link_data(), handle_message(), handle_mousedown(), handle_offhook_message(), handle_onhook_message(), handle_open_receive_channel_ack_message(), handle_options(), handle_playtones(), handle_recordfile(), handle_register_message(), handle_remote_data(), handle_request(), handle_request_bye(), handle_request_do(), handle_request_info(), handle_request_invite(), handle_request_notify(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_response_peerpoke(), handle_response_refer(), handle_response_register(), handle_soft_key_event_message(), handle_stimulus_message(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hidthread(), hint_read(), httpd_helper_thread(), iax2_ack_registry(), 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_read(), iax2_register(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax_error_output(), iax_frame_wrap(), iax_park(), iax_park_thread(), iax_process_template(), iax_provision_reload(), iax_template_parse(), ices_exec(), icesencode(), iconv_read(), iftime(), ilbc_read(), ilbc_write(), ilbctolin_framein(), import_ch(), in_band_indication(), increase_call_count(), ind_load_module(), indexof(), init_acf_query(), init_app_class(), init_jack_data(), init_logger(), init_req(), init_resp(), insert_penaltychange(), inspect_module(), 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_show_channels(), jingle_write(), jpeg_read_image(), jpeg_write_image(), key_call(), Keyfavorite(), keypad_cfg_read(), keypad_pick_up(), keypad_setup(), keypad_toggle(), kp_match_area(), launch_asyncagi(), 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(), load_column_config(), load_config(), load_config_meetme(), load_dynamic_module(), load_module(), load_modules(), load_moh_classes(), load_odbc_config(), load_or_reload_lua_stuff(), load_pbx(), load_realtime_queue(), load_resource(), load_rpt_vars(), load_values_config(), local_alloc(), local_answer(), local_ast_moh_start(), local_devicestate(), local_fixup(), local_new(), local_write(), log_exec(), log_jack_status(), logger_print_normal(), login_exec(), lookup_iface(), lpc10tolin_framein(), lua_find_extension(), lua_get_state(), lua_read_extensions_file(), macroif_exec(), main(), make_email_file(), make_number(), make_str(), make_trunk(), manager_modulecheck(), manager_show_dialplan_helper(), map_video_codec(), masq_park_call(), matchmore(), math(), md5(), measurenoise(), 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_exec(), milliwatt_generate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_delete_exec(), minivm_greet_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_generator(), moh_files_release(), moh_generate(), moh_register(), moh_release(), moh_scan_files(), mohalloc(), monmp3thread(), morsecode_exec(), mp3_exec(), mp3play(), mpeg4_decode(), mssql_connect(), mwi_thread(), 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(), ogg_vorbis_open(), ogg_vorbis_read(), ogg_vorbis_rewrite(), ogg_vorbis_seek(), ogg_vorbis_tell(), 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(), OpenHistory(), osp_check_destination(), osp_create_provider(), osp_load(), ospauth_exec(), ospfinished_exec(), osplookup_exec(), ospnext_exec(), oss_indicate(), oss_new(), oss_request(), page_exec(), park_call_full(), park_exec(), park_space_reserve(), parkandannounce_exec(), parse(), parse_args(), parse_config(), parse_cookies(), parse_gain_value(), parse_ie(), parse_minse(), parse_naptr(), parse_register_contact(), parse_session_expires(), parse_srv(), ParseBookmark(), parsing(), 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_write(), peer_set_srcaddr(), 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_do(), pickup_exec(), pickupchan_exec(), play_message(), play_message_category(), play_message_datetime(), play_moh_exec(), play_record_review(), playback_exec(), playtones_alloc(), playtones_generator(), pop_exec(), powerof(), pqm_exec(), precache_trans(), precache_transactions(), prep_email_sub_vars(), pri_create_spanmap(), pri_create_trunkgroup(), pri_dchannel(), pri_fixup_principle(), pri_resolve_span(), privacy_exec(), proc_422_rsp(), proc_session_timer(), process_ast_dsp(), process_dahdi(), process_echocancel(), process_opcode(), process_request(), process_request_queue(), process_returncode(), process_rfc2833(), process_rfc3389(), process_sdp(), process_text_line(), profile_set_param(), progress(), proxy_update(), purge_old_messages(), pw_cb(), ql_exec(), queue_exec(), 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(), radius_log(), rbi_out(), rcv_mac_addr(), rcvfax_exec(), read_agent_config(), read_config(), read_config_maps(), read_exec(), read_samples(), readexten_exec(), readfile_exec(), realtime_curl(), realtime_destroy_handler(), realtime_directory(), realtime_handler(), realtime_ldap_base_ap(), realtime_multi_curl(), realtime_multi_handler(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_odbc(), realtime_pgsql(), realtime_store_handler(), realtime_update_handler(), receive_digit(), receive_message(), record_exec(), refresh_list(), regex(), register_exten(), register_group(), register_group_feature(), register_peer_exten(), register_verify(), registry_rerequest(), reload(), reload_agents(), reload_config(), reload_firmware(), reload_followme(), reload_logger(), reload_queue_members(), reload_queue_rules(), reload_queues(), remove_by_peercallno(), remove_by_transfercallno(), remove_from_queue(), reply_digest(), resample_frame(), reset_conf(), restart_monitor(), restart_session_timer(), restore_conference(), restore_gains(), retrans_pkt(), retrydial_exec(), return_exec(), rotate_file(), rpt(), rpt_call(), rpt_exec(), rpt_master(), rpt_tele_thread(), rpt_telemetry(), rqm_exec(), rtp_socket(), run_agi(), run_externnotify(), run_ras(), s_streamwait3(), safe_append(), save_conference(), save_to_folder(), say_init_mode(), saycharstr(), saydigits(), sayfile(), saynum(), scan_service(), scan_thread(), scheduled_destroy(), sdl_setup(), select_entry(), send_callerid(), send_client(), send_delay(), send_dtmf(), send_request(), send_retransmit(), send_select_output(), send_tone_burst(), send_waveform_to_channel(), send_waveform_to_fd(), senddtmf_exec(), sendimage_exec(), sendmail(), sendpage(), sendtext_exec(), sendurl_exec(), session_do(), set(), set_active(), set_bridge_features_on_config(), set_config(), set_destination(), set_format(), set_full_cmd(), set_insecure_flags(), set_member_paused(), set_member_penalty(), set_moh_exec(), set_state(), set_timing(), set_ulimit(), set_var(), setcallerid_pres_exec(), setflag(), setformat(), setup_dahdi(), setup_incoming_call(), setup_privacy_args(), setup_rtp_connection(), setup_transfer_datastore(), sha1(), shared_read(), shared_write(), shell_helper(), show_dialplan_helper(), showdisplay(), showkeys(), sip_addheader(), sip_alloc(), sip_call(), sip_dtmfmode(), sip_dump_history(), sip_fixup(), sip_hangup(), sip_indicate(), sip_new(), sip_notify(), sip_park(), sip_park_thread(), sip_parse_host(), sip_poke_noanswer(), sip_poke_peer(), sip_queryoption(), sip_reg_timeout(), sip_register(), sip_request_call(), sip_reregister(), sip_scheddestroy(), sip_sendhtml(), sip_sipredirect(), sip_st_alloc(), sip_write(), sipsock_read(), skel_exec(), skinny_call(), skinny_fixup(), skinny_indicate(), skinny_new(), skinny_newcall(), skinny_register(), skinny_req_parse(), skinny_request(), skinny_ss(), 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_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_messagerx2(), sms_process(), sms_readfile(), sndfax_exec(), socket_process(), socket_process_meta(), socket_read(), softhangup_exec(), soundcard_init(), soundcard_writeframe(), span_message(), spawn_dp_lookup(), spawn_mp3(), spawn_ras(), speex_get_wb_sz_at(), speex_samples(), speextolin_framein(), spy_generate(), sqlite3_log(), sqlite_log(), ss_thread(), start_moh_exec(), start_monitor_exec(), start_network_thread(), start_pri(), start_rtp(), start_session_timer(), start_spying(), start_stream(), starttimer(), static_callback(), 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_rxcdtype(), store_rxdemod(), store_rxsdtype(), store_txmixa(), store_txmixb(), store_txtoctype(), stub_ast_key_get(), subscript(), substitute_escapes(), swap_subs(), sysinfo_helper(), 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(), timezone_add(), timing_read(), to_number(), to_string(), tonepair_alloc(), tonepair_generator(), transfer_exec(), TransferCallStep1(), transmit(), transmit_audio(), 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(), tune_rxctcss(), tune_rxinput(), tune_rxvoice(), tvfix(), udptl_build_packet(), 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(), unregister_exten(), update_call_counter(), update_common_options(), update_config(), update_curl(), update_header(), update_key(), update_ldap(), update_odbc(), update_pgsql(), update_registry(), update_scoreboard(), upqm_exec(), uridecode(), uriencode(), usbradio_fixup(), usbradio_indicate(), usbradio_new(), usbradio_read(), usbradio_request(), usbradio_write(), used_blocks(), userevent_exec(), verbose_exec(), vm_authenticate(), vm_box_exists(), vm_change_password(), vm_exec(), vm_execmain(), vm_newuser(), vm_options(), vox_read(), vox_write(), wait_file(), wait_file2(), wait_for_answer(), wait_for_winner(), wait_interval(), wait_moh_exec(), waitforring_exec(), waitforsilence_exec(), waitstream_core(), waituntil_exec(), wav_close(), wav_read(), wav_seek(), wav_write(), write_header(), write_history(), write_stream(), and writefile().
00998 { 00999 struct logmsg *logmsg = NULL; 01000 struct ast_str *buf = NULL; 01001 struct ast_tm tm; 01002 struct timeval tv = ast_tvnow(); 01003 int res = 0; 01004 va_list ap; 01005 01006 if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) 01007 return; 01008 01009 if (AST_RWLIST_EMPTY(&logchannels)) { 01010 /* 01011 * we don't have the logger chain configured yet, 01012 * so just log to stdout 01013 */ 01014 if (level != __LOG_VERBOSE) { 01015 int res; 01016 va_start(ap, fmt); 01017 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */ 01018 va_end(ap); 01019 if (res != AST_DYNSTR_BUILD_FAILED) { 01020 term_filter_escapes(buf->str); 01021 fputs(buf->str, stdout); 01022 } 01023 } 01024 return; 01025 } 01026 01027 /* don't display LOG_DEBUG messages unless option_verbose _or_ option_debug 01028 are non-zero; LOG_DEBUG messages can still be displayed if option_debug 01029 is zero, if option_verbose is non-zero (this allows for 'level zero' 01030 LOG_DEBUG messages to be displayed, if the logmask on any channel 01031 allows it) 01032 */ 01033 if (!option_verbose && !option_debug && (level == __LOG_DEBUG)) 01034 return; 01035 01036 /* Ignore anything that never gets logged anywhere */ 01037 if (!(global_logmask & (1 << level))) 01038 return; 01039 01040 /* Build string */ 01041 va_start(ap, fmt); 01042 res = ast_str_set_va(&buf, BUFSIZ, fmt, ap); 01043 va_end(ap); 01044 01045 /* If the build failed, then abort and free this structure */ 01046 if (res == AST_DYNSTR_BUILD_FAILED) 01047 return; 01048 01049 /* Create a new logging message */ 01050 if (!(logmsg = ast_calloc(1, sizeof(*logmsg) + res + 1))) 01051 return; 01052 01053 /* Copy string over */ 01054 strcpy(logmsg->str, buf->str); 01055 01056 /* Set type to be normal */ 01057 logmsg->type = LOGMSG_NORMAL; 01058 01059 /* Create our date/time */ 01060 ast_localtime(&tv, &tm, NULL); 01061 ast_strftime(logmsg->date, sizeof(logmsg->date), dateformat, &tm); 01062 01063 /* Copy over data */ 01064 logmsg->level = level; 01065 logmsg->line = line; 01066 ast_copy_string(logmsg->file, file, sizeof(logmsg->file)); 01067 ast_copy_string(logmsg->function, function, sizeof(logmsg->function)); 01068 logmsg->process_id = (long) GETTID(); 01069 01070 /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */ 01071 if (logthread != AST_PTHREADT_NULL) { 01072 AST_LIST_LOCK(&logmsgs); 01073 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01074 ast_cond_signal(&logcond); 01075 AST_LIST_UNLOCK(&logmsgs); 01076 } else { 01077 logger_print_normal(logmsg); 01078 ast_free(logmsg); 01079 } 01080 01081 return;
static void ast_log_vsyslog | ( | int | level, | |
const char * | file, | |||
int | line, | |||
const char * | function, | |||
char * | str, | |||
long | pid | |||
) | [static] |
Definition at line 744 of file logger.c.
References __LOG_DEBUG, __LOG_DTMF, __LOG_VERBOSE, buf, levels, SYSLOG_NLEVELS, and term_strip().
Referenced by logger_print_normal().
00746 { 00747 char buf[BUFSIZ]; 00748 00749 if (level >= SYSLOG_NLEVELS) { 00750 /* we are locked here, so cannot ast_log() */ 00751 fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", level); 00752 return; 00753 } 00754 00755 if (level == __LOG_VERBOSE) { 00756 snprintf(buf, sizeof(buf), "VERBOSE[%ld]: %s", pid, str); 00757 level = __LOG_DEBUG; 00758 } else if (level == __LOG_DTMF) { 00759 snprintf(buf, sizeof(buf), "DTMF[%ld]: %s", pid, str); 00760 level = __LOG_DEBUG; 00761 } else { 00762 snprintf(buf, sizeof(buf), "%s[%ld]: %s:%d in %s: %s", 00763 levels[level], pid, file, line, function, str); 00764 } 00765 00766 term_strip(buf, buf, strlen(buf) + 1); 00767 syslog(syslog_level_map[level], "%s", buf);
void ast_queue_log | ( | const char * | queuename, | |
const char * | callid, | |||
const char * | agent, | |||
const char * | event, | |||
const char * | fmt, | |||
... | ||||
) |
Definition at line 411 of file logger.c.
References ast_check_realtime(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_store_realtime(), and qlog.
Referenced by agent_logoff_maintenance(), aqm_exec(), handle_queue_add_member(), handle_queue_remove_member(), init_logger(), 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(), set_member_paused(), set_member_penalty(), and wait_our_turn().
00413 { 00414 va_list ap; 00415 char qlog_msg[8192]; 00416 int qlog_len; 00417 char time_str[16]; 00418 00419 if (ast_check_realtime("queue_log")) { 00420 va_start(ap, fmt); 00421 vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap); 00422 va_end(ap); 00423 snprintf(time_str, sizeof(time_str), "%ld", (long)time(NULL)); 00424 ast_store_realtime("queue_log", "time", time_str, 00425 "callid", callid, 00426 "queuename", queuename, 00427 "agent", agent, 00428 "event", event, 00429 "data", qlog_msg, 00430 NULL); 00431 } else { 00432 if (qlog) { 00433 va_start(ap, fmt); 00434 qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); 00435 vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap); 00436 va_end(ap); 00437 } 00438 AST_RWLIST_RDLOCK(&logchannels); 00439 if (qlog) { 00440 fprintf(qlog, "%s\n", qlog_msg); 00441 fflush(qlog); 00442 } 00443 AST_RWLIST_UNLOCK(&logchannels); 00444 }
int ast_register_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1171 of file logger.c.
References ast_malloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::list, and verb.
Referenced by ast_makesocket(), main(), and show_console().
01173 { 01174 struct verb *verb; 01175 01176 if (!(verb = ast_malloc(sizeof(*verb)))) 01177 return -1; 01178 01179 verb->verboser = v; 01180 01181 AST_RWLIST_WRLOCK(&verbosers); 01182 AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); 01183 AST_RWLIST_UNLOCK(&verbosers); 01184 01185 return 0;
int ast_unregister_verbose | ( | void(*)(const char *string) | v | ) |
Definition at line 1187 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.
Referenced by exit_now().
01189 { 01190 struct verb *cur; 01191 01192 AST_RWLIST_WRLOCK(&verbosers); 01193 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { 01194 if (cur->verboser == v) { 01195 AST_RWLIST_REMOVE_CURRENT(list); 01196 ast_free(cur); 01197 break; 01198 } 01199 } 01200 AST_RWLIST_TRAVERSE_SAFE_END; 01201 AST_RWLIST_UNLOCK(&verbosers); 01202 01203 return cur ? 0 : -1;
void ast_verbose | ( | 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 1112 of file logger.c.
References ast_calloc, ast_cond_signal(), AST_DYNSTR_BUILD_FAILED, ast_free, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_localtime(), ast_log(), ast_opt_timestamp, AST_PTHREADT_NULL, ast_str_set_va, ast_str_thread_get(), ast_strftime(), ast_tvnow(), buf, logchannel::list, LOG_VERBOSE, logcond, logger_print_verbose(), LOGMSG_VERBOSE, logthread, verbose_buf, and VERBOSE_BUF_INIT_SIZE.
Referenced by __agent_start_monitoring(), __ast_str_helper(), __sip_destroy(), add_codec_to_sdp(), add_noncodec_to_sdp(), add_sdp(), add_tcodec_to_sdp(), add_vcodec_to_sdp(), aji_handle_presence(), aji_handle_subscribe(), aji_log_hook(), aji_test(), alsa_answer(), alsa_call(), alsa_digit(), alsa_hangup(), alsa_indicate(), alsa_text(), ao2_bt(), ast_agi_send(), ast_frame_dump(), ast_module_reload(), ast_remotecontrol(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_destroy(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_senddigit_begin(), ast_rtp_senddigit_continuation(), ast_rtp_senddigit_end(), ast_say_enumeration_full_he(), ast_say_number_full_he(), ast_set_priority(), astman_append(), auth_headers(), bridge_p2p_rtp_write(), check_peer_ok(), check_user_ok(), check_via(), conf_run(), dahdi_pri_message(), dahdi_request(), dahdi_softhangup_all(), destroy_all_channels(), do_register_auth(), dumpchan_exec(), dundi_debug_output(), find_command(), find_gtalk(), find_transcoders(), get_also_info(), get_destination(), get_rdnis(), get_refer_info(), gtalk_do_reload(), gtalk_handle_dtmf(), h323_reload(), handle_cli_misdn_send_facility(), handle_frame(), handle_incoming(), handle_request(), handle_request_do(), handle_request_info(), handle_request_invite(), handle_request_message(), handle_request_refer(), handle_request_subscribe(), handle_response(), iax_debug_output(), init_files_class(), initialize_initreq(), ivr_demo_func(), jb_debug_output(), jingle_handle_dtmf(), list_route(), load_module(), load_resource(), main(), mgcp_reload(), mgcpsock_read(), moh_files_release(), oss_answer(), oss_call(), oss_digit_end(), oss_hangup(), oss_indicate(), oss_text(), parse(), parse_register_contact(), phone_check_exception(), phone_exception(), process_sdp(), quit_handler(), receive_message(), resend_response(), retrans_pkt(), run_agi(), send_request(), send_response(), set_destination(), sip_reload(), sip_rtp_read(), sip_scheddestroy(), sip_sendtext(), stun_handle_packet(), stun_process_attr(), timeout_write(), timing_read(), transmit_register(), and verbose_exec().
01114 { 01115 struct logmsg *logmsg = NULL; 01116 struct ast_str *buf = NULL; 01117 int res = 0; 01118 va_list ap; 01119 01120 if (!(buf = ast_str_thread_get(&verbose_buf, VERBOSE_BUF_INIT_SIZE))) 01121 return; 01122 01123 if (ast_opt_timestamp) { 01124 struct timeval tv; 01125 struct ast_tm tm; 01126 char date[40]; 01127 char *datefmt; 01128 01129 tv = ast_tvnow(); 01130 ast_localtime(&tv, &tm, NULL); 01131 ast_strftime(date, sizeof(date), dateformat, &tm); 01132 datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1); 01133 sprintf(datefmt, "%c[%s] %s", 127, date, fmt); 01134 fmt = datefmt; 01135 } else { 01136 char *tmp = alloca(strlen(fmt) + 2); 01137 sprintf(tmp, "%c%s", 127, fmt); 01138 fmt = tmp; 01139 } 01140 01141 /* Build string */ 01142 va_start(ap, fmt); 01143 res = ast_str_set_va(&buf, 0, fmt, ap); 01144 va_end(ap); 01145 01146 /* If the build failed then we can drop this allocated message */ 01147 if (res == AST_DYNSTR_BUILD_FAILED) 01148 return; 01149 01150 if (!(logmsg = ast_calloc(1, sizeof(*logmsg) + res + 1))) 01151 return; 01152 01153 strcpy(logmsg->str, buf->str); 01154 01155 ast_log(LOG_VERBOSE, "%s", logmsg->str + 1); 01156 01157 /* Set type */ 01158 logmsg->type = LOGMSG_VERBOSE; 01159 01160 /* Add to the list and poke the thread if possible */ 01161 if (logthread != AST_PTHREADT_NULL) { 01162 AST_LIST_LOCK(&logmsgs); 01163 AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list); 01164 ast_cond_signal(&logcond); 01165 AST_LIST_UNLOCK(&logmsgs); 01166 } else { 01167 logger_print_verbose(logmsg); 01168 ast_free(logmsg); 01169 }
void close_logger | ( | void | ) |
Provided by logger.c
Definition at line 954 of file logger.c.
References ast_cond_signal(), AST_LIST_LOCK, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, close_logger_thread, eventlog, f, logchannel::list, logcond, logthread, and qlog.
Referenced by quit_handler().
00956 { 00957 struct logchannel *f = NULL; 00958 00959 /* Stop logger thread */ 00960 AST_LIST_LOCK(&logmsgs); 00961 close_logger_thread = 1; 00962 ast_cond_signal(&logcond); 00963 AST_LIST_UNLOCK(&logmsgs); 00964 00965 if (logthread != AST_PTHREADT_NULL) 00966 pthread_join(logthread, NULL); 00967 00968 AST_RWLIST_WRLOCK(&logchannels); 00969 00970 if (eventlog) { 00971 fclose(eventlog); 00972 eventlog = NULL; 00973 } 00974 00975 if (qlog) { 00976 fclose(qlog); 00977 qlog = NULL; 00978 } 00979 00980 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 00981 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00982 fclose(f->fileptr); 00983 f->fileptr = NULL; 00984 } 00985 } 00986 00987 closelog(); /* syslog */ 00988 00989 AST_RWLIST_UNLOCK(&logchannels); 00990 00991 return;
static char* handle_logger_reload | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 640 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.
00642 { 00643 switch (cmd) { 00644 case CLI_INIT: 00645 e->command = "logger reload"; 00646 e->usage = 00647 "Usage: logger reload\n" 00648 " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n"; 00649 return NULL; 00650 case CLI_GENERATE: 00651 return NULL; 00652 } 00653 if (reload_logger(0)) { 00654 ast_cli(a->fd, "Failed to reload the logger\n"); 00655 return CLI_FAILURE; 00656 } 00657 return CLI_SUCCESS;
static char* handle_logger_rotate | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 659 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.
00661 { 00662 switch (cmd) { 00663 case CLI_INIT: 00664 e->command = "logger rotate"; 00665 e->usage = 00666 "Usage: logger rotate\n" 00667 " Rotates and Reopens the log files.\n"; 00668 return NULL; 00669 case CLI_GENERATE: 00670 return NULL; 00671 } 00672 if (reload_logger(1)) { 00673 ast_cli(a->fd, "Failed to reload the logger and rotate log files\n"); 00674 return CLI_FAILURE; 00675 } 00676 return CLI_SUCCESS;
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 679 of file logger.c.
References __LOG_DEBUG, __LOG_DTMF, __LOG_ERROR, __LOG_EVENT, __LOG_NOTICE, __LOG_VERBOSE, __LOG_WARNING, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, chan, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, FORMATL, logchannel::list, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, and ast_cli_entry::usage.
00681 { 00682 #define FORMATL "%-35.35s %-8.8s %-9.9s " 00683 struct logchannel *chan; 00684 switch (cmd) { 00685 case CLI_INIT: 00686 e->command = "logger show channels"; 00687 e->usage = 00688 "Usage: logger show channels\n" 00689 " List configured logger channels.\n"; 00690 return NULL; 00691 case CLI_GENERATE: 00692 return NULL; 00693 } 00694 ast_cli(a->fd, FORMATL, "Channel", "Type", "Status"); 00695 ast_cli(a->fd, "Configuration\n"); 00696 ast_cli(a->fd, FORMATL, "-------", "----", "------"); 00697 ast_cli(a->fd, "-------------\n"); 00698 AST_RWLIST_RDLOCK(&logchannels); 00699 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00700 ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), 00701 chan->disabled ? "Disabled" : "Enabled"); 00702 ast_cli(a->fd, " - "); 00703 if (chan->logmask & (1 << __LOG_DEBUG)) 00704 ast_cli(a->fd, "Debug "); 00705 if (chan->logmask & (1 << __LOG_DTMF)) 00706 ast_cli(a->fd, "DTMF "); 00707 if (chan->logmask & (1 << __LOG_VERBOSE)) 00708 ast_cli(a->fd, "Verbose "); 00709 if (chan->logmask & (1 << __LOG_WARNING)) 00710 ast_cli(a->fd, "Warning "); 00711 if (chan->logmask & (1 << __LOG_NOTICE)) 00712 ast_cli(a->fd, "Notice "); 00713 if (chan->logmask & (1 << __LOG_ERROR)) 00714 ast_cli(a->fd, "Error "); 00715 if (chan->logmask & (1 << __LOG_EVENT)) 00716 ast_cli(a->fd, "Event "); 00717 ast_cli(a->fd, "\n"); 00718 } 00719 AST_RWLIST_UNLOCK(&logchannels); 00720 ast_cli(a->fd, "\n"); 00721 00722 return CLI_SUCCESS;
static int handle_SIGXFSZ | ( | int | sig | ) | [static] |
Definition at line 737 of file logger.c.
Referenced by init_logger().
00739 { 00740 /* Indicate need to reload */ 00741 filesize_reload_needed = 1; 00742 return 0;
int init_logger | ( | void | ) |
Provided by logger.c
Definition at line 910 of file logger.c.
References ast_cli_register_multiple(), ast_cond_destroy(), ast_cond_init(), ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_pthread_create, ast_queue_log(), ast_verb, cli_logger, errno, EVENTLOG, eventlog, handle_SIGXFSZ(), init_logger_chain(), LOG_ERROR, LOG_EVENT, logcond, logfiles, logger_thread(), logthread, and qlog.
Referenced by main().
00912 { 00913 char tmp[256]; 00914 int res = 0; 00915 00916 /* auto rotate if sig SIGXFSZ comes a-knockin */ 00917 (void) signal(SIGXFSZ, (void *) handle_SIGXFSZ); 00918 00919 /* start logger thread */ 00920 ast_cond_init(&logcond, NULL); 00921 if (ast_pthread_create(&logthread, NULL, logger_thread, NULL) < 0) { 00922 ast_cond_destroy(&logcond); 00923 return -1; 00924 } 00925 00926 /* register the logger cli commands */ 00927 ast_cli_register_multiple(cli_logger, sizeof(cli_logger) / sizeof(struct ast_cli_entry)); 00928 00929 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 00930 00931 /* create log channels */ 00932 init_logger_chain(0 /* locked */); 00933 00934 /* create the eventlog */ 00935 if (logfiles.event_log) { 00936 snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG); 00937 eventlog = fopen(tmp, "a"); 00938 if (eventlog) { 00939 ast_log(LOG_EVENT, "Started Asterisk Event Logger\n"); 00940 ast_verb(1, "Asterisk Event Logger Started %s\n", tmp); 00941 } else { 00942 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); 00943 res = -1; 00944 } 00945 } 00946 00947 if (logfiles.queue_log) { 00948 snprintf(tmp, sizeof(tmp), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00949 qlog = fopen(tmp, "a"); 00950 ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", ""); 00951 } 00952 return res;
static void init_logger_chain | ( | int | locked | ) | [static] |
Definition at line 315 of file logger.c.
References ast_calloc, ast_config_destroy(), ast_config_load, 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(), chan, errno, logchannel::list, logfiles, LOGTYPE_CONSOLE, make_logchannel(), ROTATE, s, SEQUENTIAL, TIMESTAMP, and var.
Referenced by init_logger(), and reload_logger().
00317 { 00318 struct logchannel *chan; 00319 struct ast_config *cfg; 00320 struct ast_variable *var; 00321 const char *s; 00322 struct ast_flags config_flags = { 0 }; 00323 00324 if (!(cfg = ast_config_load("logger.conf", config_flags))) 00325 return; 00326 00327 /* delete our list of log channels */ 00328 if (!locked) 00329 AST_RWLIST_WRLOCK(&logchannels); 00330 while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) 00331 ast_free(chan); 00332 if (!locked) 00333 AST_RWLIST_UNLOCK(&logchannels); 00334 00335 global_logmask = 0; 00336 errno = 0; 00337 /* close syslog */ 00338 closelog(); 00339 00340 /* If no config file, we're fine, set default options. */ 00341 if (!cfg) { 00342 if (errno) 00343 fprintf(stderr, "Unable to open logger.conf: %s; default settings will be used.\n", strerror(errno)); 00344 else 00345 fprintf(stderr, "Errors detected in logger.conf: see above; default settings will be used.\n"); 00346 if (!(chan = ast_calloc(1, sizeof(*chan)))) 00347 return; 00348 chan->type = LOGTYPE_CONSOLE; 00349 chan->logmask = 28; /*warning,notice,error */ 00350 if (!locked) 00351 AST_RWLIST_WRLOCK(&logchannels); 00352 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00353 if (!locked) 00354 AST_RWLIST_UNLOCK(&logchannels); 00355 global_logmask |= chan->logmask; 00356 return; 00357 } 00358 00359 if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) { 00360 if (ast_true(s)) { 00361 if (gethostname(hostname, sizeof(hostname) - 1)) { 00362 ast_copy_string(hostname, "unknown", sizeof(hostname)); 00363 fprintf(stderr, "What box has no hostname???\n"); 00364 } 00365 } else 00366 hostname[0] = '\0'; 00367 } else 00368 hostname[0] = '\0'; 00369 if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) 00370 ast_copy_string(dateformat, s, sizeof(dateformat)); 00371 else 00372 ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat)); 00373 if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) 00374 logfiles.queue_log = ast_true(s); 00375 if ((s = ast_variable_retrieve(cfg, "general", "event_log"))) 00376 logfiles.event_log = ast_true(s); 00377 if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) 00378 ast_copy_string(queue_log_name, s, sizeof(queue_log_name)); 00379 if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) 00380 ast_copy_string(exec_after_rotate, s, sizeof(exec_after_rotate)); 00381 if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) { 00382 if (strcasecmp(s, "timestamp") == 0) 00383 rotatestrategy = TIMESTAMP; 00384 else if (strcasecmp(s, "rotate") == 0) 00385 rotatestrategy = ROTATE; 00386 else if (strcasecmp(s, "sequential") == 0) 00387 rotatestrategy = SEQUENTIAL; 00388 else 00389 fprintf(stderr, "Unknown rotatestrategy: %s\n", s); 00390 } else { 00391 if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) { 00392 rotatestrategy = ast_true(s) ? TIMESTAMP : SEQUENTIAL; 00393 fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n"); 00394 } 00395 } 00396 00397 if (!locked) 00398 AST_RWLIST_WRLOCK(&logchannels); 00399 var = ast_variable_browse(cfg, "logfiles"); 00400 for (; var; var = var->next) { 00401 if (!(chan = make_logchannel(var->name, var->value, var->lineno))) 00402 continue; 00403 AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); 00404 global_logmask |= chan->logmask; 00405 } 00406 if (!locked) 00407 AST_RWLIST_UNLOCK(&logchannels); 00408 00409 ast_config_destroy(cfg);
static void logger_print_normal | ( | struct logmsg * | logmsg | ) | [static] |
Print a normal log message to the channels.
Definition at line 770 of file logger.c.
References __LOG_EVENT, __LOG_VERBOSE, ast_console_puts_mutable(), ast_log(), ast_log_vsyslog(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strlen_zero(), ast_verb, buf, chan, COLOR_BRWHITE, colors, logmsg::date, errno, EVENT_FLAG_SYSTEM, eventlog, logmsg::file, logmsg::function, logmsg::level, levels, logmsg::line, logchannel::list, LOG_EVENT, logfiles, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::process_id, reload_logger(), logmsg::str, and term_color().
Referenced by ast_log(), and logger_thread().
00772 { 00773 struct logchannel *chan = NULL; 00774 char buf[BUFSIZ]; 00775 00776 AST_RWLIST_RDLOCK(&logchannels); 00777 00778 if (logfiles.event_log && logmsg->level == __LOG_EVENT) { 00779 fprintf(eventlog, "%s asterisk[%ld]: %s", logmsg->date, (long)getpid(), logmsg->str); 00780 fflush(eventlog); 00781 AST_RWLIST_UNLOCK(&logchannels); 00782 return; 00783 } 00784 00785 if (!AST_RWLIST_EMPTY(&logchannels)) { 00786 AST_RWLIST_TRAVERSE(&logchannels, chan, list) { 00787 /* If the channel is disabled, then move on to the next one */ 00788 if (chan->disabled) 00789 continue; 00790 /* Check syslog channels */ 00791 if (chan->type == LOGTYPE_SYSLOG && (chan->logmask & (1 << logmsg->level))) { 00792 ast_log_vsyslog(logmsg->level, logmsg->file, logmsg->line, logmsg->function, logmsg->str, logmsg->process_id); 00793 /* Console channels */ 00794 } else if (chan->type == LOGTYPE_CONSOLE && (chan->logmask & (1 << logmsg->level))) { 00795 char linestr[128]; 00796 char tmp1[80], tmp2[80], tmp3[80], tmp4[80]; 00797 00798 /* If the level is verbose, then skip it */ 00799 if (logmsg->level == __LOG_VERBOSE) 00800 continue; 00801 00802 /* Turn the numerical line number into a string */ 00803 snprintf(linestr, sizeof(linestr), "%d", logmsg->line); 00804 /* Build string to print out */ 00805 snprintf(buf, sizeof(buf), "[%s] %s[%ld]: %s:%s %s: %s", 00806 logmsg->date, 00807 term_color(tmp1, levels[logmsg->level], colors[logmsg->level], 0, sizeof(tmp1)), 00808 logmsg->process_id, 00809 term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)), 00810 term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), 00811 term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)), 00812 logmsg->str); 00813 /* Print out */ 00814 ast_console_puts_mutable(buf); 00815 /* File channels */ 00816 } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) { 00817 int res = 0; 00818 00819 /* If no file pointer exists, skip it */ 00820 if (!chan->fileptr) 00821 continue; 00822 00823 /* Print out to the file */ 00824 res = fprintf(chan->fileptr, "[%s] %s[%ld] %s: %s", 00825 logmsg->date, levels[logmsg->level], logmsg->process_id, logmsg->file, logmsg->str); 00826 if (res <= 0 && !ast_strlen_zero(logmsg->str)) { 00827 fprintf(stderr, "**** Asterisk Logging Error: ***********\n"); 00828 if (errno == ENOMEM || errno == ENOSPC) 00829 fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename); 00830 else 00831 fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno)); 00832 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno)); 00833 chan->disabled = 1; 00834 } else if (res > 0) { 00835 fflush(chan->fileptr); 00836 } 00837 } 00838 } 00839 } else if (logmsg->level != __LOG_VERBOSE) { 00840 fputs(logmsg->str, stdout); 00841 } 00842 00843 AST_RWLIST_UNLOCK(&logchannels); 00844 00845 /* If we need to reload because of the file size, then do so */ 00846 if (filesize_reload_needed) { 00847 reload_logger(-1); 00848 ast_log(LOG_EVENT, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 00849 ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n"); 00850 } 00851 00852 return;
static void logger_print_verbose | ( | struct logmsg * | logmsg | ) | [static] |
Print a verbose message to the verbosers.
Definition at line 855 of file logger.c.
References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, logchannel::list, logmsg::str, and verb::verboser.
Referenced by ast_verbose(), and logger_thread().
00857 { 00858 struct verb *v = NULL; 00859 00860 /* Iterate through the list of verbosers and pass them the log message string */ 00861 AST_RWLIST_RDLOCK(&verbosers); 00862 AST_RWLIST_TRAVERSE(&verbosers, v, list) 00863 v->verboser(logmsg->str); 00864 AST_RWLIST_UNLOCK(&verbosers); 00865 00866 return;
int logger_reload | ( | void | ) |
Reload logger without rotating log files.
Definition at line 633 of file logger.c.
References reload_logger(), RESULT_FAILURE, and RESULT_SUCCESS.
00635 { 00636 if(reload_logger(0)) 00637 return RESULT_FAILURE; 00638 return RESULT_SUCCESS;
static void* logger_thread | ( | void * | data | ) | [static] |
Actual logging thread.
Definition at line 869 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, logmsgs::lock, logcond, logger_print_normal(), logger_print_verbose(), LOGMSG_NORMAL, LOGMSG_VERBOSE, msg, and logchannel::next.
Referenced by init_logger().
00871 { 00872 struct logmsg *next = NULL, *msg = NULL; 00873 00874 for (;;) { 00875 /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */ 00876 AST_LIST_LOCK(&logmsgs); 00877 if (AST_LIST_EMPTY(&logmsgs)) { 00878 if (close_logger_thread) { 00879 break; 00880 } else { 00881 ast_cond_wait(&logcond, &logmsgs.lock); 00882 } 00883 } 00884 next = AST_LIST_FIRST(&logmsgs); 00885 AST_LIST_HEAD_INIT_NOLOCK(&logmsgs); 00886 AST_LIST_UNLOCK(&logmsgs); 00887 00888 /* Otherwise go through and process each message in the order added */ 00889 while ((msg = next)) { 00890 /* Get the next entry now so that we can free our current structure later */ 00891 next = AST_LIST_NEXT(msg, list); 00892 00893 /* Depending on the type, send it to the proper function */ 00894 if (msg->type == LOGMSG_NORMAL) 00895 logger_print_normal(msg); 00896 else if (msg->type == LOGMSG_VERBOSE) 00897 logger_print_verbose(msg); 00898 00899 /* Free the data since we are done */ 00900 ast_free(msg); 00901 } 00902 00903 /* If we should stop, then stop */ 00904 if (close_logger_thread) 00905 break; 00906 } 00907 00908 return NULL;
static int make_components | ( | const char * | s, | |
int | lineno | |||
) | [static] |
Definition at line 180 of file logger.c.
References __LOG_DEBUG, __LOG_DTMF, __LOG_ERROR, __LOG_EVENT, __LOG_NOTICE, __LOG_VERBOSE, __LOG_WARNING, ast_skip_blanks(), ast_strdupa, and strsep().
Referenced by make_logchannel().
00182 { 00183 char *w; 00184 int res = 0; 00185 char *stringp = ast_strdupa(s); 00186 00187 while ((w = strsep(&stringp, ","))) { 00188 w = ast_skip_blanks(w); 00189 if (!strcasecmp(w, "error")) 00190 res |= (1 << __LOG_ERROR); 00191 else if (!strcasecmp(w, "warning")) 00192 res |= (1 << __LOG_WARNING); 00193 else if (!strcasecmp(w, "notice")) 00194 res |= (1 << __LOG_NOTICE); 00195 else if (!strcasecmp(w, "event")) 00196 res |= (1 << __LOG_EVENT); 00197 else if (!strcasecmp(w, "debug")) 00198 res |= (1 << __LOG_DEBUG); 00199 else if (!strcasecmp(w, "verbose")) 00200 res |= (1 << __LOG_VERBOSE); 00201 else if (!strcasecmp(w, "dtmf")) 00202 res |= (1 << __LOG_DTMF); 00203 else { 00204 fprintf(stderr, "Logfile Warning: Unknown keyword '%s' at line %d of logger.conf\n", w, lineno); 00205 } 00206 } 00207 00208 return res;
static struct logchannel* make_logchannel | ( | const char * | channel, | |
const char * | components, | |||
int | lineno | |||
) | [static] |
Definition at line 210 of file logger.c.
References ast_calloc, ast_config_AST_LOG_DIR, ast_free, ast_strlen_zero(), chan, errno, logchannel::facility, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, and make_components().
Referenced by init_logger_chain().
00212 { 00213 struct logchannel *chan; 00214 char *facility; 00215 #ifndef SOLARIS 00216 CODE *cptr; 00217 #endif 00218 00219 if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan)))) 00220 return NULL; 00221 00222 if (!strcasecmp(channel, "console")) { 00223 chan->type = LOGTYPE_CONSOLE; 00224 } else if (!strncasecmp(channel, "syslog", 6)) { 00225 /* 00226 * syntax is: 00227 * syslog.facility => level,level,level 00228 */ 00229 facility = strchr(channel, '.'); 00230 if (!facility++ || !facility) { 00231 facility = "local0"; 00232 } 00233 00234 #ifndef SOLARIS 00235 /* 00236 * Walk through the list of facilitynames (defined in sys/syslog.h) 00237 * to see if we can find the one we have been given 00238 */ 00239 chan->facility = -1; 00240 cptr = facilitynames; 00241 while (cptr->c_name) { 00242 if (!strcasecmp(facility, cptr->c_name)) { 00243 chan->facility = cptr->c_val; 00244 break; 00245 } 00246 cptr++; 00247 } 00248 #else 00249 chan->facility = -1; 00250 if (!strcasecmp(facility, "kern")) 00251 chan->facility = LOG_KERN; 00252 else if (!strcasecmp(facility, "USER")) 00253 chan->facility = LOG_USER; 00254 else if (!strcasecmp(facility, "MAIL")) 00255 chan->facility = LOG_MAIL; 00256 else if (!strcasecmp(facility, "DAEMON")) 00257 chan->facility = LOG_DAEMON; 00258 else if (!strcasecmp(facility, "AUTH")) 00259 chan->facility = LOG_AUTH; 00260 else if (!strcasecmp(facility, "SYSLOG")) 00261 chan->facility = LOG_SYSLOG; 00262 else if (!strcasecmp(facility, "LPR")) 00263 chan->facility = LOG_LPR; 00264 else if (!strcasecmp(facility, "NEWS")) 00265 chan->facility = LOG_NEWS; 00266 else if (!strcasecmp(facility, "UUCP")) 00267 chan->facility = LOG_UUCP; 00268 else if (!strcasecmp(facility, "CRON")) 00269 chan->facility = LOG_CRON; 00270 else if (!strcasecmp(facility, "LOCAL0")) 00271 chan->facility = LOG_LOCAL0; 00272 else if (!strcasecmp(facility, "LOCAL1")) 00273 chan->facility = LOG_LOCAL1; 00274 else if (!strcasecmp(facility, "LOCAL2")) 00275 chan->facility = LOG_LOCAL2; 00276 else if (!strcasecmp(facility, "LOCAL3")) 00277 chan->facility = LOG_LOCAL3; 00278 else if (!strcasecmp(facility, "LOCAL4")) 00279 chan->facility = LOG_LOCAL4; 00280 else if (!strcasecmp(facility, "LOCAL5")) 00281 chan->facility = LOG_LOCAL5; 00282 else if (!strcasecmp(facility, "LOCAL6")) 00283 chan->facility = LOG_LOCAL6; 00284 else if (!strcasecmp(facility, "LOCAL7")) 00285 chan->facility = LOG_LOCAL7; 00286 #endif /* Solaris */ 00287 00288 if (0 > chan->facility) { 00289 fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n"); 00290 ast_free(chan); 00291 return NULL; 00292 } 00293 00294 chan->type = LOGTYPE_SYSLOG; 00295 snprintf(chan->filename, sizeof(chan->filename), "%s", channel); 00296 openlog("asterisk", LOG_PID, chan->facility); 00297 } else { 00298 if (!ast_strlen_zero(hostname)) { 00299 snprintf(chan->filename, sizeof(chan->filename), "%s/%s.%s", 00300 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel, hostname); 00301 } else { 00302 snprintf(chan->filename, sizeof(chan->filename), "%s/%s", 00303 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel); 00304 } 00305 chan->fileptr = fopen(chan->filename, "a"); 00306 if (!chan->fileptr) { 00307 /* Can't log here, since we're called with a lock */ 00308 fprintf(stderr, "Logger Warning: Unable to open log file '%s': %s\n", chan->filename, strerror(errno)); 00309 } 00310 chan->type = LOGTYPE_FILE; 00311 } 00312 chan->logmask = make_components(components, lineno); 00313 return chan;
static int reload_logger | ( | int | rotate | ) | [static] |
Definition at line 532 of file logger.c.
References ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_queue_log(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, errno, EVENT_FLAG_SYSTEM, EVENTLOG, eventlog, f, init_logger_chain(), logchannel::list, LOG_ERROR, LOG_EVENT, logfiles, manager_event, qlog, and rotate_file().
Referenced by handle_logger_reload(), handle_logger_rotate(), logger_print_normal(), and logger_reload().
00534 { 00535 char old[PATH_MAX] = ""; 00536 int event_rotate = rotate, queue_rotate = rotate; 00537 struct logchannel *f; 00538 int res = 0; 00539 struct stat st; 00540 00541 AST_RWLIST_WRLOCK(&logchannels); 00542 00543 if (eventlog) { 00544 if (rotate < 0) { 00545 /* Check filesize - this one typically doesn't need an auto-rotate */ 00546 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG); 00547 if (stat(old, &st) != 0 || st.st_size > 0x40000000) { /* Arbitrarily, 1 GB */ 00548 fclose(eventlog); 00549 eventlog = NULL; 00550 } else 00551 event_rotate = 0; 00552 } else { 00553 fclose(eventlog); 00554 eventlog = NULL; 00555 } 00556 } else 00557 event_rotate = 0; 00558 00559 if (qlog) { 00560 if (rotate < 0) { 00561 /* Check filesize - this one typically doesn't need an auto-rotate */ 00562 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00563 if (stat(old, &st) != 0 || st.st_size > 0x40000000) { /* Arbitrarily, 1 GB */ 00564 fclose(qlog); 00565 qlog = NULL; 00566 } else 00567 queue_rotate = 0; 00568 } else { 00569 fclose(qlog); 00570 qlog = NULL; 00571 } 00572 } else 00573 queue_rotate = 0; 00574 00575 ast_mkdir(ast_config_AST_LOG_DIR, 0777); 00576 00577 AST_RWLIST_TRAVERSE(&logchannels, f, list) { 00578 if (f->disabled) { 00579 f->disabled = 0; /* Re-enable logging at reload */ 00580 manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename); 00581 } 00582 if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { 00583 fclose(f->fileptr); /* Close file */ 00584 f->fileptr = NULL; 00585 if (rotate) 00586 rotate_file(f->filename); 00587 } 00588 } 00589 00590 filesize_reload_needed = 0; 00591 00592 init_logger_chain(1 /* locked */); 00593 00594 if (logfiles.event_log) { 00595 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, EVENTLOG); 00596 if (event_rotate) 00597 rotate_file(old); 00598 00599 eventlog = fopen(old, "a"); 00600 if (eventlog) { 00601 ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n"); 00602 ast_verb(1, "Asterisk Event Logger restarted\n"); 00603 } else { 00604 ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno)); 00605 res = -1; 00606 } 00607 } 00608 00609 if (logfiles.queue_log) { 00610 snprintf(old, sizeof(old), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name); 00611 if (queue_rotate) 00612 rotate_file(old); 00613 00614 qlog = fopen(old, "a"); 00615 if (qlog) { 00616 AST_RWLIST_UNLOCK(&logchannels); 00617 ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", ""); 00618 AST_RWLIST_WRLOCK(&logchannels); 00619 ast_log(LOG_EVENT, "Restarted Asterisk Queue Logger\n"); 00620 ast_verb(1, "Asterisk Queue Logger restarted\n"); 00621 } else { 00622 ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno)); 00623 res = -1; 00624 } 00625 } 00626 00627 AST_RWLIST_UNLOCK(&logchannels); 00628 00629 return res;
static int rotate_file | ( | const char * | filename | ) | [static] |
Definition at line 446 of file logger.c.
References ARRAY_LEN, ast_channel_alloc, ast_channel_free(), ast_log(), ast_safe_system(), ast_strlen_zero(), buf, LOG_WARNING, pbx_builtin_setvar_helper(), pbx_substitute_variables_helper(), ROTATE, SEQUENTIAL, and TIMESTAMP.
Referenced by reload_logger().
00448 { 00449 char old[PATH_MAX]; 00450 char new[PATH_MAX]; 00451 int x, y, which, found, res = 0, fd; 00452 char *suffixes[4] = { "", ".gz", ".bz2", ".Z" }; 00453 00454 switch (rotatestrategy) { 00455 case SEQUENTIAL: 00456 for (x = 0; ; x++) { 00457 snprintf(new, sizeof(new), "%s.%d", filename, x); 00458 fd = open(new, O_RDONLY); 00459 if (fd > -1) 00460 close(fd); 00461 else 00462 break; 00463 } 00464 if (rename(filename, new)) { 00465 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00466 res = -1; 00467 } 00468 break; 00469 case TIMESTAMP: 00470 snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL)); 00471 if (rename(filename, new)) { 00472 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00473 res = -1; 00474 } 00475 break; 00476 case ROTATE: 00477 /* Find the next empty slot, including a possible suffix */ 00478 for (x = 0; ; x++) { 00479 found = 0; 00480 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00481 snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]); 00482 fd = open(new, O_RDONLY); 00483 if (fd > -1) { 00484 close(fd); 00485 found = 1; 00486 break; 00487 } 00488 } 00489 if (!found) { 00490 break; 00491 } 00492 } 00493 00494 /* Found an empty slot */ 00495 for (y = x; y > 0; y--) { 00496 for (which = 0; which < ARRAY_LEN(suffixes); which++) { 00497 snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]); 00498 fd = open(old, O_RDONLY); 00499 if (fd > -1) { 00500 /* Found the right suffix */ 00501 close(fd); 00502 snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]); 00503 if (rename(old, new)) { 00504 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new); 00505 res = -1; 00506 } 00507 break; 00508 } 00509 } 00510 } 00511 00512 /* Finally, rename the current file */ 00513 snprintf(new, sizeof(new), "%s.0", filename); 00514 if (rename(filename, new)) { 00515 fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new); 00516 res = -1; 00517 } 00518 } 00519 00520 if (!ast_strlen_zero(exec_after_rotate)) { 00521 struct ast_channel *c = ast_channel_alloc(0, 0, "", "", "", "", "", 0, "Logger/rotate"); 00522 char buf[512]; 00523 pbx_builtin_setvar_helper(c, "filename", filename); 00524 pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf)); 00525 if (ast_safe_system(buf) != -1) { 00526 ast_log(LOG_WARNING, "error executing '%s'\n", buf); 00527 } 00528 ast_channel_free(c); 00529 } 00530 return res;
struct ast_cli_entry cli_logger[] [static] |
Initial value:
{ { .handler = handle_logger_show_channels , .summary = "List configured log channels" ,__VA_ARGS__ }, { .handler = handle_logger_reload , .summary = "Reopens the log files" ,__VA_ARGS__ }, { .handler = handle_logger_rotate , .summary = "Rotates and reopens the log files" ,__VA_ARGS__ } }
Definition at line 731 of file logger.c.
Referenced by init_logger().
int close_logger_thread [static] |
int colors[] [static] |
Colors used in the console for logging.
Definition at line 164 of file logger.c.
Referenced by logger_print_normal().
char dateformat[256] = "%b %e %T" [static] |
FILE* eventlog [static] |
Definition at line 149 of file logger.c.
Referenced by close_logger(), init_logger(), logger_print_normal(), and reload_logger().
char exec_after_rotate[256] = "" [static] |
int filesize_reload_needed [static] |
int global_logmask = -1 [static] |
char hostname[MAXHOSTNAMELEN] [static] |
Definition at line 107 of file logger.c.
Referenced by ast_readconfig(), ast_remotecontrol(), cli_prompt(), iax2_register(), netconsole(), set_destination(), sip_register(), and tds_load_module().
char* levels[] [static] |
Logging channels used in the Asterisk logging system.
Definition at line 153 of file logger.c.
Referenced by ast_log_vsyslog(), and logger_print_normal().
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 146 of file logger.c.
Referenced by ast_log(), ast_verbose(), close_logger(), init_logger(), and logger_thread().
struct { ... } logfiles [static] |
Referenced by init_logger(), init_logger_chain(), logger_print_normal(), and reload_logger().
pthread_t logthread = AST_PTHREADT_NULL [static] |
Definition at line 145 of file logger.c.
Referenced by ast_log(), ast_verbose(), close_logger(), and init_logger().
FILE* qlog [static] |
Definition at line 150 of file logger.c.
Referenced by ast_queue_log(), close_logger(), init_logger(), and reload_logger().
char queue_log_name[256] = QUEUELOG [static] |
int syslog_level_map[] [static] |
struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT, .key_init = __init_verbose_buf , .custom_init = NULL , } [static] |