Asterisk - The Open Source Telephony Project  GIT-master-1f78ee9
Data Structures | Macros | Enumerations | Functions | Variables
logger.c File Reference

Asterisk Logger. More...

#include "asterisk.h"
#include <syslog.h>
#include <signal.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "asterisk/_private.h"
#include "asterisk/module.h"
#include "asterisk/paths.h"
#include "asterisk/logger.h"
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/config.h"
#include "asterisk/term.h"
#include "asterisk/cli.h"
#include "asterisk/utils.h"
#include "asterisk/manager.h"
#include "asterisk/astobj2.h"
#include "asterisk/threadstorage.h"
#include "asterisk/strings.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include "asterisk/buildinfo.h"
#include "asterisk/ast_version.h"
#include "asterisk/backtrace.h"
#include "asterisk/json.h"

Go to the source code of this file.

Data Structures

struct  logchannel
 
struct  logchannels
 
struct  logformatter
 
struct  logmsg
 
struct  logmsgs
 
struct  verb_console
 
struct  verb_consoles
 

Macros

#define FORMATL   "%-35.35s %-8.8s %-10.10s %-9.9s "
 
#define LOG_BUF_INIT_SIZE   256
 
#define VERBOSE_BUF_INIT_SIZE   256
 

Enumerations

enum  logmsgtypes { LOGMSG_NORMAL = 0, LOGMSG_VERBOSE }
 
enum  logtypes { LOGTYPE_SYSLOG, LOGTYPE_FILE, LOGTYPE_CONSOLE }
 
enum  rotatestrategy { NONE = 0, SEQUENTIAL = 1 << 0, ROTATE = 1 << 1, TIMESTAMP = 1 << 2 }
 

Functions

void __ast_verbose (const char *file, int line, const char *func, int level, const char *fmt,...)
 Send a verbose message (based on verbose level) More...
 
void __ast_verbose_ap (const char *file, int line, const char *func, int level, ast_callid callid, const char *fmt, va_list ap)
 
void __ast_verbose_callid (const char *file, int line, const char *func, int level, ast_callid callid, const char *fmt,...)
 Send a verbose message (based on verbose level) with deliberately specified callid. More...
 
static void __init_log_buf (void)
 
static void __init_my_verb_console (void)
 
static void __init_unique_callid (void)
 
static void __init_verbose_buf (void)
 
static void __init_verbose_build_buf (void)
 
static void __reg_module (void)
 
static void __unreg_module (void)
 
static void _handle_SIGXFSZ (int sig)
 
void ast_callid_strnprint (char *buffer, size_t buffer_size, ast_callid callid)
 copy a string representation of the callid into a target string More...
 
int ast_callid_threadassoc_add (ast_callid callid)
 Adds a known callid to thread storage of the calling thread. More...
 
int ast_callid_threadassoc_change (ast_callid callid)
 Sets what is stored in the thread storage to the given callid if it does not match what is already there. More...
 
int ast_callid_threadassoc_remove (void)
 Removes callid from thread storage of the calling thread. More...
 
int ast_callid_threadstorage_auto (ast_callid *callid)
 Checks thread storage for a callid and stores a reference if it exists. If not, then a new one will be created, bound to the thread, and a reference to it will be stored. More...
 
void ast_callid_threadstorage_auto_clean (ast_callid callid, int callid_created)
 Use in conjunction with ast_callid_threadstorage_auto. Cleans up the references and if the callid was created by threadstorage_auto, unbinds the callid from the threadstorage. More...
 
void ast_child_verbose (int level, const char *fmt,...)
 
ast_callid ast_create_callid (void)
 factory function to create a new uniquely identifying callid. More...
 
int ast_is_logger_initialized (void)
 Test if logger is initialized. More...
 
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(AST_LOG_WHATEVER, "Problem with the %s Captain. We should get some more. Will %d be enough?\n", "flux capacitor", 10); where WHATEVER is one of ERROR, DEBUG, EVENT, NOTICE, or WARNING depending on which log you wish to output to. These are implemented as macros, that will provide the function with the needed arguments. More...
 
void ast_log_ap (int level, const char *file, int line, const char *function, const char *fmt, va_list ap)
 
void ast_log_backtrace (void)
 Log a backtrace of the current thread's execution stack to the Asterisk log. More...
 
void ast_log_callid (int level, const char *file, int line, const char *function, ast_callid callid, const char *fmt,...)
 Used for sending a log message with a known call_id This is a modified logger function which is functionally identical to the above logger function, it just include a call_id argument as well. If NULL is specified here, no attempt will be made to join the log message with a call_id. More...
 
static void ast_log_full (int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt, va_list ap)
 send log messages to syslog and/or the console More...
 
void ast_log_safe (int level, const char *file, int line, const char *function, const char *fmt,...)
 Used for sending a log message with protection against recursion. More...
 
int ast_logger_create_channel (const char *log_channel, const char *components)
 Create a log channel. More...
 
int ast_logger_get_channels (int(*logentry)(const char *channel, const char *type, const char *status, const char *configuration, void *data), void *data)
 Retrieve the existing log channels. More...
 
const char * ast_logger_get_dateformat (void)
 Get the logger configured date format. More...
 
int ast_logger_get_queue_limit (void)
 Get the maximum number of messages allowed in the processing queue. More...
 
int ast_logger_register_level (const char *name)
 Register a new logger level. More...
 
int ast_logger_remove_channel (const char *log_channel)
 Delete the specified log channel. More...
 
int ast_logger_rotate ()
 Reload logger while rotating log files. More...
 
int ast_logger_rotate_channel (const char *log_channel)
 Rotate the specified log channel. More...
 
void ast_logger_set_queue_limit (int queue_limit)
 Set the maximum number of messages allowed in the processing queue. More...
 
void ast_logger_unregister_level (const char *name)
 Unregister a previously registered logger level. More...
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
void ast_queue_log (const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
 
ast_callid ast_read_threadstorage_callid (void)
 extracts the callerid from the thread More...
 
 AST_THREADSTORAGE_RAW (in_safe_log)
 
int ast_verb_console_get (void)
 Get this thread's console verbosity level. More...
 
void ast_verb_console_register (int *level)
 Register this thread's console verbosity level pointer. More...
 
void ast_verb_console_set (int verb_level)
 Set this thread's console verbosity level. More...
 
void ast_verb_console_unregister (void)
 Unregister this thread's console verbosity level. More...
 
void ast_verb_update (void)
 Re-evaluate the system max verbosity level (ast_verb_sys_level). More...
 
void close_logger (void)
 
static struct logchannelfind_logchannel (const char *channel)
 Find a particular logger channel by name. More...
 
static int format_log_default (struct logchannel *chan, struct logmsg *msg, char *buf, size_t size)
 
static int format_log_json (struct logchannel *channel, struct logmsg *msg, char *buf, size_t size)
 
static struct logmsgformat_log_message (int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt,...)
 
static struct logmsgformat_log_message_ap (int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt, va_list ap)
 
static char * handle_logger_add_channel (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_logger_reload (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_logger_remove_channel (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_logger_rotate (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_logger_set_level (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_logger_show_channels (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 CLI command to show logging system configuration. More...
 
int init_logger (void)
 
static int init_logger_chain (const char *altconf)
 Read config, setup channels. More...
 
static int load_module (void)
 
static int logger_add_verbose_magic (struct logmsg *logmsg, char *buf, size_t size)
 
static void logger_print_normal (struct logmsg *logmsg)
 Print a normal log message to the channels. More...
 
static void logger_queue_init (void)
 
static int logger_queue_restart (int queue_rotate)
 
static int logger_queue_rt_start (void)
 
void logger_queue_start (void)
 Start the ast_queue_log() logger. More...
 
static void * logger_thread (void *data)
 Actual logging thread. More...
 
static void logmsg_free (struct logmsg *msg)
 
static void make_components (struct logchannel *chan)
 
static void make_filename (const char *channel, char *filename, size_t size)
 create the filename that will be used for a logger channel. More...
 
static struct logchannelmake_logchannel (const char *channel, const char *components, int lineno, int dynamic)
 
static int reload_logger (int rotate, const char *altconf)
 
static int reload_module (void)
 
static int rotate_file (const char *filename)
 
static int unload_module (void)
 
static void update_logchannels (void)
 
static void verb_console_free (void *v_console)
 
static void verb_console_unregister (struct verb_console *console)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "Logger" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = 0, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_cli_entry cli_logger []
 
static int close_logger_thread = 0
 
static const int colors [NUMLOGLEVELS]
 Colors used in the console for logging. More...
 
static char dateformat [256] = "%b %e %T"
 
static int display_callids
 
static char exec_after_rotate [256] = ""
 
static int filesize_reload_needed
 
static unsigned int global_logmask = 0xFFFF
 
static struct sigaction handle_SIGXFSZ
 
static unsigned int high_water_alert
 
static char hostname [MAXHOSTNAMELEN]
 
static char * levels [NUMLOGLEVELS]
 Logging channels used in the Asterisk logging system. More...
 
static struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , }
 
static struct logchannels logchannels = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
 
static ast_cond_t logcond
 
struct {
   unsigned int   queue_adaptive_realtime:1
 
   unsigned int   queue_log:1
 
   unsigned int   queue_log_realtime_use_gmt:1
 
   unsigned int   queue_log_to_file:1
 
logfiles = { 1 }
 
static struct logformatter logformatter_default
 
static struct logformatter logformatter_json
 
static int logger_initialized
 
static int logger_messages_discarded
 
static int logger_queue_limit = 1000
 
static int logger_queue_size
 
static struct logmsgs logmsgs = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} } , }
 
static pthread_t logthread = AST_PTHREADT_NULL
 
static struct ast_threadstorage my_verb_console = { .once = PTHREAD_ONCE_INIT , .key_init = __init_my_verb_console , .custom_init = NULL , }
 
static volatile int next_unique_callid = 1
 
static FILE * qlog
 
static char queue_log_name [256] = QUEUELOG
 
static int queuelog_init
 
static enum rotatestrategy rotatestrategy = SEQUENTIAL
 
static struct ast_threadstorage unique_callid = { .once = PTHREAD_ONCE_INIT , .key_init = __init_unique_callid , .custom_init = NULL , }
 
static struct verb_consoles verb_consoles = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
 
static ast_mutex_t verb_update_lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} }
 
static struct ast_threadstorage verbose_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_buf , .custom_init = NULL , }
 
static struct ast_threadstorage verbose_build_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_build_buf , .custom_init = NULL , }
 

Detailed Description

Asterisk Logger.

Logging routines

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Definition in file logger.c.

Macro Definition Documentation

◆ FORMATL

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

◆ LOG_BUF_INIT_SIZE

#define LOG_BUF_INIT_SIZE   256

Definition at line 254 of file logger.c.

Referenced by format_log_message_ap().

◆ VERBOSE_BUF_INIT_SIZE

#define VERBOSE_BUF_INIT_SIZE   256

Definition at line 251 of file logger.c.

Referenced by logger_add_verbose_magic().

Enumeration Type Documentation

◆ logmsgtypes

Enumerator
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 157 of file logger.c.

157  {
158  LOGMSG_NORMAL = 0,
160 };

◆ logtypes

enum logtypes
Enumerator
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 122 of file logger.c.

122  {
124  LOGTYPE_FILE,
126 };

◆ rotatestrategy

Enumerator
NONE 
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 95 of file logger.c.

