Wed Oct 28 11:46:13 2009

Asterisk developer's documentation


logger.c File Reference

Asterisk Logger. More...

#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 <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"

Include dependency graph for logger.c:

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 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 __fini_logchannels (void)
static void __fini_verbosers (void)
static void __init_log_buf (void)
static void __init_logchannels (void)
static void __init_verbose_buf (void)
static void __init_verbosers (void)
void ast_backtrace (void)
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 (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 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 int make_components (const char *s, int lineno)
static struct logchannelmake_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 = 0
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 , }


Detailed Description

Asterisk Logger.

Logging routines

Author:
Mark Spencer <markster@digium.com>

Definition in file logger.c.


Define Documentation

#define _ASTERISK_LOGGER_H

Definition at line 33 of file logger.c.

#define FORMATL   "%-35.35s %-8.8s %-9.9s "

 
#define GETTID (  )     getpid()

Definition at line 85 of file logger.c.

Referenced by ast_log().

#define LOG_BUF_INIT_SIZE   256

Definition at line 178 of file logger.c.

Referenced by ast_log().

#define SYSLOG_NAMES

Definition at line 49 of file logger.c.

#define SYSLOG_NLEVELS   sizeof(syslog_level_map) / sizeof(int)

Definition at line 63 of file logger.c.

Referenced by ast_log_vsyslog().

#define VERBOSE_BUF_INIT_SIZE   256

Definition at line 175 of file logger.c.

Referenced by ast_verbose().


Enumeration Type Documentation

Enumerator:
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 127 of file logger.c.

00128                  {
00129    LOGMSG_NORMAL = 0,
00130    LOGMSG_VERBOSE,

enum logtypes

Enumerator:
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 109 of file logger.c.

00110               {
00111    LOGTYPE_SYSLOG,
00112    LOGTYPE_FILE,
00113    LOGTYPE_CONSOLE,

Enumerator:
SEQUENTIAL 
ROTATE 
TIMESTAMP 

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 */


Function Documentation

static void __fini_logchannels ( void   )  [static]

Definition at line 125 of file logger.c.

00128 {

static void __fini_verbosers ( void   )  [static]

Definition at line 729 of file logger.c.

00732 {

static void __init_log_buf ( void   )  [static]

Definition at line 177 of file logger.c.

00182 {

static void __init_logchannels ( void   )  [static]

Definition at line 125 of file logger.c.

00128 {

static void __init_verbose_buf ( void   )  [static]

Definition at line 174 of file logger.c.

00182 {

static void __init_verbosers ( void   )  [static]

Definition at line 729 of file logger.c.

00732 {

void ast_backtrace ( void   ) 

Definition at line 1083 of file logger.c.

References ast_calloc, ast_debug, ast_free, ast_log(), free, LOG_DEBUG, and LOG_WARNING.

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,
  ... 
)

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(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 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, logmsg::date, logmsg::file, logmsg::function, GETTID, logmsg::level, logmsg::line, logchannel::list, log_buf, LOG_BUF_INIT_SIZE, logcond, logger_print_normal(), LOGMSG_NORMAL, logthread, option_debug, option_verbose, logmsg::process_id, logmsg::str, ast_str::str, term_filter_escapes(), and logmsg::type.

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_dsp_call_progress(), __ast_encrypt_bin(), __ast_format_register(), __ast_http_load(), __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_sprintf(), acf_strftime(), acf_strptime(), ack_trans(), action_bridge(), action_command(), action_getvar(), action_login(), add_agent(), add_agi_cmd(), add_calltoken_ignore(), 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_pri_lockopt(), 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_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_zh(), ast_say_enumeration_full_he(), ast_say_number_full_pt(), ast_say_number_full_zh(), 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_proto_register(), ast_udptl_read(), ast_udptl_set_error_correction_scheme(), ast_udptl_set_far_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(), bridge_exec(), bridge_native_loop(), bridge_p2p_loop(), build_alias(), build_callno_limits(), 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_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(), 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_get_index(), dahdi_handle_dtmfup(), 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_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(), dialog_cleanup_and_destroy(), dialog_ref(), 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_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_prop_precache(), 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(), 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_engine(), 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_http_callback(), 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(), 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_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(), 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_call_token(), 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_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_t38_options(), handle_updates(), HandleCallIncoming(), HandleCallOutgoing(), hidthread(), hint_read(), httpd_helper_thread(), 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_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(), 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_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_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(), open_stream(), 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_request(), 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(), 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_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(), 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(), quote(), 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_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_pgsql(), realtime_store_handler(), realtime_update_handler(), realtime_user(), 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(), replace_callno(), reply_digest(), resample_frame(), reset_conf(), reset_global_eid(), 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_date(), say_date_with_format(), say_datetime(), say_datetime_from_now(), say_init_mode(), say_number_full(), say_time(), saycharstr(), saydigits(), sayfile(), saynum(), scan_service(), scan_thread(), scheduled_destroy(), 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_log(), sms_messagerx2(), sms_process(), sms_readfile(), sms_writefile(), 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_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(), try_calling(), 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::verboser.

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, ast_str::str, logmsg::str, logmsg::type, 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(), 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_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::fileptr, 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, logchannel::disabled, ast_cli_args::fd, logchannel::filename, FORMATL, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, logchannel::type, 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, ast_variable::lineno, logchannel::list, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, make_logchannel(), ast_variable::name, ast_variable::next, ROTATE, s, SEQUENTIAL, TIMESTAMP, logchannel::type, ast_variable::value, 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, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, eventlog, logmsg::file, logchannel::filename, logchannel::fileptr, logmsg::function, logmsg::level, levels, logmsg::line, logchannel::list, LOG_EVENT, logfiles, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::process_id, reload_logger(), logmsg::str, term_color(), and logchannel::type.

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 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 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, 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, read]

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, logchannel::filename, logchannel::fileptr, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, make_components(), and logchannel::type.

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, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, EVENTLOG, eventlog, f, logchannel::filename, logchannel::fileptr, 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;


Variable Documentation

struct ast_cli_entry cli_logger[] [static]

Initial value:

 {
   AST_CLI_DEFINE(handle_logger_show_channels, "List configured log channels"),
   AST_CLI_DEFINE(handle_logger_reload, "Reopens the log files"),
   AST_CLI_DEFINE(handle_logger_rotate, "Rotates and reopens the log files")
}

Definition at line 731 of file logger.c.

Referenced by init_logger().

int close_logger_thread = 0 [static]

Definition at line 147 of file logger.c.

Referenced by close_logger(), and logger_thread().

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]

Definition at line 88 of file logger.c.

Referenced by build_device().

unsigned int event_log

Definition at line 104 of file logger.c.

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]

Definition at line 91 of file logger.c.

int filesize_reload_needed [static]

Definition at line 93 of file logger.c.

int global_logmask = -1 [static]

Definition at line 94 of file logger.c.

char hostname[MAXHOSTNAMELEN] [static]

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]

Definition at line 177 of file logger.c.

Referenced by ast_log().

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]

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().

unsigned int queue_log

Definition at line 103 of file logger.c.

char queue_log_name[256] = QUEUELOG [static]

Definition at line 90 of file logger.c.

int syslog_level_map[] [static]

Definition at line 53 of file logger.c.

struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT, .key_init = __init_verbose_buf , .custom_init = NULL , } [static]

Definition at line 174 of file logger.c.

Referenced by ast_verbose().


Generated on Wed Oct 28 11:46:13 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6