95  {
96  NONE = 0, /* Do not rotate log files at all, instead rely on external mechanisms */
97  SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */
98  ROTATE = 1 << 1, /* Rotate all files, such that the oldest file has the highest suffix */
99  TIMESTAMP = 1 << 2, /* Append the epoch timestamp onto the end of the archived file */
Definition: logger.c:98
rotatestrategy
Definition: logger.c:95
Definition: logger.c:96

Function Documentation

◆ __ast_verbose()

void __ast_verbose ( const char *  file,
int  line,
const char *  func,
int  level,
const char *  fmt,
  ... 
)

Send a verbose message (based on verbose level)

This works like ast_log, but prints verbose messages to the console depending on verbosity level set.

ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing");

This will print the message to the console if the verbose level is set to a level >= 3

Note the absence of a comma after the VERBOSE_PREFIX_3. This is important. VERBOSE_PREFIX_1 through VERBOSE_PREFIX_4 are defined.

Version
11 added level parameter

Definition at line 2106 of file logger.c.

References __ast_verbose_ap(), and ast_read_threadstorage_callid().

2107 {
2108  ast_callid callid;
2109  va_list ap;
2110 
2111  callid = ast_read_threadstorage_callid();
2112 
2113  va_start(ap, fmt);
2114  __ast_verbose_ap(file, line, func, level, callid, fmt, ap);
2115  va_end(ap);
2116 }
unsigned int ast_callid
Definition: logger.h:87
void __ast_verbose_ap(const char *file, int line, const char *func, int level, ast_callid callid, const char *fmt, va_list ap)
Definition: logger.c:2101
ast_callid ast_read_threadstorage_callid(void)
extracts the callerid from the thread
Definition: logger.c:1870

◆ __ast_verbose_ap()

void __ast_verbose_ap ( const char *  file,
int  line,
const char *  func,
int  level,
ast_callid  callid,
const char *  fmt,
va_list  ap 
)

Definition at line 2101 of file logger.c.

References __LOG_VERBOSE, and ast_log_full().

Referenced by __ast_verbose(), __ast_verbose_callid(), and ast_log_ap().

2102 {
2103  ast_log_full(__LOG_VERBOSE, level, file, line, func, callid, fmt, ap);
2104 }
#define __LOG_VERBOSE
Definition: logger.h:295
static void ast_log_full(int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt, va_list ap)
send log messages to syslog and/or the console
Definition: logger.c:1961

◆ __ast_verbose_callid()

void __ast_verbose_callid ( const char *  file,
int  line,
const char *  func,
int  level,
ast_callid  callid,
const char *  fmt,
  ... 
)

Send a verbose message (based on verbose level) with deliberately specified callid.

just like __ast_verbose, only __ast_verbose_callid allows you to specify which callid is being used for the log without needing to bind it to a thread. NULL is a valid argument for this function and will allow you to specify that a log will never display a call id even when there is a call id bound to the thread.

Definition at line 2118 of file logger.c.

References __ast_verbose_ap().

2119 {
2120  va_list ap;
2121  va_start(ap, fmt);
2122  __ast_verbose_ap(file, line, func, level, callid, fmt, ap);
2123  va_end(ap);
2124 }
void __ast_verbose_ap(const char *file, int line, const char *func, int level, ast_callid callid, const char *fmt, va_list ap)
Definition: logger.c:2101

◆ __init_log_buf()

static void __init_log_buf ( void  )
static

Definition at line 253 of file logger.c.

257 {

◆ __init_my_verb_console()

static void __init_my_verb_console ( void  )
static

Thread specific console verbosity level node.

Definition at line 2202 of file logger.c.

2205 {

◆ __init_unique_callid()

static void __init_unique_callid ( void  )
static

Definition at line 88 of file logger.c.

95 {

◆ __init_verbose_buf()

static void __init_verbose_buf ( void  )
static

Definition at line 249 of file logger.c.

257 {

◆ __init_verbose_build_buf()

static void __init_verbose_build_buf ( void  )
static

Definition at line 250 of file logger.c.

257 {

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 2496 of file logger.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 2496 of file logger.c.

◆ _handle_SIGXFSZ()

static void _handle_SIGXFSZ ( int  sig)
static

Definition at line 1485 of file logger.c.

References filesize_reload_needed.

1486 {
1487  /* Indicate need to reload */
1489 }
static int filesize_reload_needed
Definition: logger.c:81

◆ ast_callid_strnprint()

void ast_callid_strnprint ( char *  buffer,
size_t  buffer_size,
ast_callid  callid 
)

copy a string representation of the callid into a target string

Parameters
bufferdestination of callid string (should be able to store 13 characters or more)
buffer_sizemaximum writable length of the string (Less than 13 will result in truncation)
callidCallid for which string is being requested

Definition at line 1860 of file logger.c.

Referenced by ast_channel_callid_set(), func_channel_read(), handle_showchan(), and iax_pvt_callid_new().

1861 {
1862  snprintf(buffer, buffer_size, "[C-%08x]", callid);
1863 }

◆ ast_callid_threadassoc_add()

int ast_callid_threadassoc_add ( ast_callid  callid)

Adds a known callid to thread storage of the calling thread.

Return values
0- success
non-zero- failure

Definition at line 1892 of file logger.c.

References ast_log(), ast_threadstorage_get(), LOG_ERROR, and unique_callid.

Referenced by __analog_ss_thread(), __ast_pbx_run(), ast_callid_threadstorage_auto(), async_dial(), attended_transfer_monitor_thread(), bridge_channel_control_thread(), bridge_channel_depart_thread(), bridge_channel_ind_thread(), handle_request_do(), jingle_action_hook(), jingle_outgoing_hook(), mixmonitor_thread(), socket_process_helper(), and softmix_mixing_thread().

1893 {
1894  ast_callid *pointing;
1895 
1896  pointing = ast_threadstorage_get(&unique_callid, sizeof(*pointing));
1897  if (!pointing) {
1898  return -1;
1899  }
1900 
1901  if (*pointing) {
1902  ast_log(LOG_ERROR, "ast_callid_threadassoc_add(C-%08x) on thread "
1903  "already associated with callid [C-%08x].\n", callid, *pointing);
1904  return 1;
1905  }
1906 
1907  *pointing = callid;
1908  return 0;
1909 }
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
unsigned int ast_callid
Definition: logger.h:87
static struct ast_threadstorage unique_callid
Definition: logger.c:88
#define LOG_ERROR
Definition: logger.h:285
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 i...
Definition: logger.c:2009

◆ ast_callid_threadassoc_change()

int ast_callid_threadassoc_change ( ast_callid  callid)

Sets what is stored in the thread storage to the given callid if it does not match what is already there.

Return values
0- success
non-zero- failure

Definition at line 1879 of file logger.c.

References ast_threadstorage_get(), and unique_callid.

Referenced by autoservice_run(), and bridge_manager_service().

1880 {
1881  ast_callid *id = ast_threadstorage_get(&unique_callid, sizeof(*id));
1882 
1883  if (!id) {
1884  return -1;
1885  }
1886 
1887  *id = callid;
1888 
1889  return 0;
1890 }
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
unsigned int ast_callid
Definition: logger.h:87
static struct ast_threadstorage unique_callid
Definition: logger.c:88

◆ ast_callid_threadassoc_remove()

int ast_callid_threadassoc_remove ( void  )

Removes callid from thread storage of the calling thread.

Return values
0- success
non-zero- failure

Definition at line 1911 of file logger.c.

References ast_threadstorage_get(), and unique_callid.

Referenced by ast_callid_threadstorage_auto_clean(), attended_transfer_monitor_thread(), handle_request_do(), jingle_action_hook(), jingle_outgoing_hook(), and socket_process().

1912 {
1913  ast_callid *pointing;
1914 
1915  pointing = ast_threadstorage_get(&unique_callid, sizeof(*pointing));
1916  if (!pointing) {
1917  return -1;
1918  }
1919 
1920  if (*pointing) {
1921  *pointing = 0;
1922  return 0;
1923  }
1924 
1925  return -1;
1926 }
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
unsigned int ast_callid
Definition: logger.h:87
static struct ast_threadstorage unique_callid
Definition: logger.c:88

◆ ast_callid_threadstorage_auto()

int ast_callid_threadstorage_auto ( ast_callid callid)

Checks thread storage for a callid and stores a reference if it exists. If not, then a new one will be created, bound to the thread, and a reference to it will be stored.

Parameters
callidpointer to store the callid
Return values
0- callid was found
1- callid was created
-1- the function failed somehow (presumably memory problems)

Definition at line 1928 of file logger.c.

References ast_callid_threadassoc_add(), ast_create_callid(), ast_read_threadstorage_callid(), and tmp().

Referenced by __analog_handle_event(), analog_handle_init_event(), dahdi_handle_event(), dahdi_request(), do_monitor(), handle_clear_alarms(), handle_init_event(), mwi_thread(), my_new_analog_ast_channel(), and my_on_hook().

1929 {
1930  ast_callid tmp;
1931 
1932  /* Start by trying to see if a callid is available from thread storage */
1934  if (tmp) {
1935  *callid = tmp;
1936  return 0;
1937  }
1938 
1939  /* If that failed, try to create a new one and bind it. */
1940  *callid = ast_create_callid();
1941  if (*callid) {
1942  ast_callid_threadassoc_add(*callid);
1943  return 1;
1944  }
1945 
1946  /* If neither worked, then something must have gone wrong. */
1947  return -1;
1948 }
static int tmp()
Definition: bt_open.c:389
unsigned int ast_callid
Definition: logger.h:87
ast_callid ast_read_threadstorage_callid(void)
extracts the callerid from the thread
Definition: logger.c:1870
int ast_callid_threadassoc_add(ast_callid callid)
Adds a known callid to thread storage of the calling thread.
Definition: logger.c:1892
ast_callid ast_create_callid(void)
factory function to create a new uniquely identifying callid.
Definition: logger.c:1865

◆ ast_callid_threadstorage_auto_clean()

void ast_callid_threadstorage_auto_clean ( ast_callid  callid,
int  callid_created 
)

Use in conjunction with ast_callid_threadstorage_auto. Cleans up the references and if the callid was created by threadstorage_auto, unbinds the callid from the threadstorage.

Parameters
callidThe callid set by ast_callid_threadstorage_auto
callid_createdThe integer returned through ast_callid_threadstorage_auto

Definition at line 1950 of file logger.c.

References ast_callid_threadassoc_remove().

Referenced by __analog_handle_event(), analog_handle_init_event(), dahdi_handle_event(), dahdi_new_callid_clean(), dahdi_request(), do_monitor(), handle_clear_alarms(), handle_init_event(), and mwi_thread().

1951 {
1952  if (callid && callid_created) {
1953  /* If the callid was created rather than simply grabbed from the thread storage, we need to unbind here. */
1955  }
1956 }
int ast_callid_threadassoc_remove(void)
Removes callid from thread storage of the calling thread.
Definition: logger.c:1911

◆ ast_child_verbose()

void ast_child_verbose ( int  level,
const char *  fmt,
  ... 
)

Definition at line 767 of file logger.c.

References ast_free, ast_malloc, and NULL.

Referenced by launch_script().

768 {
769  char *msg = NULL, *emsg = NULL, *sptr, *eptr;
770  va_list ap, aq;
771  int size;
772 
773  va_start(ap, fmt);
774  va_copy(aq, ap);
775  if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) {
776  va_end(ap);
777  va_end(aq);
778  return;
779  }
780  va_end(ap);
781 
782  if (!(msg = ast_malloc(size + 1))) {
783  va_end(aq);
784  return;
785  }
786 
787  vsnprintf(msg, size + 1, fmt, aq);
788  va_end(aq);
789 
790  if (!(emsg = ast_malloc(size * 2 + 1))) {
791  ast_free(msg);
792  return;
793  }
794 
795  for (sptr = msg, eptr = emsg; ; sptr++) {
796  if (*sptr == '"') {
797  *eptr++ = '\\';
798  }
799  *eptr++ = *sptr;
800  if (*sptr == '\0') {
801  break;
802  }
803  }
804  ast_free(msg);
805 
806  fprintf(stdout, "verbose \"%s\" %d\n", emsg, level);
807  fflush(stdout);
808  ast_free(emsg);
809 }
#define NULL
Definition: resample.c:96
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:193
#define ast_free(a)
Definition: astmm.h:182

◆ ast_create_callid()

ast_callid ast_create_callid ( void  )

factory function to create a new uniquely identifying callid.

Return values
Thecall id

Definition at line 1865 of file logger.c.

References ast_atomic_fetchadd_int(), and next_unique_callid.

Referenced by __ast_pbx_run(), __find_call(), ast_callid_threadstorage_auto(), iax_pvt_callid_new(), and jingle_alloc().

1866 {
1868 }
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
Definition: lock.h:755
static volatile int next_unique_callid
Definition: logger.c:85

◆ ast_is_logger_initialized()

int ast_is_logger_initialized ( void  )

Test if logger is initialized.

Return values
trueif the logger is initialized

Definition at line 1753 of file logger.c.

References logger_initialized.

Referenced by check_init().

1754 {
1755  return logger_initialized;
1756 }
static int logger_initialized
Definition: logger.c:84

◆ ast_log()

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(AST_LOG_WHATEVER, "Problem with the %s Captain. We should get some more. Will %d be enough?\n", "flux capacitor", 10); where WHATEVER is one of ERROR, DEBUG, EVENT, NOTICE, or WARNING depending on which log you wish to output to. These are implemented as macros, that will provide the function with the needed arguments.

Parameters
levelType of log event
fileWill be provided by the AST_LOG_* macro
lineWill be provided by the AST_LOG_* macro
functionWill be provided by the AST_LOG_* macro
fmtThis is what is important. The format is the same as your favorite breed of printf. You know how that works, right? :-)

Definition at line 2009 of file logger.c.

References ast_log_ap().

Referenced by ast_callid_threadassoc_add(), ast_log_backtrace(), ast_logger_register_level(), init_logger(), logger_queue_init(), logger_queue_restart(), and rotate_file().

2010 {
2011  va_list ap;
2012 
2013  va_start(ap, fmt);
2014  ast_log_ap(level, file, line, function, fmt, ap);
2015  va_end(ap);
2016 }
void ast_log_ap(int level, const char *file, int line, const char *function, const char *fmt, va_list ap)
Definition: logger.c:2018

◆ ast_log_ap()

void ast_log_ap ( int  level,
const char *  file,
int  line,
const char *  function,
const char *  fmt,
va_list  ap 
)

Definition at line 2018 of file logger.c.

References __ast_verbose_ap(), __LOG_VERBOSE, ast_log_full(), ast_read_threadstorage_callid(), and logmsg::callid.

Referenced by ast_log(), and module_load_error().

2019 {
2020  ast_callid callid;
2021 
2022  callid = ast_read_threadstorage_callid();
2023 
2024  if (level == __LOG_VERBOSE) {
2025  __ast_verbose_ap(file, line, function, 0, callid, fmt, ap);
2026  } else {
2027  ast_log_full(level, -1, file, line, function, callid, fmt, ap);
2028  }
2029 }
unsigned int ast_callid
Definition: logger.h:87
void __ast_verbose_ap(const char *file, int line, const char *func, int level, ast_callid callid, const char *fmt, va_list ap)
Definition: logger.c:2101
ast_callid ast_read_threadstorage_callid(void)
extracts the callerid from the thread
Definition: logger.c:1870
#define __LOG_VERBOSE
Definition: logger.h:295
static void ast_log_full(int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt, va_list ap)
send log messages to syslog and/or the console
Definition: logger.c:1961

◆ ast_log_backtrace()

void ast_log_backtrace ( void  )

Log a backtrace of the current thread's execution stack to the Asterisk log.

Definition at line 2066 of file logger.c.

References __LOG_ERROR, ast_bt::addresses, ast_bt_create, ast_bt_destroy, ast_bt_free_symbols, ast_bt_get_symbols, ast_free, ast_log(), ast_log_safe(), ast_str_append(), ast_str_buffer(), ast_str_create, AST_VECTOR_GET, AST_VECTOR_SIZE, buf, LOG_ERROR, LOG_WARNING, NULL, and ast_bt::num_frames.

Referenced by __ast_assert_failed(), ast_json_vpack(), ast_sched_del(), and AST_TEST_DEFINE().

2067 {
2068 #ifdef HAVE_BKTR
2069  struct ast_bt *bt;
2070  int i = 0;
2071  struct ast_vector_string *strings;
2072 
2073  if (!(bt = ast_bt_create())) {
2074  ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
2075  return;
2076  }
2077 
2078  if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
2079  int count = AST_VECTOR_SIZE(strings);
2080  struct ast_str *buf = ast_str_create(bt->num_frames * 64);
2081 
2082  if (buf) {
2083  ast_str_append(&buf, 0, "Got %d backtrace record%c\n", count - 3, count - 3 != 1 ? 's' : ' ');
2084  for (i = 3; i < AST_VECTOR_SIZE(strings); i++) {
2085  ast_str_append(&buf, 0, "#%2d: %s\n", i - 3, AST_VECTOR_GET(strings, i));
2086  }
2087  ast_log_safe(__LOG_ERROR, NULL, 0, NULL, "%s\n", ast_str_buffer(buf));
2088  ast_free(buf);
2089  }
2090 
2091  ast_bt_free_symbols(strings);
2092  } else {
2093  ast_log(LOG_ERROR, "Could not allocate memory for backtrace\n");
2094  }
2095  ast_bt_destroy(bt);
2096 #else
2097  ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
2098 #endif /* defined(HAVE_BKTR) */
2099 }
#define ast_bt_free_symbols(string_vector)
Definition: backtrace.h:42
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define LOG_WARNING
Definition: logger.h:274
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
#define ast_bt_get_symbols(addresses, num_frames)
Definition: backtrace.h:41
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
#define ast_bt_destroy(bt)
Definition: backtrace.h:40
#define __LOG_ERROR
Definition: logger.h:284
#define NULL
Definition: resample.c:96
void ast_log_safe(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message with protection against recursion.
Definition: logger.c:2031
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
#define ast_bt_create()
Definition: backtrace.h:39
#define ast_free(a)
Definition: astmm.h:182
void * addresses[AST_MAX_BT_FRAMES]
Definition: backtrace.h:52
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 i...
Definition: logger.c:2009
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:678
int num_frames
Definition: backtrace.h:54
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:611
#define ast_str_create(init_len)
Create a malloc&#39;ed dynamic length string.
Definition: strings.h:620

◆ ast_log_callid()

void ast_log_callid ( int  level,
const char *  file,
int  line,
const char *  function,
ast_callid  callid,
const char *  fmt,
  ... 
)

Used for sending a log message with a known call_id This is a modified logger function which is functionally identical to the above logger function, it just include a call_id argument as well. If NULL is specified here, no attempt will be made to join the log message with a call_id.

Parameters
levelType of log event
fileWill be provided by the AST_LOG_* macro
lineWill be provided by the AST_LOG_* macro
functionWill be provided by the AST_LOG_* macro
callidThis is the ast_callid that is associated with the log message. May be NULL.
fmtThis is what is important. The format is the same as your favorite breed of printf. You know how that works, right? :-)

Definition at line 2057 of file logger.c.

References ast_log_full().

Referenced by ast_channel_destructor(), and dahdi_cc_callback().

2058 {
2059  va_list ap;
2060  va_start(ap, fmt);
2061  ast_log_full(level, -1, file, line, function, callid, fmt, ap);
2062  va_end(ap);
2063 }
static void ast_log_full(int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt, va_list ap)
send log messages to syslog and/or the console
Definition: logger.c:1961

◆ ast_log_full()

static void ast_log_full ( int  level,
int  sublevel,
const char *  file,
int  line,
const char *  function,
ast_callid  callid,
const char *  fmt,
va_list  ap 
)
static

send log messages to syslog and/or the console

Definition at line 1961 of file logger.c.

References __LOG_VERBOSE, __LOG_WARNING, ast_cond_signal, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_opt_exec, ast_opt_remote, AST_PTHREADT_NULL, format_log_message(), format_log_message_ap(), high_water_alert, logmsg::list, logger_messages_discarded, logger_print_normal(), logger_queue_limit, logger_queue_size, logmsg_free(), and NULL.

Referenced by __ast_verbose_ap(), ast_log_ap(), ast_log_callid(), ast_log_safe(), and update_logchannels().

1964 {
1965  struct logmsg *logmsg = NULL;
1966 
1968  return;
1969  }
1970 
1975  logmsg = format_log_message(__LOG_WARNING, 0, "logger", 0, "***", 0,
1976  "Log queue threshold (%d) exceeded. Discarding new messages.\n", logger_queue_limit);
1977  AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
1978  high_water_alert = 1;
1980  }
1982  return;
1983  }
1985 
1986  logmsg = format_log_message_ap(level, sublevel, file, line, function, callid, fmt, ap);
1987  if (!logmsg) {
1988  return;
1989  }
1990 
1991  /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */
1992  if (logthread != AST_PTHREADT_NULL) {
1994  if (close_logger_thread) {
1995  /* Logger is either closing or closed. We cannot log this message. */
1996  logmsg_free(logmsg);
1997  } else {
1998  AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
2001  }
2003  } else {
2004  logger_print_normal(logmsg);
2005  logmsg_free(logmsg);
2006  }
2007 }
static void logger_print_normal(struct logmsg *logmsg)
Print a normal log message to the channels.
Definition: logger.c:1497
int line
Definition: logger.c:166
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
static pthread_t logthread
Definition: logger.c:186
static void logmsg_free(struct logmsg *msg)
Definition: logger.c:179
ast_callid callid
Definition: logger.c:168
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
struct logmsg::@397 list
#define __LOG_WARNING
Definition: logger.h:273
#define NULL
Definition: resample.c:96
#define ast_cond_signal(cond)
Definition: lock.h:201
static struct logmsg * format_log_message(int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt,...)
Definition: logger.c:1658
Definition: logger.c:162
static unsigned int high_water_alert
Definition: logger.c:93
#define AST_PTHREADT_NULL
Definition: lock.h:66
int level
Definition: logger.c:164
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
#define ast_opt_remote
Definition: options.h:112
static struct logmsg * format_log_message_ap(int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt, va_list ap)
Definition: logger.c:1599
#define ast_opt_exec
Definition: options.h:113
#define __LOG_VERBOSE
Definition: logger.h:295
static int logger_queue_size
Definition: logger.c:88
static int close_logger_thread
Definition: logger.c:188
static int logger_queue_limit
Definition: logger.c:91
static int logger_messages_discarded
Definition: logger.c:92
static ast_cond_t logcond
Definition: logger.c:187
int sublevel
Definition: logger.c:165

◆ ast_log_safe()

void ast_log_safe ( int  level,
const char *  file,
int  line,
const char *  function,
const char *  fmt,
  ... 
)

Used for sending a log message with protection against recursion.

Note
This function should be used by all error messages that might be directly or indirectly caused by logging.
See also
ast_log for documentation on the parameters.

Definition at line 2031 of file logger.c.

References ast_log_full(), ast_read_threadstorage_callid(), ast_threadstorage_get_ptr(), ast_threadstorage_set_ptr(), logmsg::callid, and NULL.

Referenced by __ast_str_helper(), and ast_log_backtrace().

2032 {
2033  va_list ap;
2034  void *recursed = ast_threadstorage_get_ptr(&in_safe_log);
2036 
2037  if (recursed) {
2038  return;
2039  }
2040 
2041  if (ast_threadstorage_set_ptr(&in_safe_log, (void*)1)) {
2042  /* We've failed to set the flag that protects against
2043  * recursion, so bail. */
2044  return;
2045  }
2046 
2047  callid = ast_read_threadstorage_callid();
2048 
2049  va_start(ap, fmt);
2050  ast_log_full(level, -1, file, line, function, callid, fmt, ap);
2051  va_end(ap);
2052 
2053  /* Clear flag so the next allocation failure can be logged. */
2054  ast_threadstorage_set_ptr(&in_safe_log, NULL);
2055 }
int line
Definition: logger.c:166
ast_callid callid
Definition: logger.c:168
unsigned int ast_callid
Definition: logger.h:87
#define NULL
Definition: resample.c:96
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.
int level
Definition: logger.c:164
ast_callid ast_read_threadstorage_callid(void)
extracts the callerid from the thread
Definition: logger.c:1870
void * ast_threadstorage_get_ptr(struct ast_threadstorage *ts)
Retrieve a raw pointer from threadstorage.
static void ast_log_full(int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt, va_list ap)
send log messages to syslog and/or the console
Definition: logger.c:1961

◆ ast_logger_create_channel()

int ast_logger_create_channel ( const char *  log_channel,
const char *  components 
)

Create a log channel.

Parameters
log_channelLog channel to create
componentsLogging config levels to add to the log channel

Definition at line 1336 of file logger.c.

References AST_LOGGER_ALLOC_ERROR, AST_LOGGER_DECLINE, AST_LOGGER_FAILURE, AST_LOGGER_SUCCESS, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strlen_zero, find_logchannel(), global_logmask, logchannel::list, logchannel::logmask, and make_logchannel().

Referenced by ast_ari_asterisk_add_log(), handle_cli_queue_test(), and handle_logger_add_channel().

1337 {
1338  struct logchannel *chan;
1339 
1340  if (ast_strlen_zero(components)) {
1341  return AST_LOGGER_DECLINE;
1342  }
1343 
1345 
1346  chan = find_logchannel(log_channel);
1347  if (chan) {
1349  return AST_LOGGER_FAILURE;
1350  }
1351 
1352  chan = make_logchannel(log_channel, components, 0, 1);
1353  if (!chan) {
1355  return AST_LOGGER_ALLOC_ERROR;
1356  }
1357 
1359  global_logmask |= chan->logmask;
1360 
1362 
1363  return AST_LOGGER_SUCCESS;
1364 }
static unsigned int global_logmask
Definition: logger.c:82
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
char components[0]
Definition: logger.c:152
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:717
unsigned int logmask
Definition: logger.c:132
static struct logchannel * make_logchannel(const char *channel, const char *components, int lineno, int dynamic)
Definition: logger.c:562
static struct logchannel * find_logchannel(const char *channel)
Find a particular logger channel by name.
Definition: logger.c:546
#define ast_strlen_zero(a)
Definition: muted.c:73
struct logchannel::@396 list

◆ ast_logger_get_channels()

int ast_logger_get_channels ( int(*)(const char *channel, const char *type, const char *status, const char *configuration, void *data)  logentry,
void *  data 
)

Retrieve the existing log channels.

Parameters
logentryA callback to an updater function
dataData passed into the callback for manipulation

For each of the logging channels, logentry will be executed with the channel file name, log type, status of the log, and configuration levels.

Return values
0on success
1on failure
-2on allocation error

Definition at line 1253 of file logger.c.

References ARRAY_LEN, ast_free, AST_LOGGER_ALLOC_ERROR, AST_LOGGER_FAILURE, AST_LOGGER_SUCCESS, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_str_append(), ast_str_buffer(), ast_str_create, ast_str_reset(), logchannel::disabled, logchannel::filename, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, NULL, and logchannel::type.

Referenced by ast_ari_asterisk_list_log_channels().

1255 {
1256  struct logchannel *chan;
1257  struct ast_str *configs = ast_str_create(64);
1258  int res = AST_LOGGER_SUCCESS;
1259 
1260  if (!configs) {
1261  return AST_LOGGER_ALLOC_ERROR;
1262  }
1263 
1265  AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
1266  unsigned int level;
1267 
1268  ast_str_reset(configs);
1269 
1270  for (level = 0; level < ARRAY_LEN(levels); level++) {
1271  if ((chan->logmask & (1 << level)) && levels[level]) {
1272  ast_str_append(&configs, 0, "%s ", levels[level]);
1273  }
1274  }
1275 
1276  res = logentry(chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" :
1277  (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), chan->disabled ?
1278  "Disabled" : "Enabled", ast_str_buffer(configs), data);
1279 
1280  if (res) {
1282  ast_free(configs);
1283  configs = NULL;
1284  return AST_LOGGER_FAILURE;
1285  }
1286  }
1288 
1289  ast_free(configs);
1290  configs = NULL;
1291 
1292  return AST_LOGGER_SUCCESS;
1293 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:203
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
#define NULL
Definition: resample.c:96
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
unsigned int logmask
Definition: logger.c:132
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:134
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
enum logtypes type
Definition: logger.c:140
#define ast_free(a)
Definition: astmm.h:182
char filename[PATH_MAX]
Definition: logger.c:144
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
Definition: strings.h:653
#define ast_str_create(init_len)
Create a malloc&#39;ed dynamic length string.
Definition: strings.h:620

◆ ast_logger_get_dateformat()

const char* ast_logger_get_dateformat ( void  )

Get the logger configured date format.

Return values
Thedate format string
Since
13.0.0

Definition at line 2458 of file logger.c.

References dateformat.

Referenced by cli_show_tasks(), and set_header().

2459 {
2460  return dateformat;
2461 }
static char dateformat[256]
Definition: logger.c:76

◆ ast_logger_get_queue_limit()

int ast_logger_get_queue_limit ( void  )

Get the maximum number of messages allowed in the processing queue.

Returns
Queue limit

Definition at line 2468 of file logger.c.

References logger_queue_limit.

Referenced by handle_cli_queue_test().

2469 {
2470  return logger_queue_limit;
2471 }
static int logger_queue_limit
Definition: logger.c:91

◆ ast_logger_register_level()

int ast_logger_register_level ( const char *  name)

Register a new logger level.

Parameters
nameThe name of the level to be registered
Return values
-1if an error occurs
non-zerolevel to be used with ast_log for sending messages to this level
Since
1.8

Definition at line 2376 of file logger.c.

References ARRAY_LEN, ast_debug, ast_log(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strdup, available(), LOG_WARNING, and update_logchannels().

Referenced by handle_cli_dynamic_level_test(), handle_cli_performance_test(), handle_cli_queue_test(), and load_module().

2377 {
2378  unsigned int level;
2379  unsigned int available = 0;
2380 
2382 
2383  for (level = 0; level < ARRAY_LEN(levels); level++) {
2384  if ((level >= 16) && !available && !levels[level]) {
2385  available = level;
2386  continue;
2387  }
2388 
2389  if (levels[level] && !strcasecmp(levels[level], name)) {
2391  "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n",
2392  name);
2394 
2395  return -1;
2396  }
2397  }
2398 
2399  if (!available) {
2401  "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n",
2402  name);
2404 
2405  return -1;
2406  }
2407 
2409 
2411 
2412  ast_debug(1, "Registered dynamic logger level '%s' with index %u.\n", name, available);
2413 
2415 
2416  return available;
2417 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define LOG_WARNING
Definition: logger.h:274
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:203
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
static void update_logchannels(void)
Definition: logger.c:2268
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
static const char name[]
Definition: cdr_mysql.c:74
static int available(struct dahdi_pvt **pvt, int is_specific_channel)
Definition: chan_dahdi.c:13058
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 i...
Definition: logger.c:2009

◆ ast_logger_remove_channel()

int ast_logger_remove_channel ( const char *  log_channel)

Delete the specified log channel.

Parameters
log_channelThe log channel to delete

Definition at line 1402 of file logger.c.

References ast_free, AST_LOGGER_FAILURE, AST_LOGGER_SUCCESS, AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::dynamic, logchannel::fileptr, find_logchannel(), logchannel::list, and NULL.

Referenced by ast_ari_asterisk_delete_log(), handle_cli_queue_test(), and handle_logger_remove_channel().

1403 {
1404  struct logchannel *chan;
1405 
1407 
1408  chan = find_logchannel(log_channel);
1409  if (chan && chan->dynamic) {
1411  } else {
1413  return AST_LOGGER_FAILURE;
1414  }
1416 
1417  if (chan->fileptr) {
1418  fclose(chan->fileptr);
1419  chan->fileptr = NULL;
1420  }
1421  ast_free(chan);
1422  chan = NULL;
1423 
1424  return AST_LOGGER_SUCCESS;
1425 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define NULL
Definition: resample.c:96
int dynamic
Definition: logger.c:150
static struct logchannel * find_logchannel(const char *channel)
Find a particular logger channel by name.
Definition: logger.c:546
#define ast_free(a)
Definition: astmm.h:182
FILE * fileptr
Definition: logger.c:142
struct logchannel::@396 list
#define AST_RWLIST_REMOVE
Definition: linkedlists.h:884

◆ ast_logger_rotate()

int ast_logger_rotate ( void  )

Reload logger while rotating log files.

Definition at line 1171 of file logger.c.

References NULL, and reload_logger().

Referenced by action_loggerrotate().

1172 {
1173  return reload_logger(1, NULL);
1174 }
#define NULL
Definition: resample.c:96
static int reload_logger(int rotate, const char *altconf)
Definition: logger.c:1058

◆ ast_logger_rotate_channel()

int ast_logger_rotate_channel ( const char *  log_channel)

Rotate the specified log channel.

Parameters
log_channelThe log channel to rotate

Definition at line 1176 of file logger.c.

References ast_config_AST_LOG_DIR, AST_LOGGER_FAILURE, AST_LOGGER_SUCCESS, ast_mkdir(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::disabled, EVENT_FLAG_SYSTEM, logchannel::filename, logchannel::fileptr, init_logger_chain(), logchannel::list, make_filename(), manager_event, NULL, PATH_MAX, and rotate_file().

Referenced by ast_ari_asterisk_rotate_log().

1177 {
1178  struct logchannel *f;
1179  int success = AST_LOGGER_FAILURE;
1180  char filename[PATH_MAX];
1181 
1182  make_filename(log_channel, filename, sizeof(filename));
1183 
1185 
1187 
1189  if (f->disabled) {
1190  f->disabled = 0; /* Re-enable logging at reload */
1191  manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n",
1192  f->filename);
1193  }
1194  if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
1195  fclose(f->fileptr); /* Close file */
1196  f->fileptr = NULL;
1197  if (strcmp(filename, f->filename) == 0) {
1198  rotate_file(f->filename);
1199  success = AST_LOGGER_SUCCESS;
1200  }
1201  }
1202  }
1203 
1205 
1207 
1208  return success;
1209 }
static int init_logger_chain(const char *altconf)
Read config, setup channels.
Definition: logger.c:638
static int rotate_file(const char *filename)
Definition: logger.c:891
static void make_filename(const char *channel, char *filename, size_t size)
create the filename that will be used for a logger channel.
Definition: logger.c:505
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define NULL
Definition: resample.c:96
#define EVENT_FLAG_SYSTEM
Definition: manager.h:71
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:134
const char * ast_config_AST_LOG_DIR
Definition: options.c:156
FILE * fileptr
Definition: logger.c:142
char filename[PATH_MAX]
Definition: logger.c:144
struct logchannel::@396 list
#define PATH_MAX
Definition: asterisk.h:40
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:248
int ast_mkdir(const char *path, int mode)
Recursively create directory path.
Definition: main/utils.c:2101

◆ ast_logger_set_queue_limit()

void ast_logger_set_queue_limit ( int  queue_limit)

Set the maximum number of messages allowed in the processing queue.

Parameters
queue_limit
Returns
Nothing

Definition at line 2463 of file logger.c.

References logger_queue_limit.

Referenced by handle_cli_queue_test().

2464 {
2465  logger_queue_limit = queue_limit;
2466 }
static int logger_queue_limit
Definition: logger.c:91

◆ ast_logger_unregister_level()

void ast_logger_unregister_level ( const char *  name)

Unregister a previously registered logger level.

Parameters
nameThe name of the level to be unregistered
Returns
nothing
Since
1.8

Definition at line 2419 of file logger.c.

References ARRAY_LEN, ast_debug, ast_free, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, global_logmask, NULL, and update_logchannels().

Referenced by handle_cli_dynamic_level_test(), handle_cli_performance_test(), handle_cli_queue_test(), load_module(), and unload_module().

2420 {
2421  unsigned int found = 0;
2422  unsigned int x;
2423 
2425 
2426  for (x = 16; x < ARRAY_LEN(levels); x++) {
2427  if (!levels[x]) {
2428  continue;
2429  }
2430 
2431  if (strcasecmp(levels[x], name)) {
2432  continue;
2433  }
2434 
2435  found = 1;
2436  break;
2437  }
2438 
2439  if (found) {
2440  /* take this level out of the global_logmask, to ensure that no new log messages
2441  * will be queued for it
2442  */
2443 
2444  global_logmask &= ~(1 << x);
2445 
2446  ast_free(levels[x]);
2447  levels[x] = NULL;
2449 
2450  ast_debug(1, "Unregistered dynamic logger level '%s' with index %u.\n", name, x);
2451 
2453  } else {
2455  }
2456 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static unsigned int global_logmask
Definition: logger.c:82
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:203
#define NULL
Definition: resample.c:96
static void update_logchannels(void)
Definition: logger.c:2268
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:444
static const char name[]
Definition: cdr_mysql.c:74
#define ast_free(a)
Definition: astmm.h:182

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 2496 of file logger.c.

◆ ast_queue_log()

void ast_queue_log ( const char *  queuename,
const char *  callid,
const char *  agent,
const char *  event,
const char *  fmt,
  ... 
)

Definition at line 811 of file logger.c.

References args, AST_APP_ARG, ast_check_realtime(), AST_DECLARE_APP_ARGS, ast_localtime(), AST_NONSTANDARD_APP_ARGS, ast_realtime_require_field(), AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_store_realtime(), ast_strftime(), ast_tvnow(), logfiles, logger_initialized, logger_queue_start(), NULL, queuelog_init, RQ_CHAR, S_OR, and SENTINEL.

Referenced by aqm_exec(), find_queue_by_name_rt(), handle_blind_transfer(), handle_hangup(), handle_queue_add_member(), handle_queue_remove_member(), log_attended_transfer(), logger_queue_start(), manager_add_queue_member(), manager_queue_log_custom(), manager_remove_queue_member(), ql_exec(), queue_agent_cb(), queue_exec(), qupd_exec(), reload_logger(), rna(), rqm_exec(), rt_handle_member_record(), set_member_paused(), set_member_penalty_help_members(), set_queue_member_pause(), set_queue_member_ringinuse(), try_calling(), update_realtime_members(), wait_for_answer(), and wait_our_turn().

812 {
813  va_list ap;
814  struct timeval tv;
815  struct ast_tm tm;
816  char qlog_msg[8192];
817  int qlog_len;
818  char time_str[30];
819 
820  if (!logger_initialized) {
821  /* You are too early. We are not open yet! */
822  return;
823  }
824  if (!queuelog_init) {
825  /* We must initialize now since someone is trying to log something. */
827  }
828 
829  if (ast_check_realtime("queue_log")) {
830  tv = ast_tvnow();
831  ast_localtime(&tv, &tm, logfiles.queue_log_realtime_use_gmt ? "GMT" : NULL);
832  ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm);
833  va_start(ap, fmt);
834  vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
835  va_end(ap);
836  if (logfiles.queue_adaptive_realtime) {
838  AST_APP_ARG(data)[5];
839  );
840  AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|');
841  /* Ensure fields are large enough to receive data */
842  ast_realtime_require_field("queue_log",
843  "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")),
844  "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")),
845  "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")),
846  "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")),
847  "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")),
848  SENTINEL);
849 
850  /* Store the log */
851  ast_store_realtime("queue_log", "time", time_str,
852  "callid", callid,
853  "queuename", queuename,
854  "agent", agent,
855  "event", event,
856  "data1", S_OR(args.data[0], ""),
857  "data2", S_OR(args.data[1], ""),
858  "data3", S_OR(args.data[2], ""),
859  "data4", S_OR(args.data[3], ""),
860  "data5", S_OR(args.data[4], ""),
861  SENTINEL);
862  } else {
863  ast_store_realtime("queue_log", "time", time_str,
864  "callid", callid,
865  "queuename", queuename,
866  "agent", agent,
867  "event", event,
868  "data", qlog_msg,
869  SENTINEL);
870  }
871 
872  if (!logfiles.queue_log_to_file) {
873  return;
874  }
875  }
876 
877  if (qlog) {
878  va_start(ap, fmt);
879  qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
880  vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
881  va_end(ap);
883  if (qlog) {
884  fprintf(qlog, "%s\n", qlog_msg);
885  fflush(qlog);
886  }
888  }
889 }
static int queuelog_init
Definition: logger.c:83
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1739
int ast_check_realtime(const char *family)
Check if realtime engine is configured for family.
Definition: main/config.c:3363
Definition: astman.c:222
void logger_queue_start(void)
Start the ast_queue_log() logger.
Definition: logger.c:1766
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
const char * args
#define NULL
Definition: resample.c:96
static FILE * qlog
Definition: logger.c:190
static int logger_initialized
Definition: logger.c:84
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define SENTINEL
Definition: compiler.h:87
int ast_store_realtime(const char *family,...) attribute_sentinel
Create realtime configuration.
Definition: main/config.c:3570
int ast_realtime_require_field(const char *family,...) attribute_sentinel
Inform realtime what fields that may be stored.
Definition: main/config.c:3382
#define AST_NONSTANDARD_APP_ARGS(args, parse, sep)
Performs the &#39;nonstandard&#39; argument separation process for an application.
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2524
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
static struct @395 logfiles
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application&#39;s arguments.
#define AST_APP_ARG(name)
Define an application argument.

◆ ast_read_threadstorage_callid()

ast_callid ast_read_threadstorage_callid ( void  )

extracts the callerid from the thread

Return values
Non-zeroCall id related to the thread
0if no call_id is present in the thread

Definition at line 1870 of file logger.c.

References ast_threadstorage_get(), and unique_callid.

Referenced by __ast_pbx_run(), __ast_verbose(), ast_callid_threadstorage_auto(), ast_dial_run(), ast_log_ap(), ast_log_safe(), bridge_channel_internal_join(), bridge_impart_internal(), common_recall_channel_setup(), iax2_request(), jingle_alloc(), launch_monitor_thread(), local_request_with_stream_topology(), media_request_helper(), sip_request_call(), and socket_process().

1871 {
1872  ast_callid *callid;
1873 
1874  callid = ast_threadstorage_get(&unique_callid, sizeof(*callid));
1875 
1876  return callid ? *callid : 0;
1877 }
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
unsigned int ast_callid
Definition: logger.h:87
static struct ast_threadstorage unique_callid
Definition: logger.c:88

◆ AST_THREADSTORAGE_RAW()

AST_THREADSTORAGE_RAW ( in_safe_log  )

Referenced by update_logchannels().

◆ ast_verb_console_get()

int ast_verb_console_get ( void  )

Get this thread's console verbosity level.

Return values
verbositylevel of the console.

Definition at line 2231 of file logger.c.

References AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_threadstorage_get(), verb_console::level, my_verb_console, and option_verbose.

Referenced by handle_show_settings(), and handle_verbose().

2232 {
2233  struct verb_console *console;
2234  int verb_level;
2235 
2236  console = ast_threadstorage_get(&my_verb_console, sizeof(*console));
2238  if (!console) {
2239  verb_level = 0;
2240  } else if (console->level) {
2241  verb_level = *console->level;
2242  } else {
2243  verb_level = option_verbose;
2244  }
2246  return verb_level;
2247 }
static struct ast_threadstorage my_verb_console
Definition: logger.c:2202
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
int option_verbose
Definition: options.c:67
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
int * level
Definition: logger.c:2131

◆ ast_verb_console_register()

void ast_verb_console_register ( int *  level)

Register this thread's console verbosity level pointer.

Parameters
levelWhere the verbose level value is.
Returns
Nothing

Definition at line 2204 of file logger.c.

References AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_threadstorage_get(), ast_verb_update(), verb_console::level, and my_verb_console.

Referenced by netconsole().

2205 {
2206  struct verb_console *console;
2207 
2208  console = ast_threadstorage_get(&my_verb_console, sizeof(*console));
2209  if (!console || !level) {
2210  return;
2211  }
2212  console->level = level;
2213 
2217  ast_verb_update();
2218 }
Definition: test_heap.c:38
static struct ast_threadstorage my_verb_console
Definition: logger.c:2202
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
void ast_verb_update(void)
Re-evaluate the system max verbosity level (ast_verb_sys_level).
Definition: logger.c:2140
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:717
int * level
Definition: logger.c:2131

◆ ast_verb_console_set()

void ast_verb_console_set ( int  verb_level)

Set this thread's console verbosity level.

Parameters
verb_levelNew level to set.
Returns
Nothing

Definition at line 2249 of file logger.c.

References AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_threadstorage_get(), ast_verb_update(), verb_console::level, my_verb_console, and option_verbose.

Referenced by handle_verbose().

2250 {
2251  struct verb_console *console;
2252 
2253  console = ast_threadstorage_get(&my_verb_console, sizeof(*console));
2254  if (!console) {
2255  return;
2256  }
2257 
2259  if (console->level) {
2260  *console->level = verb_level;
2261  } else {
2262  option_verbose = verb_level;
2263  }
2265  ast_verb_update();
2266 }
static struct ast_threadstorage my_verb_console
Definition: logger.c:2202
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
void ast_verb_update(void)
Re-evaluate the system max verbosity level (ast_verb_sys_level).
Definition: logger.c:2140
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
int option_verbose
Definition: options.c:67
int * level
Definition: logger.c:2131

◆ ast_verb_console_unregister()

void ast_verb_console_unregister ( void  )

Unregister this thread's console verbosity level.

Returns
Nothing

Definition at line 2220 of file logger.c.

References ast_threadstorage_get(), my_verb_console, and verb_console_unregister().

Referenced by netconsole().

2221 {
2222  struct verb_console *console;
2223 
2224  console = ast_threadstorage_get(&my_verb_console, sizeof(*console));
2225  if (!console) {
2226  return;
2227  }
2228  verb_console_unregister(console);
2229 }
static struct ast_threadstorage my_verb_console
Definition: logger.c:2202
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
static void verb_console_unregister(struct verb_console *console)
Definition: logger.c:2183

◆ ast_verb_update()

void ast_verb_update ( void  )

Re-evaluate the system max verbosity level (ast_verb_sys_level).

Returns
Nothing

Definition at line 2140 of file logger.c.

References AST_LIST_TRAVERSE, ast_mutex_lock, ast_mutex_unlock, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_verb_sys_level, verb_console::level, option_verbose, verb_update_lock, and logchannel::verbosity.

Referenced by ast_verb_console_register(), ast_verb_console_set(), init_logger(), reload_logger(), and verb_console_unregister().

2141 {
2142  struct logchannel *log;
2143  struct verb_console *console;
2144  int verb_level;
2145 
2147 
2149 
2150  /* Default to the root console verbosity. */
2151  verb_level = option_verbose;
2152 
2153  /* Determine max remote console level. */
2154  AST_LIST_TRAVERSE(&verb_consoles, console, node) {
2155  if (verb_level < *console->level) {
2156  verb_level = *console->level;
2157  }
2158  }
2160 
2161  /* Determine max logger channel level. */
2163  AST_RWLIST_TRAVERSE(&logchannels, log, list) {
2164  if (verb_level < log->verbosity) {
2165  verb_level = log->verbosity;
2166  }
2167  }
2169 
2170  ast_verb_sys_level = verb_level;
2171 
2173 }
Definition: test_heap.c:38
static ast_mutex_t verb_update_lock
Definition: logger.c:2138
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
int option_verbose
Definition: options.c:67
#define ast_mutex_lock(a)
Definition: lock.h:187
int verbosity
Definition: logger.c:138
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int ast_verb_sys_level
Definition: options.c:64
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
int * level
Definition: logger.c:2131
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ close_logger()

void close_logger ( void  )

Provided by logger.c

Definition at line 1822 of file logger.c.

References ARRAY_LEN, ast_cli_unregister_multiple(), ast_cond_signal, ast_free, AST_LIST_LOCK, AST_LIST_REMOVE_HEAD, AST_LIST_UNLOCK, AST_PTHREADT_NULL, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::fileptr, logchannel::list, logger_initialized, and NULL.

Referenced by really_quit().

1823 {
1824  struct logchannel *f = NULL;
1825 
1827 
1828  logger_initialized = 0;
1829 
1830  /* Stop logger thread */
1832  close_logger_thread = 1;
1835 
1836  if (logthread != AST_PTHREADT_NULL) {
1837  pthread_join(logthread, NULL);
1838  }
1839 
1841 
1842  if (qlog) {
1843  fclose(qlog);
1844  qlog = NULL;
1845  }
1846 
1847  while ((f = AST_LIST_REMOVE_HEAD(&logchannels, list))) {
1848  if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
1849  fclose(f->fileptr);
1850  f->fileptr = NULL;
1851  }
1852  ast_free(f);
1853  }
1854 
1855  closelog(); /* syslog */
1856 
1858 }
static struct ast_cli_entry cli_logger[]
Definition: logger.c:1476
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
static pthread_t logthread
Definition: logger.c:186
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define NULL
Definition: resample.c:96
#define ast_cond_signal(cond)
Definition: lock.h:201
static FILE * qlog
Definition: logger.c:190
static int logger_initialized
Definition: logger.c:84
#define AST_PTHREADT_NULL
Definition: lock.h:66
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
#define ast_free(a)
Definition: astmm.h:182
FILE * fileptr
Definition: logger.c:142
struct logchannel::@396 list
static int close_logger_thread
Definition: logger.c:188
static ast_cond_t logcond
Definition: logger.c:187

◆ find_logchannel()

static struct logchannel* find_logchannel ( const char *  channel)
static

Find a particular logger channel by name.

Precondition
logchannels list is locked
Parameters
channelThe name of the logger channel to find
Return values
non-NULLThe corresponding logger channel
NULLUnable to find a logger channel with that particular name

Definition at line 546 of file logger.c.

References AST_RWLIST_TRAVERSE, logchannel::filename, logchannel::list, make_filename(), NULL, and PATH_MAX.

Referenced by ast_logger_create_channel(), and ast_logger_remove_channel().

547 {
548  char filename[PATH_MAX];
549  struct logchannel *chan;
550 
551  make_filename(channel, filename, sizeof(filename));
552 
554  if (!strcmp(chan->filename, filename)) {
555  return chan;
556  }
557  }
558 
559  return NULL;
560 }
static void make_filename(const char *channel, char *filename, size_t size)
create the filename that will be used for a logger channel.
Definition: logger.c:505
Definition: muted.c:95
#define NULL
Definition: resample.c:96
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
char filename[PATH_MAX]
Definition: logger.c:144
struct logchannel::@396 list
#define PATH_MAX
Definition: asterisk.h:40

◆ format_log_default()

static int format_log_default ( struct logchannel chan,
struct logmsg msg,
char *  buf,
size_t  size 
)
static

Definition at line 362 of file logger.c.

References __LOG_VERBOSE, ast_strlen_zero, logmsg::callid, COLOR_BRWHITE, COLORIZE, COLORIZE_FMT, logmsg::date, logmsg::file, logmsg::function, logmsg::level, logmsg::level_name, logmsg::line, logger_add_verbose_magic(), LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, logmsg::lwp, logmsg::message, term_strip(), and logchannel::type.

363 {
364  char call_identifier_str[13];
365 
366  if (msg->callid) {
367  snprintf(call_identifier_str, sizeof(call_identifier_str), "[C-%08x]", msg->callid);
368  } else {
369  call_identifier_str[0] = '\0';
370  }
371 
372  switch (chan->type) {
373  case LOGTYPE_SYSLOG:
374  snprintf(buf, size, "%s[%d]%s: %s:%d in %s: %s",
375  levels[msg->level], msg->lwp, call_identifier_str, msg->file,
376  msg->line, msg->function, msg->message);
377  term_strip(buf, buf, size);
378  break;
379  case LOGTYPE_FILE:
380  snprintf(buf, size, "[%s] %s[%d]%s %s: %s",
381  msg->date, msg->level_name, msg->lwp, call_identifier_str,
382  msg->file, msg->message);
383  term_strip(buf, buf, size);
384  break;
385  case LOGTYPE_CONSOLE:
386  {
387  char linestr[32];
388  int has_file = !ast_strlen_zero(msg->file);
389  int has_line = (msg->line > 0);
390  int has_func = !ast_strlen_zero(msg->function);
391 
392  /*
393  * Verbose messages are interpreted by console channels in their own
394  * special way
395  */
396  if (msg->level == __LOG_VERBOSE) {
397  return logger_add_verbose_magic(msg, buf, size);
398  }
399 
400  /* Turn the numerical line number into a string */
401  snprintf(linestr, sizeof(linestr), "%d", msg->line);
402  /* Build string to print out */
403  snprintf(buf, size, "[%s] " COLORIZE_FMT "[%d]%s: " COLORIZE_FMT "%s" COLORIZE_FMT " " COLORIZE_FMT "%s %s",
404  msg->date,
405  COLORIZE(colors[msg->level], 0, msg->level_name),
406  msg->lwp,
407  call_identifier_str,
408  COLORIZE(COLOR_BRWHITE, 0, has_file ? msg->file : ""),
409  has_file ? ":" : "",
410  COLORIZE(COLOR_BRWHITE, 0, has_line ? linestr : ""),
411  COLORIZE(COLOR_BRWHITE, 0, has_func ? msg->function : ""),
412  has_func ? ":" : "",
413  msg->message);
414  }
415  break;
416  }
417 
418  return 0;
419 }
int line
Definition: logger.c:166
static int logger_add_verbose_magic(struct logmsg *logmsg, char *buf, size_t size)
Definition: logger.c:316
static const int colors[NUMLOGLEVELS]
Colors used in the console for logging.
Definition: logger.c:214
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
ast_callid callid
Definition: logger.c:168
char * term_strip(char *outbuf, const char *inbuf, int maxout)
Remove colorings from a specified string.
Definition: term.c:311
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:203
#define COLOR_BRWHITE
Definition: term.h:62
#define COLORIZE(fg, bg, str)
Definition: term.h:68
#define COLORIZE_FMT
Shortcut macros for coloring a set of text.
Definition: term.h:67
const ast_string_field function
Definition: logger.c:175
int level
Definition: logger.c:164
const ast_string_field date
Definition: logger.c:175
enum logtypes type
Definition: logger.c:140
#define ast_strlen_zero(a)
Definition: muted.c:73
int lwp
Definition: logger.c:167
const ast_string_field level_name
Definition: logger.c:175
#define __LOG_VERBOSE
Definition: logger.h:295
const ast_string_field message
Definition: logger.c:175
const ast_string_field file
Definition: logger.c:175

◆ format_log_json()

static int format_log_json ( struct logchannel channel,
struct logmsg msg,
char *  buf,
size_t  size 
)
static

Definition at line 256 of file logger.c.

References ast_config_AST_SYSTEM_NAME, ast_copy_string(), ast_json_dump_string, ast_json_free(), ast_json_pack(), ast_json_unref(), logmsg::callid, logmsg::date, logmsg::file, logmsg::function, logmsg::level_name, logmsg::line, logmsg::lwp, logmsg::message, S_OR, str, and term_strip().

257 {
258  struct ast_json *json;
259  char *str;
260  char call_identifier_str[13];
261  size_t json_str_len;
262 
263  if (msg->callid) {
264  snprintf(call_identifier_str, sizeof(call_identifier_str), "[C-%08x]", msg->callid);
265  } else {
266  call_identifier_str[0] = '\0';
267  }
268 
269  json = ast_json_pack("{s: s, s: s, "
270  "s: {s: i, s: s} "
271  "s: {s: {s: s, s: s, s: i}, "
272  "s: s, s: s} }",
273  "hostname", ast_config_AST_SYSTEM_NAME,
274  "timestamp", msg->date,
275  "identifiers",
276  "lwp", msg->lwp,
277  "callid", S_OR(call_identifier_str, ""),
278  "logmsg",
279  "location",
280  "filename", msg->file,
281  "function", msg->function,
282  "line", msg->line,
283  "level", msg->level_name,
284  "message", msg->message);
285  if (!json) {
286  return -1;
287  }
288 
289  str = ast_json_dump_string(json);
290  if (!str) {
291  ast_json_unref(json);
292  return -1;
293  }
294 
295  ast_copy_string(buf, str, size);
296  json_str_len = strlen(str);
297  if (json_str_len > size - 1) {
298  json_str_len = size - 1;
299  }
300  buf[json_str_len] = '\n';
301  buf[json_str_len + 1] = '\0';
302 
303  term_strip(buf, buf, size);
304 
305  ast_json_free(str);
306  ast_json_unref(json);
307 
308  return 0;
309 }
int line
Definition: logger.c:166
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:591
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
ast_callid callid
Definition: logger.c:168
void ast_json_free(void *p)
Asterisk&#39;s custom JSON allocator. Exposed for use by unit tests.
Definition: json.c:52
#define ast_json_dump_string(root)
Encode a JSON value to a compact string.
Definition: json.h:763
char * term_strip(char *outbuf, const char *inbuf, int maxout)
Remove colorings from a specified string.
Definition: term.c:311
const char * str
Definition: app_jack.c:147
const char * ast_config_AST_SYSTEM_NAME
Definition: options.c:167
const ast_string_field function
Definition: logger.c:175
const ast_string_field date
Definition: logger.c:175
int lwp
Definition: logger.c:167
const ast_string_field level_name
Definition: logger.c:175
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const ast_string_field message
Definition: logger.c:175
Abstract JSON element (object, array, string, int, ...).
const ast_string_field file
Definition: logger.c:175

◆ format_log_message()

static struct logmsg* format_log_message ( int  level,
int  sublevel,
const char *  file,
int  line,
const char *  function,
ast_callid  callid,
const char *  fmt,
  ... 
)
static

Definition at line 1658 of file logger.c.

References format_log_message_ap().

Referenced by ast_log_full(), and logger_thread().

1661 {
1662  struct logmsg *logmsg;
1663  va_list ap;
1664 
1665  va_start(ap, fmt);
1666  logmsg = format_log_message_ap(level, sublevel, file, line, function, callid, fmt, ap);
1667  va_end(ap);
1668 
1669  return logmsg;
1670 }
int line
Definition: logger.c:166
ast_callid callid
Definition: logger.c:168
Definition: logger.c:162
int level
Definition: logger.c:164
static struct logmsg * format_log_message_ap(int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt, va_list ap)
Definition: logger.c:1599
int sublevel
Definition: logger.c:165

◆ format_log_message_ap()

static struct logmsg* format_log_message_ap ( int  level,
int  sublevel,
const char *  file,
int  line,
const char *  function,
ast_callid  callid,
const char *  fmt,
va_list  ap 
)
static

Definition at line 1599 of file logger.c.

References __LOG_VERBOSE, ast_calloc_with_stringfields, AST_DYNSTR_BUILD_FAILED, ast_get_tid(), ast_localtime(), ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), ast_strftime(), ast_string_field_set, ast_tvnow(), buf, logmsg::callid, dateformat, display_callids, logmsg::level, logmsg::line, log_buf, LOG_BUF_INIT_SIZE, LOGMSG_NORMAL, LOGMSG_VERBOSE, logmsg::lwp, NULL, logmsg::sublevel, and logmsg::type.

Referenced by ast_log_full(), and format_log_message().

1602 {
1603  struct logmsg *logmsg = NULL;
1604  struct ast_str *buf = NULL;
1605  struct ast_tm tm;
1606  struct timeval now = ast_tvnow();
1607  int res = 0;
1608  char datestring[256];
1609 
1610  if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) {
1611  return NULL;
1612  }
1613 
1614  /* Build string */
1615  res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
1616 
1617  /* If the build failed, then abort and free this structure */
1618  if (res == AST_DYNSTR_BUILD_FAILED) {
1619  return NULL;
1620  }
1621 
1622  /* Create a new logging message */
1623  if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128))) {
1624  return NULL;
1625  }
1626 
1627  /* Copy string over */
1629 
1630  /* Set type */
1631  if (level == __LOG_VERBOSE) {
1632  logmsg->type = LOGMSG_VERBOSE;
1633  } else {
1634  logmsg->type = LOGMSG_NORMAL;
1635  }
1636 
1637  if (display_callids && callid) {
1638  logmsg->callid = callid;
1639  }
1640 
1641  /* Create our date/time */
1642  ast_localtime(&now, &tm, NULL);
1643  ast_strftime(datestring, sizeof(datestring), dateformat, &tm);
1644  ast_string_field_set(logmsg, date, datestring);
1645 
1646  /* Copy over data */
1647  logmsg->level = level;
1648  logmsg->sublevel = sublevel;
1649  logmsg->line = line;
1650  ast_string_field_set(logmsg, level_name, levels[level]);
1651  ast_string_field_set(logmsg, file, file);
1652  ast_string_field_set(logmsg, function, function);
1653  logmsg->lwp = ast_get_tid();
1654 
1655  return logmsg;
1656 }
int line
Definition: logger.c:166
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
ast_callid callid
Definition: logger.c:168
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1739
#define LOG_BUF_INIT_SIZE
Definition: logger.c:254
int ast_str_set_va(struct ast_str **buf, ssize_t max_len, const char *fmt, va_list ap)
Set a dynamic string from a va_list.
Definition: strings.h:982
#define ast_calloc_with_stringfields(n, type, size)
Allocate a structure with embedded stringfields in a single allocation.
Definition: stringfields.h:426
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:203
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
#define NULL
Definition: resample.c:96
static struct ast_threadstorage log_buf
Definition: logger.c:253
Definition: logger.c:162
int ast_get_tid(void)
Get current thread ID.
Definition: main/utils.c:2374
int level
Definition: logger.c:164
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
int lwp
Definition: logger.c:167
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2524
enum logmsgtypes type
Definition: logger.c:163
static char dateformat[256]
Definition: logger.c:76
static int display_callids
Definition: logger.c:86
#define __LOG_VERBOSE
Definition: logger.h:295
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
int sublevel
Definition: logger.c:165
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:514

◆ handle_logger_add_channel()

static char* handle_logger_add_channel ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 1366 of file logger.c.

References ast_cli_args::argc, ast_cli_args::argv, ast_cli(), AST_LOGGER_ALLOC_ERROR, ast_logger_create_channel(), AST_LOGGER_DECLINE, AST_LOGGER_FAILURE, AST_LOGGER_SUCCESS, CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, NULL, and ast_cli_entry::usage.

1367 {
1368  switch (cmd) {
1369  case CLI_INIT:
1370  e->command = "logger add channel";
1371  e->usage =
1372  "Usage: logger add channel <name> <levels>\n"
1373  " Adds a temporary logger channel. This logger channel\n"
1374  " will exist until removed or until Asterisk is restarted.\n"
1375  " <levels> is a comma-separated list of desired logger\n"
1376  " levels such as: verbose,warning,error\n"
1377  " An optional formatter may be specified with the levels;\n"
1378  " valid values are '[json]' and '[default]'.\n";
1379  return NULL;
1380  case CLI_GENERATE:
1381  return NULL;
1382  }
1383 
1384  if (a->argc < 5) {
1385  return CLI_SHOWUSAGE;
1386  }
1387 
1388  switch (ast_logger_create_channel(a->argv[3], a->argv[4])) {
1389  case AST_LOGGER_SUCCESS:
1390  return CLI_SUCCESS;
1391  case AST_LOGGER_FAILURE:
1392  ast_cli(a->fd, "Logger channel '%s' already exists\n", a->argv[3]);
1393  return CLI_SUCCESS;
1394  case AST_LOGGER_DECLINE:
1396  default:
1397  ast_cli(a->fd, "ERROR: Unable to create log channel '%s'\n", a->argv[3]);
1398  return CLI_FAILURE;
1399  }
1400 }
const int argc
Definition: cli.h:160
Definition: cli.h:152
#define NULL
Definition: resample.c:96
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
const int fd
Definition: cli.h:159
const char *const * argv
Definition: cli.h:161
#define CLI_SHOWUSAGE
Definition: cli.h:45
int ast_logger_create_channel(const char *log_channel, const char *components)
Create a log channel.
Definition: logger.c:1336
#define CLI_FAILURE
Definition: cli.h:46
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
#define CLI_SUCCESS
Definition: cli.h:44

◆ handle_logger_reload()

static char* handle_logger_reload ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 1133 of file logger.c.

References ast_cli_args::argc, ast_cli_args::argv, ast_cli(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, NULL, reload_logger(), and ast_cli_entry::usage.

1134 {
1135  switch (cmd) {
1136  case CLI_INIT:
1137  e->command = "logger reload";
1138  e->usage =
1139  "Usage: logger reload [<alt-conf>]\n"
1140  " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n";
1141  return NULL;
1142  case CLI_GENERATE:
1143  return NULL;
1144  }
1145  if (reload_logger(0, a->argc == 3 ? a->argv[2] : NULL)) {
1146  ast_cli(a->fd, "Failed to reload the logger\n");
1147  return CLI_FAILURE;
1148  }
1149  return CLI_SUCCESS;
1150 }
const int argc
Definition: cli.h:160
Definition: cli.h:152
#define NULL
Definition: resample.c:96
static int reload_logger(int rotate, const char *altconf)
Definition: logger.c:1058
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
const int fd
Definition: cli.h:159
const char *const * argv
Definition: cli.h:161
#define CLI_FAILURE
Definition: cli.h:46
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
#define CLI_SUCCESS
Definition: cli.h:44

◆ handle_logger_remove_channel()

static char* handle_logger_remove_channel ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 1427 of file logger.c.

References ast_cli_args::argc, ast_cli_args::argv, ast_cli(), AST_LOGGER_FAILURE, ast_logger_remove_channel(), AST_LOGGER_SUCCESS, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdup, ast_strlen_zero, CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, logchannel::dynamic, ast_cli_args::fd, logchannel::filename, logchannel::list, ast_cli_args::n, NULL, ast_cli_args::pos, and ast_cli_entry::usage.

1428 {
1429  struct logchannel *chan;
1430  int gen_count = 0;
1431  char *gen_ret = NULL;
1432 
1433  switch (cmd) {
1434  case CLI_INIT:
1435  e->command = "logger remove channel";
1436  e->usage =
1437  "Usage: logger remove channel <name>\n"
1438  " Removes a temporary logger channel.\n";
1439  return NULL;
1440  case CLI_GENERATE:
1441  if (a->argc > 4 || (a->argc == 4 && a->pos > 3)) {
1442  return NULL;
1443  }
1446  if (chan->dynamic && (ast_strlen_zero(a->argv[3])
1447  || !strncmp(a->argv[3], chan->filename, strlen(a->argv[3])))) {
1448  if (gen_count == a->n) {
1449  gen_ret = ast_strdup(chan->filename);
1450  break;
1451  }
1452  gen_count++;
1453  }
1454  }
1456  return gen_ret;
1457  }
1458 
1459  if (a->argc < 4) {
1460  return CLI_SHOWUSAGE;
1461  }
1462 
1463  switch (ast_logger_remove_channel(a->argv[3])) {
1464  case AST_LOGGER_SUCCESS:
1465  ast_cli(a->fd, "Removed dynamic logger channel '%s'\n", a->argv[3]);
1466  return CLI_SUCCESS;
1467  case AST_LOGGER_FAILURE:
1468  ast_cli(a->fd, "Unable to find dynamic logger channel '%s'\n", a->argv[3]);
1469  return CLI_SUCCESS;
1470  default:
1471  ast_cli(a->fd, "Internal failure attempting to delete dynamic logger channel '%s'\n", a->argv[3]);
1472  return CLI_FAILURE;
1473  }
1474 }
int ast_logger_remove_channel(const char *log_channel)
Delete the specified log channel.
Definition: logger.c:1402
const int argc
Definition: cli.h:160
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition: cli.h:152
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
const int fd
Definition: cli.h:159
int dynamic
Definition: logger.c:150
const int n
Definition: cli.h:165
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
const char *const * argv
Definition: cli.h:161
#define CLI_SHOWUSAGE
Definition: cli.h:45
#define ast_strlen_zero(a)
Definition: muted.c:73
#define CLI_FAILURE
Definition: cli.h:46
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
char filename[PATH_MAX]
Definition: logger.c:144
#define CLI_SUCCESS
Definition: cli.h:44
const int pos
Definition: cli.h:164
struct logchannel::@396 list

◆ handle_logger_rotate()

static char* handle_logger_rotate ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 1152 of file logger.c.

References ast_cli(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, NULL, reload_logger(), and ast_cli_entry::usage.

1153 {
1154  switch (cmd) {
1155  case CLI_INIT:
1156  e->command = "logger rotate";
1157  e->usage =
1158  "Usage: logger rotate\n"
1159  " Rotates and Reopens the log files.\n";
1160  return NULL;
1161  case CLI_GENERATE:
1162  return NULL;
1163  }
1164  if (reload_logger(1, NULL)) {
1165  ast_cli(a->fd, "Failed to reload the logger and rotate log files\n");
1166  return CLI_FAILURE;
1167  }
1168  return CLI_SUCCESS;
1169 }
Definition: cli.h:152
#define NULL
Definition: resample.c:96
static int reload_logger(int rotate, const char *altconf)
Definition: logger.c:1058
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
const int fd
Definition: cli.h:159
#define CLI_FAILURE
Definition: cli.h:46
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
#define CLI_SUCCESS
Definition: cli.h:44

◆ handle_logger_set_level()

static char* handle_logger_set_level ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 1211 of file logger.c.

References ast_cli_args::argc, ast_cli_args::argv, ARRAY_LEN, ast_cli(), ast_console_toggle_loglevel(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_true(), CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_cli_args::fd, NULL, state, and ast_cli_entry::usage.

1212 {
1213  int x;
1214  int state;
1215  int level = -1;
1216 
1217  switch (cmd) {
1218  case CLI_INIT:
1219  e->command = "logger set level {DEBUG|TRACE|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}";
1220  e->usage =
1221  "Usage: logger set level {DEBUG|TRACE|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n"
1222  " Set a specific log level to enabled/disabled for this console.\n";
1223  return NULL;
1224  case CLI_GENERATE:
1225  return NULL;
1226  }
1227 
1228  if (a->argc < 5)
1229  return CLI_SHOWUSAGE;
1230 
1232 
1233  for (x = 0; x < ARRAY_LEN(levels); x++) {
1234  if (levels[x] && !strcasecmp(a->argv[3], levels[x])) {
1235  level = x;
1236  break;
1237  }
1238  }
1239 
1241 
1242  state = ast_true(a->argv[4]) ? 1 : 0;
1243 
1244  if (level != -1) {
1245  ast_console_toggle_loglevel(a->fd, level, state);
1246  ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off");
1247  } else
1248  return CLI_SHOWUSAGE;
1249 
1250  return CLI_SUCCESS;
1251 }
enum sip_cc_notify_state state
Definition: chan_sip.c:956
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
const int argc
Definition: cli.h:160
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition: cli.h:152
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:203
void ast_console_toggle_loglevel(int fd, int level, int state)
enables or disables logging of a specified level to the console fd specifies the index of the console...
Definition: asterisk.c:1209
#define NULL
Definition: resample.c:96
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
const int fd
Definition: cli.h:159
const char *const * argv
Definition: cli.h:161
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1".
Definition: main/utils.c:1821
#define CLI_SHOWUSAGE
Definition: cli.h:45
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
#define CLI_SUCCESS
Definition: cli.h:44

◆ handle_logger_show_channels()

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 1296 of file logger.c.

References ARRAY_LEN, ast_cli(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, logchannel::disabled, ast_cli_args::fd, logchannel::filename, FORMATL, logchannel::formatter, logchannel::list, logger_queue_limit, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_SYSLOG, logformatter::name, NULL, logchannel::type, and ast_cli_entry::usage.

1297 {
1298 #define FORMATL "%-35.35s %-8.8s %-10.10s %-9.9s "
1299  struct logchannel *chan;
1300  switch (cmd) {
1301  case CLI_INIT:
1302  e->command = "logger show channels";
1303  e->usage =
1304  "Usage: logger show channels\n"
1305  " List configured logger channels.\n";
1306  return NULL;
1307  case CLI_GENERATE:
1308  return NULL;
1309  }
1310  ast_cli(a->fd, "Logger queue limit: %d\n\n", logger_queue_limit);
1311  ast_cli(a->fd, FORMATL, "Channel", "Type", "Formatter", "Status");
1312  ast_cli(a->fd, "Configuration\n");
1313  ast_cli(a->fd, FORMATL, "-------", "----", "---------", "------");
1314  ast_cli(a->fd, "-------------\n");
1317  unsigned int level;
1318 
1319  ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"),
1320  chan->formatter.name,
1321  chan->disabled ? "Disabled" : "Enabled");
1322  ast_cli(a->fd, " - ");
1323  for (level = 0; level < ARRAY_LEN(levels); level++) {
1324  if ((chan->logmask & (1 << level)) && levels[level]) {
1325  ast_cli(a->fd, "%s ", levels[level]);
1326  }
1327  }
1328  ast_cli(a->fd, "\n");
1329  }
1331  ast_cli(a->fd, "\n");
1332 
1333  return CLI_SUCCESS;
1334 }
#define FORMATL
struct logformatter formatter
Definition: logger.c:130
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
Definition: cli.h:152
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:203
#define NULL
Definition: resample.c:96
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
const int fd
Definition: cli.h:159
unsigned int logmask
Definition: logger.c:132
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:134
enum logtypes type
Definition: logger.c:140
char * command
Definition: cli.h:186
const char * name
Definition: logger.c:117
const char * usage
Definition: cli.h:177
char filename[PATH_MAX]
Definition: logger.c:144
#define CLI_SUCCESS
Definition: cli.h:44
struct logchannel::@396 list
static int logger_queue_limit
Definition: logger.c:91

◆ init_logger()

int init_logger ( void  )

Provided by logger.c

Definition at line 1782 of file logger.c.

References ARRAY_LEN, ast_cli_register_multiple, ast_cond_destroy, ast_cond_init, ast_config_AST_LOG_DIR, ast_log(), ast_mkdir(), ast_mutex_destroy, ast_mutex_init, ast_pthread_create, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb_update(), init_logger_chain(), logmsgs::lock, LOG_ERROR, logger_initialized, logger_thread(), and NULL.

Referenced by asterisk_daemon().

1783 {
1784  int res;
1785  /* auto rotate if sig SIGXFSZ comes a-knockin */
1786  sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL);
1787 
1788  /* Re-initialize the logmsgs mutex. The recursive mutex can be accessed prior
1789  * to Asterisk being forked into the background, which can cause the thread
1790  * ID tracked by the underlying pthread mutex to be different than the ID of
1791  * the thread that unlocks the mutex. Since init_logger is called after the
1792  * fork, it is safe to initialize the mutex here for future accesses.
1793  */
1797 
1798  /* start logger thread */
1801  return -1;
1802  }
1803 
1804  /* register the logger cli commands */
1806 
1808 
1809  /* create log channels */
1811  res = init_logger_chain(NULL);
1813  ast_verb_update();
1814  logger_initialized = 1;
1815  if (res) {
1816  ast_log(LOG_ERROR, "Errors detected in logger.conf. Default console logging is being used.\n");
1817  }
1818 
1819  return 0;
1820 }
static struct ast_cli_entry cli_logger[]
Definition: logger.c:1476
static int init_logger_chain(const char *altconf)
Read config, setup channels.
Definition: logger.c:638
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static struct sigaction handle_SIGXFSZ
Definition: logger.c:1491
static pthread_t logthread
Definition: logger.c:186
void ast_verb_update(void)
Re-evaluate the system max verbosity level (ast_verb_sys_level).
Definition: logger.c:2140
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_cond_init(cond, attr)
Definition: lock.h:199
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
#define NULL
Definition: resample.c:96
static int logger_initialized
Definition: logger.c:84
#define LOG_ERROR
Definition: logger.h:285
#define ast_cond_destroy(cond)
Definition: lock.h:200
const char * ast_config_AST_LOG_DIR
Definition: options.c:156
static void * logger_thread(void *data)
Actual logging thread.
Definition: logger.c:1673
#define ast_pthread_create(a, b, c, d)
Definition: utils.h:499
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 i...
Definition: logger.c:2009
#define ast_mutex_init(pmutex)
Definition: lock.h:184
#define ast_mutex_destroy(a)
Definition: lock.h:186
ast_mutex_t lock
Definition: logger.c:185
static ast_cond_t logcond
Definition: logger.c:187
int ast_mkdir(const char *path, int mode)
Recursively create directory path.
Definition: main/utils.c:2101

◆ init_logger_chain()

static int init_logger_chain ( const char *  altconf)
static

Read config, setup channels.

Parameters
altconfAlternate configuration file to read.
Precondition
logchannels list is write locked
Return values
0Success
-1No config found or Failed

Definition at line 638 of file logger.c.

References __LOG_ERROR, ast_config_destroy(), ast_config_load2(), ast_console_puts_mutable(), ast_copy_string(), ast_free, AST_RWLIST_INSERT_HEAD, AST_RWLIST_REMOVE_HEAD, ast_true(), ast_variable_browse(), ast_variable_retrieve(), CONFIG_STATUS_FILEINVALID, dateformat, display_callids, errno, exec_after_rotate, global_logmask, hostname, ast_variable::lineno, logfiles, logger_queue_limit, logchannel::logmask, make_logchannel(), ast_variable::name, ast_variable::next, NONE, NULL, queue_log_name, QUEUELOG, ROTATE, S_OR, SEQUENTIAL, TIMESTAMP, ast_variable::value, and var.

Referenced by ast_logger_rotate_channel(), init_logger(), and reload_logger().

639 {
640  struct logchannel *chan;
641  struct ast_config *cfg;
642  struct ast_variable *var;
643  const char *s;
644  struct ast_flags config_flags = { 0 };
645 
646  if (!(cfg = ast_config_load2(S_OR(altconf, "logger.conf"), "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
647  cfg = NULL;
648  }
649 
650  /* Set defaults */
651  hostname[0] = '\0';
652  display_callids = 1;
653  memset(&logfiles, 0, sizeof(logfiles));
654  logfiles.queue_log = 1;
655  ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat));
657  exec_after_rotate[0] = '\0';
659 
660  /* delete our list of log channels */
661  while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) {
662  ast_free(chan);
663  }
664  global_logmask = 0;
665 
666  errno = 0;
667  /* close syslog */
668  closelog();
669 
670  /* If no config file, we're fine, set default options. */
671  if (!cfg) {
672  chan = make_logchannel("console", "error,warning,notice,verbose", 0, 0);
673  if (!chan) {
674  fprintf(stderr, "ERROR: Failed to initialize default logging\n");
675  return -1;
676  }
677 
678  AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
679  global_logmask |= chan->logmask;
680 
681  return -1;
682  }
683 
684  if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) {
685  if (ast_true(s)) {
686  if (gethostname(hostname, sizeof(hostname) - 1)) {
687  ast_copy_string(hostname, "unknown", sizeof(hostname));
688  fprintf(stderr, "What box has no hostname???\n");
689  }
690  }
691  }
692  if ((s = ast_variable_retrieve(cfg, "general", "display_callids"))) {
694  }
695  if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) {
697  }
698  if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) {
699  logfiles.queue_log = ast_true(s);
700  }
701  if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) {
702  logfiles.queue_log_to_file = ast_true(s);
703  }
704  if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) {
706  }
707  if ((s = ast_variable_retrieve(cfg, "general", "queue_log_realtime_use_gmt"))) {
708  logfiles.queue_log_realtime_use_gmt = ast_true(s);
709  }
710  if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) {
712  }
713  if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) {
714  if (strcasecmp(s, "timestamp") == 0) {
716  } else if (strcasecmp(s, "rotate") == 0) {
718  } else if (strcasecmp(s, "sequential") == 0) {
720  } else if (strcasecmp(s, "none") == 0) {
722  } else {
723  fprintf(stderr, "Unknown rotatestrategy: %s\n", s);
724  }
725  } else {
726  if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) {
728  fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n");
729  }
730  }
731  if ((s = ast_variable_retrieve(cfg, "general", "logger_queue_limit"))) {
732  if (sscanf(s, "%30d", &logger_queue_limit) != 1) {
733  fprintf(stderr, "logger_queue_limit has an invalid value. Leaving at default of %d.\n",
735  }
736  if (logger_queue_limit < 10) {
737  fprintf(stderr, "logger_queue_limit must be >= 10. Setting to 10.\n");
738  logger_queue_limit = 10;
739  }
740  }
741 
742  var = ast_variable_browse(cfg, "logfiles");
743  for (; var; var = var->next) {
744  chan = make_logchannel(var->name, var->value, var->lineno, 0);
745  if (!chan) {
746  /* Print error message directly to the consoles since the lock is held
747  * and we don't want to unlock with the list partially built */
748  ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR);
751  continue;
752  }
753  AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
754  global_logmask |= chan->logmask;
755  }
756 
757  if (qlog) {
758  fclose(qlog);
759  qlog = NULL;
760  }
761 
762  ast_config_destroy(cfg);
763 
764  return 0;
765 }
struct ast_variable * next
static unsigned int global_logmask
Definition: logger.c:82
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1216
#define CONFIG_STATUS_FILEINVALID
struct ast_config * ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags)
Load a config file.
Definition: main/config.c:3154
Structure for variables, used for configurations and for channel variables.
#define var
Definition: ast_expr2f.c:614
#define __LOG_ERROR
Definition: logger.h:284
#define NULL
Definition: resample.c:96
static FILE * qlog
Definition: logger.c:190
Definition: logger.c:98
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:717
unsigned int logmask
Definition: logger.c:132
void ast_config_destroy(struct ast_config *config)
Destroys a config.
Definition: extconf.c:1290
static char queue_log_name[256]
Definition: logger.c:78
static char exec_after_rotate[256]
Definition: logger.c:79
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1".
Definition: main/utils.c:1821
int errno
static struct logchannel * make_logchannel(const char *channel, const char *components, int lineno, int dynamic)
Definition: logger.c:562
#define ast_free(a)
Definition: astmm.h:182
#define AST_RWLIST_REMOVE_HEAD
Definition: linkedlists.h:843
void ast_console_puts_mutable(const char *string, int level)
log the string to the console, and all attached console clients
Definition: asterisk.c:1274
Structure used to handle boolean flags.
Definition: utils.h:199
const char * ast_variable_retrieve(struct ast_config *config, const char *category, const char *variable)
Definition: main/config.c:694
static char dateformat[256]
Definition: logger.c:76
rotatestrategy
Definition: logger.c:95
static int display_callids
Definition: logger.c:86
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
static struct @395 logfiles
Definition: logger.c:96
static int logger_queue_limit
Definition: logger.c:91
#define QUEUELOG
Definition: logger.h:35
static char hostname[MAXHOSTNAMELEN]
Definition: logger.c:109

◆ load_module()

static int load_module ( void  )
static

◆ logger_add_verbose_magic()

static int logger_add_verbose_magic ( struct logmsg logmsg,
char *  buf,
size_t  size 
)
static

Definition at line 316 of file logger.c.

References ast_str_append(), ast_str_append_substr(), ast_str_buffer(), ast_str_reset(), ast_str_thread_get(), logmsg::message, logmsg::sublevel, verbose_buf, VERBOSE_BUF_INIT_SIZE, VERBOSE_PREFIX_1, VERBOSE_PREFIX_2, VERBOSE_PREFIX_3, and VERBOSE_PREFIX_4.

Referenced by format_log_default().

317 {
318  const char *p;
319  const char *fmt;
320  struct ast_str *prefixed;
321  signed char magic = logmsg->sublevel > 9 ? -10 : -logmsg->sublevel - 1; /* 0 => -1, 1 => -2, etc. Can't pass NUL, as it is EOS-delimiter */
322 
323  /* For compatibility with modules still calling ast_verbose() directly instead of using ast_verb() */
324  if (logmsg->sublevel < 0) {
325  if (!strncmp(logmsg->message, VERBOSE_PREFIX_4, strlen(VERBOSE_PREFIX_4))) {
326  magic = -5;
327  } else if (!strncmp(logmsg->message, VERBOSE_PREFIX_3, strlen(VERBOSE_PREFIX_3))) {
328  magic = -4;
329  } else if (!strncmp(logmsg->message, VERBOSE_PREFIX_2, strlen(VERBOSE_PREFIX_2))) {
330  magic = -3;
331  } else if (!strncmp(logmsg->message, VERBOSE_PREFIX_1, strlen(VERBOSE_PREFIX_1))) {
332  magic = -2;
333  } else {
334  magic = -1;
335  }
336  }
337 
339  return -1;
340  }
341 
342  ast_str_reset(prefixed);
343 
344  /* for every newline found in the buffer add verbose prefix data */
345  fmt = logmsg->message;
346  do {
347  if (!(p = strchr(fmt, '\n'))) {
348  p = strchr(fmt, '\0') - 1;
349  }
350  ++p;
351 
352  ast_str_append(&prefixed, 0, "%c", (char)magic);
353  ast_str_append_substr(&prefixed, 0, fmt, p - fmt);
354  fmt = p;
355  } while (p && *p);
356 
357  snprintf(buf, size, "%s", ast_str_buffer(prefixed));
358 
359  return 0;
360 }
#define VERBOSE_PREFIX_1
Definition: logger.h:41
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define VERBOSE_PREFIX_3
Definition: logger.h:43
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
#define VERBOSE_BUF_INIT_SIZE
Definition: logger.c:251
#define VERBOSE_PREFIX_4
Definition: logger.h:44
#define VERBOSE_PREFIX_2
Definition: logger.h:42
char * ast_str_append_substr(struct ast_str **buf, ssize_t maxlen, const char *src, size_t maxsrc)
Append a non-NULL terminated substring to the end of a dynamic string.
Definition: strings.h:1014
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
Definition: strings.h:653
const ast_string_field message
Definition: logger.c:175
static struct ast_threadstorage verbose_buf
Definition: logger.c:249
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
int sublevel
Definition: logger.c:165

◆ logger_print_normal()

static void logger_print_normal ( struct logmsg logmsg)
static

Print a normal log message to the channels.

Definition at line 1497 of file logger.c.

References __LOG_VERBOSE, ast_console_puts_mutable_full(), AST_RWLIST_EMPTY, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strlen_zero, ast_syslog_priority_from_loglevel(), ast_verb, buf, logchannel::disabled, errno, EVENT_FLAG_SYSTEM, logchannel::facility, logchannel::filename, logchannel::fileptr, filesize_reload_needed, logformatter::format_log, logchannel::formatter, logmsg::level, logchannel::list, logchannel::logmask, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, manager_event, logmsg::message, NULL, option_verbose, reload_logger(), logmsg::sublevel, logchannel::type, and logchannel::verbosity.

Referenced by ast_log_full(), and logger_thread().

1498 {
1499  struct logchannel *chan = NULL;
1500  char buf[BUFSIZ];
1501  int level = 0;
1502 
1504  if (!AST_RWLIST_EMPTY(&logchannels)) {
1506 
1507  /* If the channel is disabled, then move on to the next one */
1508  if (chan->disabled) {
1509  continue;
1510  }
1511  if (logmsg->level == __LOG_VERBOSE
1512  && (((chan->verbosity < 0) ? option_verbose : chan->verbosity)) < level) {
1513  continue;
1514  }
1515 
1516  if (!(chan->logmask & (1 << logmsg->level))) {
1517  continue;
1518  }
1519 
1520  switch (chan->type) {
1521  case LOGTYPE_SYSLOG:
1522  {
1523  int syslog_level = ast_syslog_priority_from_loglevel(logmsg->level);
1524 
1525  if (syslog_level < 0) {
1526  /* we are locked here, so cannot ast_log() */
1527  fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", logmsg->level);
1528  continue;
1529  }
1530 
1531  /* Don't use LOG_MAKEPRI because it's broken in glibc<2.17 */
1532  syslog_level = chan->facility | syslog_level; /* LOG_MAKEPRI(chan->facility, syslog_level); */
1533  if (!chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
1534  syslog(syslog_level, "%s", buf);
1535  }
1536  }
1537  break;
1538  case LOGTYPE_CONSOLE:
1539  if (!chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
1540  ast_console_puts_mutable_full(buf, logmsg->level, logmsg->sublevel);
1541  }
1542  break;
1543  case LOGTYPE_FILE:
1544  {
1545  int res = 0;
1546 
1547  if (!chan->fileptr) {
1548  continue;
1549  }
1550 
1551  if (chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
1552  continue;
1553  }
1554 
1555  /* Print out to the file */
1556  res = fprintf(chan->fileptr, "%s", buf);
1557  if (res > 0) {
1558  fflush(chan->fileptr);
1559  } else if (res <= 0 && !ast_strlen_zero(logmsg->message)) {
1560  fprintf(stderr, "**** Asterisk Logging Error: ***********\n");
1561  if (errno == ENOMEM || errno == ENOSPC) {
1562  fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename);
1563  } else {
1564  fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno));
1565  }
1566 
1567  /*** DOCUMENTATION
1568  <managerEventInstance>
1569  <synopsis>Raised when a logging channel is disabled.</synopsis>
1570  <syntax>
1571  <parameter name="Channel">
1572  <para>The name of the logging channel.</para>
1573  </parameter>
1574  </syntax>
1575  </managerEventInstance>
1576  ***/
1577  manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno));
1578  chan->disabled = 1;
1579  }
1580  }
1581  break;
1582  }
1583  }
1584  } else if (logmsg->level != __LOG_VERBOSE || option_verbose >= logmsg->sublevel) {
1585  fputs(logmsg->message, stdout);
1586  }
1587 
1589 
1590  /* If we need to reload because of the file size, then do so */
1591  if (filesize_reload_needed) {
1592  reload_logger(-1, NULL);
1593  ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n");
1594  }
1595 
1596  return;
1597 }
struct logformatter formatter
Definition: logger.c:130
void ast_console_puts_mutable_full(const char *message, int level, int sublevel)
log the string to the console, and all attached console clients
Definition: asterisk.c:1281
int facility
Definition: logger.c:136
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
int option_verbose
Definition: options.c:67
#define NULL
Definition: resample.c:96
static int reload_logger(int rotate, const char *altconf)
Definition: logger.c:1058
int ast_syslog_priority_from_loglevel(int level)
Maps an Asterisk log level (i.e. LOG_ERROR) to a syslog priority constant.
Definition: syslog.c:162
#define ast_verb(level,...)
Definition: logger.h:455
int verbosity
Definition: logger.c:138
static int filesize_reload_needed
Definition: logger.c:81
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define EVENT_FLAG_SYSTEM
Definition: manager.h:71
unsigned int logmask
Definition: logger.c:132
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int level
Definition: logger.c:164
int(*const format_log)(struct logchannel *channel, struct logmsg *msg, char *buf, size_t size)
Definition: logger.c:119
int disabled
Definition: logger.c:134
#define AST_RWLIST_EMPTY
Definition: linkedlists.h:451
int errno
enum logtypes type
Definition: logger.c:140
#define ast_strlen_zero(a)
Definition: muted.c:73
FILE * fileptr
Definition: logger.c:142
char filename[PATH_MAX]
Definition: logger.c:144
#define __LOG_VERBOSE
Definition: logger.h:295
const ast_string_field message
Definition: logger.c:175
struct logchannel::@396 list
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:248
int sublevel
Definition: logger.c:165

◆ logger_queue_init()

static void logger_queue_init ( void  )
static

Definition at line 1729 of file logger.c.

References ast_config_AST_LOG_DIR, ast_log(), ast_unload_realtime(), errno, LOG_ERROR, logfiles, logger_queue_rt_start(), PATH_MAX, and queue_log_name.

Referenced by logger_queue_start().

1730 {
1731  ast_unload_realtime("queue_log");
1732  if (logfiles.queue_log) {
1733  char qfname[PATH_MAX];
1734 
1735  if (logger_queue_rt_start()) {
1736  return;
1737  }
1738 
1739  /* Open the log file. */
1740  snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR,
1741  queue_log_name);
1742  if (qlog) {
1743  /* Just in case it was already open. */
1744  fclose(qlog);
1745  }
1746  qlog = fopen(qfname, "a");
1747  if (!qlog) {
1748  ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
1749  }
1750  }
1751 }
int ast_unload_realtime(const char *family)
Release any resources cached for a realtime family.
Definition: main/config.c:3406
static FILE * qlog
Definition: logger.c:190
static int logger_queue_rt_start(void)
Definition: logger.c:995
static char queue_log_name[256]
Definition: logger.c:78
#define LOG_ERROR
Definition: logger.h:285
int errno
const char * ast_config_AST_LOG_DIR
Definition: options.c:156
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 i...
Definition: logger.c:2009
static struct @395 logfiles
#define PATH_MAX
Definition: asterisk.h:40

◆ logger_queue_restart()

static int logger_queue_restart ( int  queue_rotate)
static

Definition at line 1030 of file logger.c.

References ast_config_AST_LOG_DIR, ast_log(), errno, LOG_ERROR, logger_queue_rt_start(), NULL, PATH_MAX, queue_log_name, and rotate_file().

Referenced by reload_logger().

1031 {
1032  int res = 0;
1033  char qfname[PATH_MAX];
1034 
1035  if (logger_queue_rt_start()) {
1036  return res;
1037  }
1038 
1039  snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
1040  if (qlog) {
1041  /* Just in case it was still open. */
1042  fclose(qlog);
1043  qlog = NULL;
1044  }
1045  if (queue_rotate) {
1046  rotate_file(qfname);
1047  }
1048 
1049  /* Open the log file. */
1050  qlog = fopen(qfname, "a");
1051  if (!qlog) {
1052  ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
1053  res = -1;
1054  }
1055  return res;
1056 }
static int rotate_file(const char *filename)
Definition: logger.c:891
#define NULL
Definition: resample.c:96
static FILE * qlog
Definition: logger.c:190
static int logger_queue_rt_start(void)
Definition: logger.c:995
static char queue_log_name[256]
Definition: logger.c:78
#define LOG_ERROR
Definition: logger.h:285
int errno
const char * ast_config_AST_LOG_DIR
Definition: options.c:156
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 i...
Definition: logger.c:2009
#define PATH_MAX
Definition: asterisk.h:40

◆ logger_queue_rt_start()

static int logger_queue_rt_start ( void  )
static

Definition at line 995 of file logger.c.

References ast_check_realtime(), ast_realtime_require_field(), logfiles, RQ_CHAR, RQ_DATETIME, and SENTINEL.

Referenced by logger_queue_init(), and logger_queue_restart().

996 {
997  if (ast_check_realtime("queue_log")) {
998  if (!ast_realtime_require_field("queue_log",
999  "time", RQ_DATETIME, 26,
1000  "data1", RQ_CHAR, 20,
1001  "data2", RQ_CHAR, 20,
1002  "data3", RQ_CHAR, 20,
1003  "data4", RQ_CHAR, 20,
1004  "data5", RQ_CHAR, 20,
1005  SENTINEL)) {
1006  logfiles.queue_adaptive_realtime = 1;
1007  } else {
1008  logfiles.queue_adaptive_realtime = 0;
1009  }
1010 
1011  if (!logfiles.queue_log_to_file) {
1012  /* Don't open the log file. */
1013  return 1;
1014  }
1015  }
1016  return 0;
1017 }
int ast_check_realtime(const char *family)
Check if realtime engine is configured for family.
Definition: main/config.c:3363
#define SENTINEL
Definition: compiler.h:87
int ast_realtime_require_field(const char *family,...) attribute_sentinel
Inform realtime what fields that may be stored.
Definition: main/config.c:3382
static struct @395 logfiles

◆ logger_queue_start()

void logger_queue_start ( void  )

Start the ast_queue_log() logger.

Note
Called when the system is fully booted after startup so preloaded realtime modules can get up.
Returns
Nothing

Definition at line 1766 of file logger.c.

References ast_assert, ast_queue_log(), AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logger_initialized, logger_queue_init(), and queuelog_init.

Referenced by ast_queue_log(), and asterisk_daemon().

1767 {
1768  /* Must not be called before the logger is initialized. */
1770 
1772  if (!queuelog_init) {
1774  queuelog_init = 1;
1776  ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", "");
1777  } else {
1779  }
1780 }
static int queuelog_init
Definition: logger.c:83
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_assert(a)
Definition: utils.h:650
void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
Definition: logger.c:811
static int logger_initialized
Definition: logger.c:84
static void logger_queue_init(void)
Definition: logger.c:1729

◆ logger_thread()

static void* logger_thread ( void *  data)
static

Actual logging thread.

Definition at line 1673 of file logger.c.

References __LOG_WARNING, ast_cond_wait, AST_LIST_EMPTY, AST_LIST_FIRST, AST_LIST_HEAD_INIT_NOLOCK, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_NEXT, AST_LIST_UNLOCK, format_log_message(), high_water_alert, logmsg::list, logmsgs::lock, logger_messages_discarded, logger_print_normal(), logger_queue_size, logmsg_free(), logmsg::next, and NULL.

Referenced by init_logger().

1674 {
1675  struct logmsg *next = NULL, *msg = NULL;
1676 
1677  for (;;) {
1678  /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */
1680  if (AST_LIST_EMPTY(&logmsgs)) {
1681  if (close_logger_thread) {
1683  break;
1684  } else {
1686  }
1687  }
1688 
1689  if (high_water_alert) {
1690  msg = format_log_message(__LOG_WARNING, 0, "logger", 0, "***", 0,
1691  "Logging resumed. %d message%s discarded.\n",
1693  if (msg) {
1695  }
1696  high_water_alert = 0;
1698  }
1699 
1700  next = AST_LIST_FIRST(&logmsgs);
1702  logger_queue_size = 0;
1704 
1705  /* Otherwise go through and process each message in the order added */
1706  while ((msg = next)) {
1707  /* Get the next entry now so that we can free our current structure later */
1708  next = AST_LIST_NEXT(msg, list);
1709 
1710  /* Depending on the type, send it to the proper function */
1711  logger_print_normal(msg);
1712 
1713  /* Free the data since we are done */
1714  logmsg_free(msg);
1715  }
1716  }
1717 
1718  return NULL;
1719 }
static void logger_print_normal(struct logmsg *logmsg)
Print a normal log message to the channels.
Definition: logger.c:1497
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:420
static void logmsg_free(struct logmsg *msg)
Definition: logger.c:179
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
struct logmsg::@397 list
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:438
struct logmsg * next
Definition: logger.c:176
#define ast_cond_wait(cond, mutex)
Definition: lock.h:203
#define __LOG_WARNING
Definition: logger.h:273
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:449
#define NULL
Definition: resample.c:96
static struct logmsg * format_log_message(int level, int sublevel, const char *file, int line, const char *function, ast_callid callid, const char *fmt,...)
Definition: logger.c:1658
Definition: logger.c:162
static unsigned int high_water_alert
Definition: logger.c:93
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
Definition: linkedlists.h:680
static int logger_queue_size
Definition: logger.c:88
static int close_logger_thread
Definition: logger.c:188
ast_mutex_t lock
Definition: logger.c:185
static int logger_messages_discarded
Definition: logger.c:92
static ast_cond_t logcond
Definition: logger.c:187

◆ logmsg_free()

static void logmsg_free ( struct logmsg msg)
static

Definition at line 179 of file logger.c.

References ast_free, and ast_string_field_free_memory.

Referenced by ast_log_full(), and logger_thread().

180 {
182  ast_free(msg);
183 }
#define ast_free(a)
Definition: astmm.h:182
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:368

◆ make_components()

static void make_components ( struct logchannel chan)
static

Definition at line 426 of file logger.c.

References __LOG_VERBOSE, ARRAY_LEN, ast_strdupa, ast_strip(), ast_strlen_zero, logchannel::components, end, logchannel::filename, logchannel::formatter, logchannel::logmask, LOGTYPE_CONSOLE, logformatter::name, strsep(), logchannel::type, and logchannel::verbosity.

Referenced by make_logchannel(), and update_logchannels().

427 {
428  char *w;
429  unsigned int logmask = 0;
430  char *stringp = ast_strdupa(chan->components);
431  unsigned int x;
432  unsigned int verb_level;
433 
434  /* Default to using option_verbose as the verbosity level of the logging channel. */
435  verb_level = -1;
436 
437  w = strchr(stringp, '[');
438  if (w) {
439  char *end = strchr(w + 1, ']');
440  if (!end) {
441  fprintf(stderr, "Logger Warning: bad formatter definition for %s in logger.conf\n", chan->filename);
442  } else {
443  char *formatter_name = w + 1;
444 
445  *end = '\0';
446  stringp = end + 1;
447 
448  if (!strcasecmp(formatter_name, "json")) {
449  memcpy(&chan->formatter, &logformatter_json, sizeof(chan->formatter));
450  } else if (!strcasecmp(formatter_name, "default")) {
451  memcpy(&chan->formatter, &logformatter_default, sizeof(chan->formatter));
452  } else {
453  fprintf(stderr, "Logger Warning: Unknown formatter definition %s for %s in logger.conf; using 'default'\n",
454  formatter_name, chan->filename);
455  memcpy(&chan->formatter, &logformatter_default, sizeof(chan->formatter));
456  }
457  }
458  }
459 
460  if (!chan->formatter.name) {
461  memcpy(&chan->formatter, &logformatter_default, sizeof(chan->formatter));
462  }
463 
464  while ((w = strsep(&stringp, ","))) {
465  w = ast_strip(w);
466  if (ast_strlen_zero(w)) {
467  continue;
468  }
469  if (!strcmp(w, "*")) {
470  logmask = 0xFFFFFFFF;
471  } else if (!strncasecmp(w, "verbose(", 8)) {
472  if (levels[__LOG_VERBOSE] && sscanf(w + 8, "%30u)", &verb_level) == 1) {
473  logmask |= (1 << __LOG_VERBOSE);
474  }
475  } else {
476  for (x = 0; x < ARRAY_LEN(levels); ++x) {
477  if (levels[x] && !strcasecmp(w, levels[x])) {
478  logmask |= (1 << x);
479  break;
480  }
481  }
482  }
483  }
484  if (chan->type == LOGTYPE_CONSOLE) {
485  /*
486  * Force to use the root console verbose level so if the
487  * user specified any verbose level then it does not interfere
488  * with calculating the ast_verb_sys_level value.
489  */
490  chan->verbosity = -1;
491  logmask |= (1 << __LOG_VERBOSE);
492  } else {
493  chan->verbosity = verb_level;
494  }
495  chan->logmask = logmask;
496 }
struct logformatter formatter
Definition: logger.c:130
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
char components[0]
Definition: logger.c:152
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:203
char * end
Definition: eagi_proxy.c:73
int verbosity
Definition: logger.c:138
static struct logformatter logformatter_json
Definition: logger.c:311
unsigned int logmask
Definition: logger.c:132
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:219
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
enum logtypes type
Definition: logger.c:140
#define ast_strlen_zero(a)
Definition: muted.c:73
static struct logformatter logformatter_default
Definition: logger.c:421
const char * name
Definition: logger.c:117
char filename[PATH_MAX]
Definition: logger.c:144
char * strsep(char **str, const char *delims)
#define __LOG_VERBOSE
Definition: logger.h:295

◆ make_filename()

static void make_filename ( const char *  channel,
char *  filename,
size_t  size 
)
static

create the filename that will be used for a logger channel.

Parameters
channelThe name of the logger channel
[out]filenameThe filename for the logger channel
sizeThe size of the filename buffer

Definition at line 505 of file logger.c.

References ast_config_AST_LOG_DIR, ast_copy_string(), ast_strlen_zero, and hostname.

Referenced by ast_logger_rotate_channel(), find_logchannel(), and make_logchannel().

506 {
507  const char *log_dir_prefix = "";
508  const char *log_dir_separator = "";
509 
510  *filename = '\0';
511 
512  if (!strcasecmp(channel, "console")) {
513  return;
514  }
515 
516  if (!strncasecmp(channel, "syslog", 6)) {
517  ast_copy_string(filename, channel, size);
518  return;
519  }
520 
521  /* It's a filename */
522 
523  if (channel[0] != '/') {
524  log_dir_prefix = ast_config_AST_LOG_DIR;
525  log_dir_separator = "/";
526  }
527 
528  if (!ast_strlen_zero(hostname)) {
529  snprintf(filename, size, "%s%s%s.%s",
530  log_dir_prefix, log_dir_separator, channel, hostname);
531  } else {
532  snprintf(filename, size, "%s%s%s",
533  log_dir_prefix, log_dir_separator, channel);
534  }
535 }
Definition: muted.c:95
const char * ast_config_AST_LOG_DIR
Definition: options.c:156
#define ast_strlen_zero(a)
Definition: muted.c:73
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
static char hostname[MAXHOSTNAMELEN]
Definition: logger.c:109

◆ make_logchannel()

static struct logchannel* make_logchannel ( const char *  channel,
const char *  components,
int  lineno,
int  dynamic 
)
static

Definition at line 562 of file logger.c.

References __LOG_ERROR, ast_build_date, ast_build_hostname, ast_build_machine, ast_build_os, ast_build_user, ast_calloc, ast_console_puts_mutable(), ast_free, ast_get_version(), ast_localtime(), ast_strftime(), ast_strlen_zero, ast_syslog_facility(), ast_tvnow(), logchannel::components, dateformat, logchannel::dynamic, errno, logchannel::facility, logchannel::filename, logchannel::fileptr, logchannel::lineno, LOGTYPE_CONSOLE, LOGTYPE_FILE, LOGTYPE_SYSLOG, make_components(), make_filename(), NULL, and logchannel::type.

Referenced by ast_logger_create_channel(), and init_logger_chain().

563 {
564  struct logchannel *chan;
565  char *facility;
566  struct ast_tm tm;
567  struct timeval now = ast_tvnow();
568  char datestring[256];
569 
570  if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1)))
571  return NULL;
572 
573  strcpy(chan->components, components);
574  chan->lineno = lineno;
575  chan->dynamic = dynamic;
576 
577  make_filename(channel, chan->filename, sizeof(chan->filename));
578 
579  if (!strcasecmp(channel, "console")) {
580  chan->type = LOGTYPE_CONSOLE;
581  } else if (!strncasecmp(channel, "syslog", 6)) {
582  /*
583  * syntax is:
584  * syslog.facility => level,level,level
585  */
586  facility = strchr(channel, '.');
587  if (!facility++ || !facility) {
588  facility = "local0";
589  }
590 
591  chan->facility = ast_syslog_facility(facility);
592 
593  if (chan->facility < 0) {
594  fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
595  ast_free(chan);
596  return NULL;
597  }
598 
599  chan->type = LOGTYPE_SYSLOG;
600  openlog("asterisk", LOG_PID, chan->facility);
601  } else {
602  if (!(chan->fileptr = fopen(chan->filename, "a"))) {
603  /* Can't do real logging here since we're called with a lock
604  * so log to any attached consoles */
605  ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR);
610  ast_free(chan);
611  return NULL;
612  } else {
613  /* Create our date/time */
614  ast_localtime(&now, &tm, NULL);
615  ast_strftime(datestring, sizeof(datestring), dateformat, &tm);
616 
617  fprintf(chan->fileptr, "[%s] Asterisk %s built by %s @ %s on a %s running %s on %s\n",
620  fflush(chan->fileptr);
621  }
622  chan->type = LOGTYPE_FILE;
623  }
624  make_components(chan);
625 
626  return chan;
627 }
const char * ast_build_user
Definition: buildinfo.c:34
int facility
Definition: logger.c:136
static void make_filename(const char *channel, char *filename, size_t size)
create the filename that will be used for a logger channel.
Definition: logger.c:505
const char * ast_get_version(void)
Retrieve the Asterisk version string.
char components[0]
Definition: logger.c:152
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1739
const char * ast_build_date
Definition: buildinfo.c:33
const char * ast_build_os
Definition: buildinfo.c:32
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:150
Definition: muted.c:95
#define __LOG_ERROR
Definition: logger.h:284
#define NULL
Definition: resample.c:96
static void make_components(struct logchannel *chan)
Definition: logger.c:426
const char * ast_build_hostname
Definition: buildinfo.c:29
const char * ast_build_machine
Definition: buildinfo.c:31
int dynamic
Definition: logger.c:150
int errno
enum logtypes type
Definition: logger.c:140
#define ast_strlen_zero(a)
Definition: muted.c:73
#define ast_free(a)
Definition: astmm.h:182
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
void ast_console_puts_mutable(const char *string, int level)
log the string to the console, and all attached console clients
Definition: asterisk.c:1274
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2524
FILE * fileptr
Definition: logger.c:142
char filename[PATH_MAX]
Definition: logger.c:144
static char dateformat[256]
Definition: logger.c:76
int lineno
Definition: logger.c:148
int ast_syslog_facility(const char *facility)
Maps a syslog facility name from a string to a syslog facility constant.
Definition: syslog.c:85

◆ reload_logger()

static int reload_logger ( int  rotate,
const char *  altconf 
)
static

Definition at line 1058 of file logger.c.

References ast_config_AST_LOG_DIR, ast_mkdir(), ast_queue_log(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_unload_realtime(), ast_verb, ast_verb_update(), logchannel::disabled, EVENT_FLAG_SYSTEM, logchannel::filename, logchannel::fileptr, filesize_reload_needed, init_logger_chain(), logchannel::list, logfiles, logger_queue_restart(), manager_event, NONE, NULL, and rotate_file().

Referenced by ast_logger_rotate(), handle_logger_reload(), handle_logger_rotate(), logger_print_normal(), and reload_module().

1059 {
1060  int queue_rotate = rotate;
1061  struct logchannel *f;
1062  int res = 0;
1063 
1065 
1066  if (qlog) {
1067  if (rotate < 0) {
1068  /* Check filesize - this one typically doesn't need an auto-rotate */
1069  if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */
1070  fclose(qlog);
1071  qlog = NULL;
1072  } else {
1073  queue_rotate = 0;
1074  }
1075  } else {
1076  fclose(qlog);
1077  qlog = NULL;
1078  }
1079  } else {
1080  queue_rotate = 0;
1081  }
1082 
1084 
1086  if (f->disabled) {
1087  f->disabled = 0; /* Re-enable logging at reload */
1088  /*** DOCUMENTATION
1089  <managerEventInstance>
1090  <synopsis>Raised when a logging channel is re-enabled after a reload operation.</synopsis>
1091  <syntax>
1092  <parameter name="Channel">
1093  <para>The name of the logging channel.</para>
1094  </parameter>
1095  </syntax>
1096  </managerEventInstance>
1097  ***/
1098  manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename);
1099  }
1100  if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
1101  int rotate_this = 0;
1102  if (rotatestrategy != NONE && ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */
1103  /* Be more proactive about rotating massive log files */
1104  rotate_this = 1;
1105  }
1106  fclose(f->fileptr); /* Close file */
1107  f->fileptr = NULL;
1108  if (rotate || rotate_this) {
1109  rotate_file(f->filename);
1110  }
1111  }
1112  }
1113 
1115 
1116  init_logger_chain(altconf);
1117 
1118  ast_unload_realtime("queue_log");
1119  if (logfiles.queue_log) {
1120  res = logger_queue_restart(queue_rotate);
1122  ast_verb_update();
1123  ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", "");
1124  ast_verb(1, "Asterisk Queue Logger restarted\n");
1125  } else {
1127  ast_verb_update();
1128  }
1129 
1130  return res;
1131 }
static int init_logger_chain(const char *altconf)
Read config, setup channels.
Definition: logger.c:638
static int rotate_file(const char *filename)
Definition: logger.c:891
void ast_verb_update(void)
Re-evaluate the system max verbosity level (ast_verb_sys_level).
Definition: logger.c:2140
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
int ast_unload_realtime(const char *family)
Release any resources cached for a realtime family.
Definition: main/config.c:3406
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define NULL
Definition: resample.c:96
static FILE * qlog
Definition: logger.c:190
#define ast_verb(level,...)
Definition: logger.h:455
void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
Definition: logger.c:811
static int filesize_reload_needed
Definition: logger.c:81
#define EVENT_FLAG_SYSTEM
Definition: manager.h:71
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:134
const char * ast_config_AST_LOG_DIR
Definition: options.c:156
FILE * fileptr
Definition: logger.c:142
char filename[PATH_MAX]
Definition: logger.c:144
rotatestrategy
Definition: logger.c:95
static struct @395 logfiles
Definition: logger.c:96
struct logchannel::@396 list
static int logger_queue_restart(int queue_rotate)
Definition: logger.c:1030
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:248
int ast_mkdir(const char *path, int mode)
Recursively create directory path.
Definition: main/utils.c:2101

◆ reload_module()

static int reload_module ( void  )
static

Definition at line 2473 of file logger.c.

References NULL, and reload_logger().

Referenced by load_module().

2474 {
2475  return reload_logger(0, NULL);
2476 }
#define NULL
Definition: resample.c:96
static int reload_logger(int rotate, const char *altconf)
Definition: logger.c:1058

◆ rotate_file()

static int rotate_file ( const char *  filename)
static

Definition at line 891 of file logger.c.

References ARRAY_LEN, ast_channel_unref, ast_dummy_channel_alloc, ast_log(), ast_safe_system(), ast_strlen_zero, buf, c, exec_after_rotate, LOG_WARNING, NONE, NULL, PATH_MAX, pbx_builtin_setvar_helper(), pbx_substitute_variables_helper(), ROTATE, SEQUENTIAL, and TIMESTAMP.

Referenced by ast_logger_rotate_channel(), logger_queue_restart(), and reload_logger().

892 {
893  char old[PATH_MAX];
894  char new[PATH_MAX];
895  int x, y, which, found, res = 0, fd;
896  char *suffixes[4] = { "", ".gz", ".bz2", ".Z" };
897 
898  switch (rotatestrategy) {
899  case NONE:
900  /* No rotation */
901  break;
902  case SEQUENTIAL:
903  for (x = 0; ; x++) {
904  snprintf(new, sizeof(new), "%s.%d", filename, x);
905  fd = open(new, O_RDONLY);
906  if (fd > -1)
907  close(fd);
908  else
909  break;
910  }
911  if (rename(filename, new)) {
912  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
913  res = -1;
914  } else {
915  filename = new;
916  }
917  break;
918  case TIMESTAMP:
919  snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL));
920  if (rename(filename, new)) {
921  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
922  res = -1;
923  } else {
924  filename = new;
925  }
926  break;
927  case ROTATE:
928  /* Find the next empty slot, including a possible suffix */
929  for (x = 0; ; x++) {
930  found = 0;
931  for (which = 0; which < ARRAY_LEN(suffixes); which++) {
932  snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]);
933  fd = open(new, O_RDONLY);
934  if (fd > -1) {
935  close(fd);
936  found = 1;
937  break;
938  }
939  }
940  if (!found) {
941  break;
942  }
943  }
944 
945  /* Found an empty slot */
946  for (y = x; y > 0; y--) {
947  for (which = 0; which < ARRAY_LEN(suffixes); which++) {
948  snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]);
949  fd = open(old, O_RDONLY);
950  if (fd > -1) {
951  /* Found the right suffix */
952  close(fd);
953  snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]);
954  if (rename(old, new)) {
955  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new);
956  res = -1;
957  }
958  break;
959  }
960  }
961  }
962 
963  /* Finally, rename the current file */
964  snprintf(new, sizeof(new), "%s.0", filename);
965  if (rename(filename, new)) {
966  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
967  res = -1;
968  } else {
969  filename = new;
970  }
971  }
972 
975  char buf[512];
976 
977  pbx_builtin_setvar_helper(c, "filename", filename);
979  if (c) {
980  c = ast_channel_unref(c);
981  }
982  if (ast_safe_system(buf) == -1) {
983  ast_log(LOG_WARNING, "error executing '%s'\n", buf);
984  }
985  }
986  return res;
987 }
Main Channel structure associated with a channel.
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2873
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define LOG_WARNING
Definition: logger.h:274
static struct test_val c
#define NULL
Definition: resample.c:96
Definition: logger.c:98
#define ast_dummy_channel_alloc()
Create a fake channel structure.
Definition: channel.h:1266
static char exec_after_rotate[256]
Definition: logger.c:79
int ast_safe_system(const char *s)
Safely spawn an OS shell command while closing file descriptors.
Definition: extconf.c:829
#define ast_strlen_zero(a)
Definition: muted.c:73
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name...
char filename[PATH_MAX]
Definition: logger.c:144
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 i...
Definition: logger.c:2009
rotatestrategy
Definition: logger.c:95
void pbx_substitute_variables_helper(struct ast_channel *c, const char *cp1, char *cp2, int count)
Definition: ael_main.c:211
Definition: logger.c:96
#define PATH_MAX
Definition: asterisk.h:40

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 2478 of file logger.c.

Referenced by load_module().

2479 {
2480  return 0;
2481 }

◆ update_logchannels()

static void update_logchannels ( void  )
static

Definition at line 2268 of file logger.c.

References __LOG_TRACE, ast_free, ast_log_full(), AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_skip_blanks(), ast_str_buffer(), ast_str_create, ast_str_set(), ast_threadstorage_get_ptr(), AST_THREADSTORAGE_RAW(), ast_threadstorage_set_ptr(), AST_TRACE_INDENT_DEC_AFTER, AST_TRACE_INDENT_DEC_BEFORE, AST_TRACE_INDENT_INC_AFTER, AST_TRACE_INDENT_INC_BEFORE, AST_TRACE_INDENT_NONE, AST_TRACE_INDENT_PROVIDED, AST_TRACE_INDENT_SAME, make_ari_stubs::file, format, global_logmask, logchannel::list, logchannel::logmask, make_components(), NULL, and S_OR.

Referenced by ast_logger_register_level(), and ast_logger_unregister_level().

2269 {
2270  struct logchannel *cur;
2271 
2273 
2274  global_logmask = 0;
2275 
2277  make_components(cur);
2278  global_logmask |= cur->logmask;
2279  }
2280 
2282 }
static unsigned int global_logmask
Definition: logger.c:82
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static void make_components(struct logchannel *chan)
Definition: logger.c:426
unsigned int logmask
Definition: logger.c:132
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
struct logchannel::@396 list

◆ verb_console_free()

static void verb_console_free ( void *  v_console)
static

Definition at line 2193 of file logger.c.

References ast_free, and verb_console_unregister().

2194 {
2195  struct verb_console *console = v_console;
2196 
2197  verb_console_unregister(console);
2198  ast_free(console);
2199 }
#define ast_free(a)
Definition: astmm.h:182
static void verb_console_unregister(struct verb_console *console)
Definition: logger.c:2183

◆ verb_console_unregister()

static void verb_console_unregister ( struct verb_console console)
static

Definition at line 2183 of file logger.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and ast_verb_update().

Referenced by ast_verb_console_unregister(), and verb_console_free().

2184 {
2186  console = AST_RWLIST_REMOVE(&verb_consoles, console, node);
2188  if (console) {
2189  ast_verb_update();
2190  }
2191 }
Definition: test_heap.c:38
void ast_verb_update(void)
Re-evaluate the system max verbosity level (ast_verb_sys_level).
Definition: logger.c:2140
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define AST_RWLIST_REMOVE
Definition: linkedlists.h:884

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "Logger" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = 0, }
static

Definition at line 2496 of file logger.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 2496 of file logger.c.

◆ cli_logger

struct ast_cli_entry cli_logger[]
static

Definition at line 1476 of file logger.c.

◆ close_logger_thread

int close_logger_thread = 0
static

Definition at line 188 of file logger.c.

◆ colors

const int colors[NUMLOGLEVELS]
static

Colors used in the console for logging.

Definition at line 214 of file logger.c.

◆ dateformat

char dateformat[256] = "%b %e %T"
static

◆ display_callids

int display_callids
static

Definition at line 86 of file logger.c.

Referenced by format_log_message_ap(), and init_logger_chain().

◆ exec_after_rotate

char exec_after_rotate[256] = ""
static

Definition at line 79 of file logger.c.

Referenced by init_logger_chain(), and rotate_file().

◆ filesize_reload_needed

int filesize_reload_needed
static

Definition at line 81 of file logger.c.

Referenced by _handle_SIGXFSZ(), logger_print_normal(), and reload_logger().

◆ global_logmask

unsigned int global_logmask = 0xFFFF
static

◆ handle_SIGXFSZ

struct sigaction handle_SIGXFSZ
static
Initial value:
= {
.sa_handler = _handle_SIGXFSZ,
.sa_flags = SA_RESTART,
}
static void _handle_SIGXFSZ(int sig)
Definition: logger.c:1485

Definition at line 1491 of file logger.c.

◆ high_water_alert

unsigned int high_water_alert
static

Definition at line 93 of file logger.c.

Referenced by ast_log_full(), and logger_thread().

◆ hostname

char hostname[MAXHOSTNAMELEN]
static

Definition at line 109 of file logger.c.

Referenced by init_logger_chain(), and make_filename().

◆ levels

char* levels[NUMLOGLEVELS]
static

Logging channels used in the Asterisk logging system.

The first 16 levels are reserved for system usage, and the remaining levels are reserved for usage by dynamic levels registered via ast_logger_register_level.

Definition at line 203 of file logger.c.

◆ log_buf

struct ast_threadstorage log_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_log_buf , .custom_init = NULL , }
static

Definition at line 253 of file logger.c.

Referenced by format_log_message_ap().

◆ logchannels

struct logchannels logchannels = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
static

◆ logcond

ast_cond_t logcond
static

Definition at line 187 of file logger.c.

◆ logfiles

struct { ... } logfiles

◆ logformatter_default

struct logformatter logformatter_default
static
Initial value:
= {
.name = "default",
.format_log = format_log_default,
}
static int format_log_default(struct logchannel *chan, struct logmsg *msg, char *buf, size_t size)
Definition: logger.c:362

Definition at line 421 of file logger.c.

◆ logformatter_json

struct logformatter logformatter_json
static
Initial value:
= {
.name = "json",
.format_log = format_log_json
}
static int format_log_json(struct logchannel *channel, struct logmsg *msg, char *buf, size_t size)
Definition: logger.c:256

Definition at line 311 of file logger.c.

◆ logger_initialized

int logger_initialized
static

◆ logger_messages_discarded

int logger_messages_discarded
static

Definition at line 92 of file logger.c.

Referenced by ast_log_full(), and logger_thread().

◆ logger_queue_limit

int logger_queue_limit = 1000
static

◆ logger_queue_size

int logger_queue_size
static

Definition at line 88 of file logger.c.

Referenced by ast_log_full(), and logger_thread().

◆ logmsgs

struct logmsgs logmsgs = { .first = NULL, .last = NULL, .lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} } , }
static

◆ logthread

pthread_t logthread = AST_PTHREADT_NULL
static

Definition at line 186 of file logger.c.

◆ my_verb_console

struct ast_threadstorage my_verb_console = { .once = PTHREAD_ONCE_INIT , .key_init = __init_my_verb_console , .custom_init = NULL , }
static

◆ next_unique_callid

volatile int next_unique_callid = 1
static

Definition at line 85 of file logger.c.

Referenced by ast_create_callid().

◆ qlog

FILE* qlog
static

Definition at line 190 of file logger.c.

◆ queue_adaptive_realtime

unsigned int queue_adaptive_realtime

Definition at line 105 of file logger.c.

◆ queue_log

unsigned int queue_log

Definition at line 103 of file logger.c.

◆ queue_log_name

char queue_log_name[256] = QUEUELOG
static

Definition at line 78 of file logger.c.

Referenced by init_logger_chain(), logger_queue_init(), and logger_queue_restart().

◆ queue_log_realtime_use_gmt

unsigned int queue_log_realtime_use_gmt

Definition at line 106 of file logger.c.

◆ queue_log_to_file

unsigned int queue_log_to_file

Definition at line 104 of file logger.c.

◆ queuelog_init

int queuelog_init
static

Definition at line 83 of file logger.c.

Referenced by ast_queue_log(), and logger_queue_start().

◆ rotatestrategy

◆ unique_callid

struct ast_threadstorage unique_callid = { .once = PTHREAD_ONCE_INIT , .key_init = __init_unique_callid , .custom_init = NULL , }
static

◆ verb_consoles

struct verb_consoles verb_consoles = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} } , }
static

◆ verb_update_lock

ast_mutex_t verb_update_lock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} }
static

ast_verb_update() reentrancy protection lock.

Definition at line 2138 of file logger.c.

Referenced by ast_verb_update().

◆ verbose_buf

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

Definition at line 249 of file logger.c.

Referenced by logger_add_verbose_magic().

◆ verbose_build_buf

struct ast_threadstorage verbose_build_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_verbose_build_buf , .custom_init = NULL , }
static

Definition at line 250 of file logger.c.