Asterisk - The Open Source Telephony Project  18.5.0
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/logger_category.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"
Include dependency graph for logger.c:

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 LOTS_O_SPACES   " "
 
#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_trace (const char *file, int line, const char *func, enum ast_trace_indent_type indent_type, unsigned long new_indent, const char *format,...)
 
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)
 
unsigned long _ast_trace_dec_indent (void)
 Decrement the indent level. More...
 
unsigned long _ast_trace_get_indent (void)
 Get the current indent level. More...
 
unsigned long _ast_trace_inc_indent (void)
 Increment the indent level. More...
 
void _ast_trace_set_indent (unsigned long indent)
 Set the current indent level. More...
 
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_dynamic_logger_level (const char *name)
 Checks if a dynamic logger level exists. More...
 
void ast_init_logger_for_socket_console (void)
 load logger.conf configuration for console socket connections 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)
 
 AST_THREADSTORAGE_RAW (trace_indent)
 
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 int format_log_plain (struct logchannel *chan, struct logmsg *msg, char *buf, size_t size)
 
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 int logger_register_level (const char *name)
 
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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .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 struct logformatter logformatter_plain
 
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 257 of file logger.c.

Referenced by format_log_message_ap().

◆ LOTS_O_SPACES

#define LOTS_O_SPACES   " "

Definition at line 2375 of file logger.c.

Referenced by __ast_trace().

◆ VERBOSE_BUF_INIT_SIZE

#define VERBOSE_BUF_INIT_SIZE   256

Definition at line 254 of file logger.c.

Referenced by logger_add_verbose_magic().

Enumeration Type Documentation

◆ logmsgtypes

Enumerator
LOGMSG_NORMAL 
LOGMSG_VERBOSE 

Definition at line 160 of file logger.c.

160  {
161  LOGMSG_NORMAL = 0,
163 };

◆ logtypes

enum logtypes
Enumerator
LOGTYPE_SYSLOG 
LOGTYPE_FILE 
LOGTYPE_CONSOLE 

Definition at line 125 of file logger.c.

125  {
127  LOGTYPE_FILE,
129 };

◆ rotatestrategy

Enumerator
NONE 
SEQUENTIAL 
ROTATE 
TIMESTAMP 

Definition at line 98 of file logger.c.

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

Function Documentation

◆ __ast_trace()

void __ast_trace ( const char *  file,
int  line,
const char *  func,
enum ast_trace_indent_type  indent_type,
unsigned long  new_indent,
const char *  format,
  ... 
)

Definition at line 2405 of file logger.c.

References __LOG_TRACE, ast_free, ast_log_full(), ast_skip_blanks(), ast_str_buffer(), ast_str_create, ast_str_set(), ast_threadstorage_get_ptr(), 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, LOTS_O_SPACES, NULL, and S_OR.

2407 {
2408  va_list ap;
2409  unsigned long indent = (unsigned long)ast_threadstorage_get_ptr(&trace_indent);
2410  struct ast_str *fmt = ast_str_create(128);
2411  const char *direction = "";
2412 
2413  if (!fmt) {
2414  return;
2415  }
2416 
2417  if (indent_type == AST_TRACE_INDENT_PROVIDED) {
2418  indent = new_indent;
2419  ast_threadstorage_set_ptr(&trace_indent, (void*)indent);
2420  } else if (indent_type == AST_TRACE_INDENT_INC_BEFORE) {
2421  indent++;
2422  ast_threadstorage_set_ptr(&trace_indent, (void*)indent);
2423  } else if (indent_type == AST_TRACE_INDENT_DEC_BEFORE) {
2424  indent--;
2425  ast_threadstorage_set_ptr(&trace_indent, (void*)indent);
2426  }
2427 
2428  switch(indent_type) {
2429  case AST_TRACE_INDENT_NONE:
2430  case AST_TRACE_INDENT_SAME:
2431  direction = "";
2432  break;
2436  direction = "--> ";
2437  break;
2440  direction = "<-- ";
2441  break;
2442  }
2443 
2444  ast_str_set(&fmt, 0, "%2d %-.*s%s%s:%d %s: %s", (int)indent, (indent_type == AST_TRACE_INDENT_NONE ? 0 : (int)(indent * 4)),
2445  LOTS_O_SPACES, direction, file, line, func, S_OR(ast_skip_blanks(format), "\n"));
2446 
2447  if (indent_type == AST_TRACE_INDENT_INC_AFTER || indent_type == AST_TRACE_INDENT_PROVIDED) {
2448  indent++;
2449  ast_threadstorage_set_ptr(&trace_indent, (void*)indent);
2450  }
2451  if (indent_type == AST_TRACE_INDENT_DEC_AFTER) {
2452  indent--;
2453  ast_threadstorage_set_ptr(&trace_indent, (void*)indent);
2454  }
2455 
2456  va_start(ap, format);
2457  ast_log_full(__LOG_TRACE, -1, NULL, 0, NULL, 0, ast_str_buffer(fmt), ap);
2458  va_end(ap);
2459  ast_free(fmt);
2460 }
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
#define NULL
Definition: resample.c:96
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition: strings.h:157
#define ast_free(a)
Definition: astmm.h:182
void * ast_threadstorage_get_ptr(struct ast_threadstorage *ts)
Retrieve a raw pointer from threadstorage.
#define __LOG_TRACE
Definition: logger.h:251
#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 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:2053
direction
static snd_pcm_format_t format
Definition: chan_alsa.c:102
#define LOTS_O_SPACES
Definition: logger.c:2375
#define ast_str_create(init_len)
Create a malloc&#39;ed dynamic length string.
Definition: strings.h:620

◆ __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 2198 of file logger.c.

References __ast_verbose_ap(), and ast_read_threadstorage_callid().

2199 {
2200  ast_callid callid;
2201  va_list ap;
2202 
2203  callid = ast_read_threadstorage_callid();
2204 
2205  va_start(ap, fmt);
2206  __ast_verbose_ap(file, line, func, level, callid, fmt, ap);
2207  va_end(ap);
2208 }
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:2193
ast_callid ast_read_threadstorage_callid(void)
extracts the callerid from the thread
Definition: logger.c:1962

◆ __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 2193 of file logger.c.

References __LOG_VERBOSE, and ast_log_full().

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

2194 {
2195  ast_log_full(__LOG_VERBOSE, level, file, line, func, callid, fmt, ap);
2196 }
#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:2053

◆ __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 2210 of file logger.c.

References __ast_verbose_ap().

2211 {
2212  va_list ap;
2213  va_start(ap, fmt);
2214  __ast_verbose_ap(file, line, func, level, callid, fmt, ap);
2215  va_end(ap);
2216 }
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:2193

◆ __init_log_buf()

static void __init_log_buf ( void  )
static

Definition at line 256 of file logger.c.

260 {

◆ __init_my_verb_console()

static void __init_my_verb_console ( void  )
static

Thread specific console verbosity level node.

Definition at line 2294 of file logger.c.

2297 {

◆ __init_unique_callid()

static void __init_unique_callid ( void  )
static

Definition at line 91 of file logger.c.

98 {

◆ __init_verbose_buf()

static void __init_verbose_buf ( void  )
static

Definition at line 252 of file logger.c.

260 {

◆ __init_verbose_build_buf()

static void __init_verbose_build_buf ( void  )
static

Definition at line 253 of file logger.c.

260 {

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 2615 of file logger.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 2615 of file logger.c.

◆ _ast_trace_dec_indent()

unsigned long _ast_trace_dec_indent ( void  )

Decrement the indent level.

Returns
The new indent level

Definition at line 2396 of file logger.c.

References ast_threadstorage_get_ptr(), and ast_threadstorage_set_ptr().

2397 {
2398  unsigned long indent = (unsigned long)ast_threadstorage_get_ptr(&trace_indent);
2399  indent--;
2400  ast_threadstorage_set_ptr(&trace_indent, (void*)indent);
2401 
2402  return indent;
2403 }
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.
void * ast_threadstorage_get_ptr(struct ast_threadstorage *ts)
Retrieve a raw pointer from threadstorage.

◆ _ast_trace_get_indent()

unsigned long _ast_trace_get_indent ( void  )

Get the current indent level.

Returns
The current indent level

Definition at line 2377 of file logger.c.

References ast_threadstorage_get_ptr().

2378 {
2379  return (unsigned long)ast_threadstorage_get_ptr(&trace_indent);
2380 }
void * ast_threadstorage_get_ptr(struct ast_threadstorage *ts)
Retrieve a raw pointer from threadstorage.

◆ _ast_trace_inc_indent()

unsigned long _ast_trace_inc_indent ( void  )

Increment the indent level.

Returns
The new indent level

Definition at line 2387 of file logger.c.

References ast_threadstorage_get_ptr(), and ast_threadstorage_set_ptr().

2388 {
2389  unsigned long indent = (unsigned long)ast_threadstorage_get_ptr(&trace_indent);
2390  indent++;
2391  ast_threadstorage_set_ptr(&trace_indent, (void*)indent);
2392 
2393  return indent;
2394 }
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.
void * ast_threadstorage_get_ptr(struct ast_threadstorage *ts)
Retrieve a raw pointer from threadstorage.

◆ _ast_trace_set_indent()

void _ast_trace_set_indent ( unsigned long  indent)

Set the current indent level.

Parameters
indentThe new indent level

Definition at line 2382 of file logger.c.

References ast_threadstorage_set_ptr().

2383 {
2384  ast_threadstorage_set_ptr(&trace_indent, (void*)indent);
2385 }
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.

◆ _handle_SIGXFSZ()

static void _handle_SIGXFSZ ( int  sig)
static

Definition at line 1568 of file logger.c.

References filesize_reload_needed.

1569 {
1570  /* Indicate need to reload */
1572 }
static int filesize_reload_needed
Definition: logger.c:84

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

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

1953 {
1954  snprintf(buffer, buffer_size, "[C-%08x]", callid);
1955 }

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

1985 {
1986  ast_callid *pointing;
1987 
1988  pointing = ast_threadstorage_get(&unique_callid, sizeof(*pointing));
1989  if (!pointing) {
1990  return -1;
1991  }
1992 
1993  if (*pointing) {
1994  ast_log(LOG_ERROR, "ast_callid_threadassoc_add(C-%08x) on thread "
1995  "already associated with callid [C-%08x].\n", callid, *pointing);
1996  return 1;
1997  }
1998 
1999  *pointing = callid;
2000  return 0;
2001 }
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:91
#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:2101

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

References ast_threadstorage_get(), and unique_callid.

Referenced by autoservice_run(), and bridge_manager_service().

1972 {
1973  ast_callid *id = ast_threadstorage_get(&unique_callid, sizeof(*id));
1974 
1975  if (!id) {
1976  return -1;
1977  }
1978 
1979  *id = callid;
1980 
1981  return 0;
1982 }
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:91

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

2004 {
2005  ast_callid *pointing;
2006 
2007  pointing = ast_threadstorage_get(&unique_callid, sizeof(*pointing));
2008  if (!pointing) {
2009  return -1;
2010  }
2011 
2012  if (*pointing) {
2013  *pointing = 0;
2014  return 0;
2015  }
2016 
2017  return -1;
2018 }
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:91

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

2021 {
2022  ast_callid tmp;
2023 
2024  /* Start by trying to see if a callid is available from thread storage */
2026  if (tmp) {
2027  *callid = tmp;
2028  return 0;
2029  }
2030 
2031  /* If that failed, try to create a new one and bind it. */
2032  *callid = ast_create_callid();
2033  if (*callid) {
2034  ast_callid_threadassoc_add(*callid);
2035  return 1;
2036  }
2037 
2038  /* If neither worked, then something must have gone wrong. */
2039  return -1;
2040 }
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:1962
int ast_callid_threadassoc_add(ast_callid callid)
Adds a known callid to thread storage of the calling thread.
Definition: logger.c:1984
ast_callid ast_create_callid(void)
factory function to create a new uniquely identifying callid.
Definition: logger.c:1957

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

2043 {
2044  if (callid && callid_created) {
2045  /* If the callid was created rather than simply grabbed from the thread storage, we need to unbind here. */
2047  }
2048 }
int ast_callid_threadassoc_remove(void)
Removes callid from thread storage of the calling thread.
Definition: logger.c:2003

◆ ast_child_verbose()

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

Definition at line 850 of file logger.c.

References ast_free, ast_malloc, and NULL.

Referenced by launch_script().

851 {
852  char *msg = NULL, *emsg = NULL, *sptr, *eptr;
853  va_list ap, aq;
854  int size;
855 
856  va_start(ap, fmt);
857  va_copy(aq, ap);
858  if ((size = vsnprintf(msg, 0, fmt, ap)) < 0) {
859  va_end(ap);
860  va_end(aq);
861  return;
862  }
863  va_end(ap);
864 
865  if (!(msg = ast_malloc(size + 1))) {
866  va_end(aq);
867  return;
868  }
869 
870  vsnprintf(msg, size + 1, fmt, aq);
871  va_end(aq);
872 
873  if (!(emsg = ast_malloc(size * 2 + 1))) {
874  ast_free(msg);
875  return;
876  }
877 
878  for (sptr = msg, eptr = emsg; ; sptr++) {
879  if (*sptr == '"') {
880  *eptr++ = '\\';
881  }
882  *eptr++ = *sptr;
883  if (*sptr == '\0') {
884  break;
885  }
886  }
887  ast_free(msg);
888 
889  fprintf(stdout, "verbose \"%s\" %d\n", emsg, level);
890  fflush(stdout);
891  ast_free(emsg);
892 }
#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 1957 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().

1958 {
1960 }
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:88

◆ ast_dynamic_logger_level()

int ast_dynamic_logger_level ( const char *  name)

Checks if a dynamic logger level exists.

Parameters
nameThe name of the dynamic level for which to check existence
Return values
-1if no such dynamic level exists
non-zeronegative to be used with ast_log_dynamic_level for sending messages to this level

Definition at line 2514 of file logger.c.

References ARRAY_LEN, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by log_exec().

2515 {
2516  int level = -1;
2517  unsigned int x;
2518 
2520 
2521  for (x = 16; x < ARRAY_LEN(levels); x++) {
2522  if (!levels[x]) {
2523  continue;
2524  }
2525  if (!strcasecmp(levels[x], name)) {
2526  level = x;
2527  break;
2528  }
2529  }
2530 
2532 
2533  return level;
2534 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#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:206
static const char name[]
Definition: cdr_mysql.c:74

◆ ast_init_logger_for_socket_console()

void ast_init_logger_for_socket_console ( void  )

load logger.conf configuration for console socket connections

Definition at line 684 of file logger.c.

References ast_config_destroy(), ast_config_load2(), ast_copy_string(), ast_variable_retrieve(), CONFIG_STATUS_FILEINVALID, and dateformat.

Referenced by ast_remotecontrol().

685 {
686  struct ast_config *cfg;
687  const char *s;
688  struct ast_flags config_flags = { 0 };
689 
690  if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
691  return;
692  }
693 
694  if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) {
696  }
697 
698  ast_config_destroy(cfg);
699 }
#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
void ast_config_destroy(struct ast_config *config)
Destroys a config.
Definition: extconf.c:1290
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:79
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401

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

References logger_initialized.

Referenced by check_init().

1842 {
1843  return logger_initialized;
1844 }
static int logger_initialized
Definition: logger.c:87

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

References ast_log_ap().

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

2102 {
2103  va_list ap;
2104 
2105  va_start(ap, fmt);
2106  ast_log_ap(level, file, line, function, fmt, ap);
2107  va_end(ap);
2108 }
void ast_log_ap(int level, const char *file, int line, const char *function, const char *fmt, va_list ap)
Definition: logger.c:2110

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

2111 {
2112  ast_callid callid;
2113 
2114  callid = ast_read_threadstorage_callid();
2115 
2116  if (level == __LOG_VERBOSE) {
2117  __ast_verbose_ap(file, line, function, 0, callid, fmt, ap);
2118  } else {
2119  ast_log_full(level, -1, file, line, function, callid, fmt, ap);
2120  }
2121 }
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:2193
ast_callid ast_read_threadstorage_callid(void)
extracts the callerid from the thread
Definition: logger.c:1962
#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:2053

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

2159 {
2160 #ifdef HAVE_BKTR
2161  struct ast_bt *bt;
2162  int i = 0;
2163  struct ast_vector_string *strings;
2164 
2165  if (!(bt = ast_bt_create())) {
2166  ast_log(LOG_WARNING, "Unable to allocate space for backtrace structure\n");
2167  return;
2168  }
2169 
2170  if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) {
2171  int count = AST_VECTOR_SIZE(strings);
2172  struct ast_str *buf = ast_str_create(bt->num_frames * 64);
2173 
2174  if (buf) {
2175  ast_str_append(&buf, 0, "Got %d backtrace record%c\n", count - 3, count - 3 != 1 ? 's' : ' ');
2176  for (i = 3; i < AST_VECTOR_SIZE(strings); i++) {
2177  ast_str_append(&buf, 0, "#%2d: %s\n", i - 3, AST_VECTOR_GET(strings, i));
2178  }
2179  ast_log_safe(__LOG_ERROR, NULL, 0, NULL, "%s\n", ast_str_buffer(buf));
2180  ast_free(buf);
2181  }
2182 
2183  ast_bt_free_symbols(strings);
2184  } else {
2185  ast_log(LOG_ERROR, "Could not allocate memory for backtrace\n");
2186  }
2187  ast_bt_destroy(bt);
2188 #else
2189  ast_log(LOG_WARNING, "Must run configure with '--with-execinfo' for stack backtraces.\n");
2190 #endif /* defined(HAVE_BKTR) */
2191 }
#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:2123
#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:2101
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:682
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 2149 of file logger.c.

References ast_log_full().

Referenced by ast_channel_destructor(), and dahdi_cc_callback().

2150 {
2151  va_list ap;
2152  va_start(ap, fmt);
2153  ast_log_full(level, -1, file, line, function, callid, fmt, ap);
2154  va_end(ap);
2155 }
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:2053

◆ 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 2053 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_trace(), __ast_verbose_ap(), ast_log_ap(), ast_log_callid(), and ast_log_safe().

2056 {
2057  struct logmsg *logmsg = NULL;
2058 
2060  return;
2061  }
2062 
2067  logmsg = format_log_message(__LOG_WARNING, 0, "logger", 0, "***", 0,
2068  "Log queue threshold (%d) exceeded. Discarding new messages.\n", logger_queue_limit);
2069  AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
2070  high_water_alert = 1;
2072  }
2074  return;
2075  }
2077 
2078  logmsg = format_log_message_ap(level, sublevel, file, line, function, callid, fmt, ap);
2079  if (!logmsg) {
2080  return;
2081  }
2082 
2083  /* If the logger thread is active, append it to the tail end of the list - otherwise skip that step */
2084  if (logthread != AST_PTHREADT_NULL) {
2086  if (close_logger_thread) {
2087  /* Logger is either closing or closed. We cannot log this message. */
2088  logmsg_free(logmsg);
2089  } else {
2090  AST_LIST_INSERT_TAIL(&logmsgs, logmsg, list);
2093  }
2095  } else {
2096  logger_print_normal(logmsg);
2097  logmsg_free(logmsg);
2098  }
2099 }
static void logger_print_normal(struct logmsg *logmsg)
Print a normal log message to the channels.
Definition: logger.c:1580
int line
Definition: logger.c:169
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:39
static pthread_t logthread
Definition: logger.c:189
static void logmsg_free(struct logmsg *msg)
Definition: logger.c:182
ast_callid callid
Definition: logger.c:171
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
#define __LOG_WARNING
Definition: logger.h:273
#define NULL
Definition: resample.c:96
struct logmsg::@405 list
#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:1746
Definition: logger.c:165
static unsigned int high_water_alert
Definition: logger.c:96
#define AST_PTHREADT_NULL
Definition: lock.h:66
int level
Definition: logger.c:167
#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:1682
#define ast_opt_exec
Definition: options.h:113
#define __LOG_VERBOSE
Definition: logger.h:295
static int logger_queue_size
Definition: logger.c:91
static int close_logger_thread
Definition: logger.c:191
static int logger_queue_limit
Definition: logger.c:94
static int logger_messages_discarded
Definition: logger.c:95
static ast_cond_t logcond
Definition: logger.c:190
int sublevel
Definition: logger.c:168

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

2124 {
2125  va_list ap;
2126  void *recursed = ast_threadstorage_get_ptr(&in_safe_log);
2128 
2129  if (recursed) {
2130  return;
2131  }
2132 
2133  if (ast_threadstorage_set_ptr(&in_safe_log, (void*)1)) {
2134  /* We've failed to set the flag that protects against
2135  * recursion, so bail. */
2136  return;
2137  }
2138 
2139  callid = ast_read_threadstorage_callid();
2140 
2141  va_start(ap, fmt);
2142  ast_log_full(level, -1, file, line, function, callid, fmt, ap);
2143  va_end(ap);
2144 
2145  /* Clear flag so the next allocation failure can be logged. */
2146  ast_threadstorage_set_ptr(&in_safe_log, NULL);
2147 }
int line
Definition: logger.c:169
ast_callid callid
Definition: logger.c:171
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:167
ast_callid ast_read_threadstorage_callid(void)
extracts the callerid from the thread
Definition: logger.c:1962
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:2053

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

1420 {
1421  struct logchannel *chan;
1422 
1423  if (ast_strlen_zero(components)) {
1424  return AST_LOGGER_DECLINE;
1425  }
1426 
1428 
1429  chan = find_logchannel(log_channel);
1430  if (chan) {
1432  return AST_LOGGER_FAILURE;
1433  }
1434 
1435  chan = make_logchannel(log_channel, components, 0, 1);
1436  if (!chan) {
1438  return AST_LOGGER_ALLOC_ERROR;
1439  }
1440 
1442  global_logmask |= chan->logmask;
1443 
1445 
1446  return AST_LOGGER_SUCCESS;
1447 }
static unsigned int global_logmask
Definition: logger.c:85
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
char components[0]
Definition: logger.c:155
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:717
struct logchannel::@404 list
unsigned int logmask
Definition: logger.c:135
static struct logchannel * make_logchannel(const char *channel, const char *components, int lineno, int dynamic)
Definition: logger.c:617
static struct logchannel * find_logchannel(const char *channel)
Find a particular logger channel by name.
Definition: logger.c:601

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

1338 {
1339  struct logchannel *chan;
1340  struct ast_str *configs = ast_str_create(64);
1341  int res = AST_LOGGER_SUCCESS;
1342 
1343  if (!configs) {
1344  return AST_LOGGER_ALLOC_ERROR;
1345  }
1346 
1348  AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
1349  unsigned int level;
1350 
1351  ast_str_reset(configs);
1352 
1353  for (level = 0; level < ARRAY_LEN(levels); level++) {
1354  if ((chan->logmask & (1 << level)) && levels[level]) {
1355  ast_str_append(&configs, 0, "%s ", levels[level]);
1356  }
1357  }
1358 
1359  res = logentry(chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" :
1360  (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"), chan->disabled ?
1361  "Disabled" : "Enabled", ast_str_buffer(configs), data);
1362 
1363  if (res) {
1365  ast_free(configs);
1366  configs = NULL;
1367  return AST_LOGGER_FAILURE;
1368  }
1369  }
1371 
1372  ast_free(configs);
1373  configs = NULL;
1374 
1375  return AST_LOGGER_SUCCESS;
1376 }
#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:206
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:135
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:137
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:143
#define ast_free(a)
Definition: astmm.h:182
char filename[PATH_MAX]
Definition: logger.c:147
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 2577 of file logger.c.

References dateformat.

Referenced by set_header().

2578 {
2579  return dateformat;
2580 }
static char dateformat[256]
Definition: logger.c:79

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

References logger_queue_limit.

Referenced by handle_cli_queue_test().

2588 {
2589  return logger_queue_limit;
2590 }
static int logger_queue_limit
Definition: logger.c:94

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

References AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, available(), and logger_register_level().

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

2504 {
2505  unsigned int available = 0;
2506 
2508  available = logger_register_level(name);
2510 
2511  return available;
2512 }
#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 int logger_register_level(const char *name)
Definition: logger.c:2464
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

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

1486 {
1487  struct logchannel *chan;
1488 
1490 
1491  chan = find_logchannel(log_channel);
1492  if (chan && chan->dynamic) {
1494  } else {
1496  return AST_LOGGER_FAILURE;
1497  }
1499 
1500  if (chan->fileptr) {
1501  fclose(chan->fileptr);
1502  chan->fileptr = NULL;
1503  }
1504  ast_free(chan);
1505  chan = NULL;
1506 
1507  return AST_LOGGER_SUCCESS;
1508 }
#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
struct logchannel::@404 list
int dynamic
Definition: logger.c:153
static struct logchannel * find_logchannel(const char *channel)
Find a particular logger channel by name.
Definition: logger.c:601
#define ast_free(a)
Definition: astmm.h:182
FILE * fileptr
Definition: logger.c:145
#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 1254 of file logger.c.

References NULL, and reload_logger().

Referenced by action_loggerrotate().

1255 {
1256  return reload_logger(1, NULL);
1257 }
#define NULL
Definition: resample.c:96
static int reload_logger(int rotate, const char *altconf)
Definition: logger.c:1141

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

1260 {
1261  struct logchannel *f;
1262  int success = AST_LOGGER_FAILURE;
1263  char filename[PATH_MAX];
1264 
1265  make_filename(log_channel, filename, sizeof(filename));
1266 
1268 
1270 
1272  if (f->disabled) {
1273  f->disabled = 0; /* Re-enable logging at reload */
1274  manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n",
1275  f->filename);
1276  }
1277  if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
1278  fclose(f->fileptr); /* Close file */
1279  f->fileptr = NULL;
1280  if (strcmp(filename, f->filename) == 0) {
1281  rotate_file(f->filename);
1282  success = AST_LOGGER_SUCCESS;
1283  }
1284  }
1285  }
1286 
1288 
1290 
1291  return success;
1292 }
static int init_logger_chain(const char *altconf)
Read config, setup channels.
Definition: logger.c:710
static int rotate_file(const char *filename)
Definition: logger.c:974
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:560
#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
struct logchannel::@404 list
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:137
const char * ast_config_AST_LOG_DIR
Definition: options.c:159
FILE * fileptr
Definition: logger.c:145
char filename[PATH_MAX]
Definition: logger.c:147
#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:2231

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

References logger_queue_limit.

Referenced by handle_cli_queue_test().

2583 {
2584  logger_queue_limit = queue_limit;
2585 }
static int logger_queue_limit
Definition: logger.c:94

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

2537 {
2538  unsigned int found = 0;
2539  unsigned int x;
2540 
2542 
2543  for (x = 16; x < ARRAY_LEN(levels); x++) {
2544  if (!levels[x]) {
2545  continue;
2546  }
2547 
2548  if (strcasecmp(levels[x], name)) {
2549  continue;
2550  }
2551 
2552  found = 1;
2553  break;
2554  }
2555 
2556  if (found) {
2557  /* take this level out of the global_logmask, to ensure that no new log messages
2558  * will be queued for it
2559  */
2560 
2561  global_logmask &= ~(1 << x);
2562 
2563  ast_free(levels[x]);
2564  levels[x] = NULL;
2566 
2567  ast_debug(1, "Unregistered dynamic logger level '%s' with index %u.\n", name, x);
2568 
2572  } else {
2574  }
2575 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static unsigned int global_logmask
Definition: logger.c:85
#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:206
#define NULL
Definition: resample.c:96
static void update_logchannels(void)
Definition: logger.c:2360
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
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 2615 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 894 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().

895 {
896  va_list ap;
897  struct timeval tv;
898  struct ast_tm tm;
899  char qlog_msg[8192];
900  int qlog_len;
901  char time_str[30];
902 
903  if (!logger_initialized) {
904  /* You are too early. We are not open yet! */
905  return;
906  }
907  if (!queuelog_init) {
908  /* We must initialize now since someone is trying to log something. */
910  }
911 
912  if (ast_check_realtime("queue_log")) {
913  tv = ast_tvnow();
914  ast_localtime(&tv, &tm, logfiles.queue_log_realtime_use_gmt ? "GMT" : NULL);
915  ast_strftime(time_str, sizeof(time_str), "%F %T.%6q", &tm);
916  va_start(ap, fmt);
917  vsnprintf(qlog_msg, sizeof(qlog_msg), fmt, ap);
918  va_end(ap);
919  if (logfiles.queue_adaptive_realtime) {
921  AST_APP_ARG(data)[5];
922  );
923  AST_NONSTANDARD_APP_ARGS(args, qlog_msg, '|');
924  /* Ensure fields are large enough to receive data */
925  ast_realtime_require_field("queue_log",
926  "data1", RQ_CHAR, strlen(S_OR(args.data[0], "")),
927  "data2", RQ_CHAR, strlen(S_OR(args.data[1], "")),
928  "data3", RQ_CHAR, strlen(S_OR(args.data[2], "")),
929  "data4", RQ_CHAR, strlen(S_OR(args.data[3], "")),
930  "data5", RQ_CHAR, strlen(S_OR(args.data[4], "")),
931  SENTINEL);
932 
933  /* Store the log */
934  ast_store_realtime("queue_log", "time", time_str,
935  "callid", callid,
936  "queuename", queuename,
937  "agent", agent,
938  "event", event,
939  "data1", S_OR(args.data[0], ""),
940  "data2", S_OR(args.data[1], ""),
941  "data3", S_OR(args.data[2], ""),
942  "data4", S_OR(args.data[3], ""),
943  "data5", S_OR(args.data[4], ""),
944  SENTINEL);
945  } else {
946  ast_store_realtime("queue_log", "time", time_str,
947  "callid", callid,
948  "queuename", queuename,
949  "agent", agent,
950  "event", event,
951  "data", qlog_msg,
952  SENTINEL);
953  }
954 
955  if (!logfiles.queue_log_to_file) {
956  return;
957  }
958  }
959 
960  if (qlog) {
961  va_start(ap, fmt);
962  qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event);
963  vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap);
964  va_end(ap);
966  if (qlog) {
967  fprintf(qlog, "%s\n", qlog_msg);
968  fflush(qlog);
969  }
971  }
972 }
static int queuelog_init
Definition: logger.c:86
#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:1854
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:193
static int logger_initialized
Definition: logger.c:87
#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
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application&#39;s arguments.
static struct @403 logfiles
#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 1962 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().

1963 {
1964  ast_callid *callid;
1965 
1966  callid = ast_threadstorage_get(&unique_callid, sizeof(*callid));
1967 
1968  return callid ? *callid : 0;
1969 }
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:91

◆ AST_THREADSTORAGE_RAW() [1/2]

AST_THREADSTORAGE_RAW ( in_safe_log  )

Referenced by update_logchannels().

◆ AST_THREADSTORAGE_RAW() [2/2]

AST_THREADSTORAGE_RAW ( trace_indent  )

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

2324 {
2325  struct verb_console *console;
2326  int verb_level;
2327 
2328  console = ast_threadstorage_get(&my_verb_console, sizeof(*console));
2330  if (!console) {
2331  verb_level = 0;
2332  } else if (console->level) {
2333  verb_level = *console->level;
2334  } else {
2335  verb_level = option_verbose;
2336  }
2338  return verb_level;
2339 }
static struct ast_threadstorage my_verb_console
Definition: logger.c:2294
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:2223

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

2297 {
2298  struct verb_console *console;
2299 
2300  console = ast_threadstorage_get(&my_verb_console, sizeof(*console));
2301  if (!console || !level) {
2302  return;
2303  }
2304  console->level = level;
2305 
2309  ast_verb_update();
2310 }
Definition: test_heap.c:38
static struct ast_threadstorage my_verb_console
Definition: logger.c:2294
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:2232
#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:2223

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

2342 {
2343  struct verb_console *console;
2344 
2345  console = ast_threadstorage_get(&my_verb_console, sizeof(*console));
2346  if (!console) {
2347  return;
2348  }
2349 
2351  if (console->level) {
2352  *console->level = verb_level;
2353  } else {
2354  option_verbose = verb_level;
2355  }
2357  ast_verb_update();
2358 }
static struct ast_threadstorage my_verb_console
Definition: logger.c:2294
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:2232
#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:2223

◆ ast_verb_console_unregister()

void ast_verb_console_unregister ( void  )

Unregister this thread's console verbosity level.

Returns
Nothing

Definition at line 2312 of file logger.c.

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

Referenced by netconsole().

2313 {
2314  struct verb_console *console;
2315 
2316  console = ast_threadstorage_get(&my_verb_console, sizeof(*console));
2317  if (!console) {
2318  return;
2319  }
2320  verb_console_unregister(console);
2321 }
static struct ast_threadstorage my_verb_console
Definition: logger.c:2294
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:2275

◆ ast_verb_update()

void ast_verb_update ( void  )

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

Returns
Nothing

Definition at line 2232 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().

2233 {
2234  struct logchannel *log;
2235  struct verb_console *console;
2236  int verb_level;
2237 
2239 
2241 
2242  /* Default to the root console verbosity. */
2243  verb_level = option_verbose;
2244 
2245  /* Determine max remote console level. */
2246  AST_LIST_TRAVERSE(&verb_consoles, console, node) {
2247  if (verb_level < *console->level) {
2248  verb_level = *console->level;
2249  }
2250  }
2252 
2253  /* Determine max logger channel level. */
2255  AST_RWLIST_TRAVERSE(&logchannels, log, list) {
2256  if (verb_level < log->verbosity) {
2257  verb_level = log->verbosity;
2258  }
2259  }
2261 
2262  ast_verb_sys_level = verb_level;
2263 
2265 }
Definition: test_heap.c:38
static ast_mutex_t verb_update_lock
Definition: logger.c:2230
#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:141
#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:2223
#define ast_mutex_unlock(a)
Definition: lock.h:188

◆ close_logger()

void close_logger ( void  )

Provided by logger.c

Definition at line 1912 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_logger_category_unload(), AST_PTHREADT_NULL, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, logchannel::fileptr, logchannel::list, logger_initialized, and NULL.

Referenced by really_quit().

1913 {
1914  struct logchannel *f = NULL;
1915 
1917 
1919 
1920  logger_initialized = 0;
1921 
1922  /* Stop logger thread */
1924  close_logger_thread = 1;
1927 
1928  if (logthread != AST_PTHREADT_NULL) {
1929  pthread_join(logthread, NULL);
1930  }
1931 
1933 
1934  if (qlog) {
1935  fclose(qlog);
1936  qlog = NULL;
1937  }
1938 
1939  while ((f = AST_LIST_REMOVE_HEAD(&logchannels, list))) {
1940  if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
1941  fclose(f->fileptr);
1942  f->fileptr = NULL;
1943  }
1944  ast_free(f);
1945  }
1946 
1947  closelog(); /* syslog */
1948 
1950 }
static struct ast_cli_entry cli_logger[]
Definition: logger.c:1559
#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:189
#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
int ast_logger_category_unload(void)
Unload system wide logger category functionality.
#define NULL
Definition: resample.c:96
#define ast_cond_signal(cond)
Definition: lock.h:201
static FILE * qlog
Definition: logger.c:193
static int logger_initialized
Definition: logger.c:87
struct logchannel::@404 list
#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:145
static int close_logger_thread
Definition: logger.c:191
static ast_cond_t logcond
Definition: logger.c:190

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

602 {
603  char filename[PATH_MAX];
604  struct logchannel *chan;
605 
606  make_filename(channel, filename, sizeof(filename));
607 
609  if (!strcmp(chan->filename, filename)) {
610  return chan;
611  }
612  }
613 
614  return NULL;
615 }
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:560
Definition: muted.c:95
#define NULL
Definition: resample.c:96
struct logchannel::@404 list
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
char filename[PATH_MAX]
Definition: logger.c:147
#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 365 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.

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

◆ format_log_json()

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

Definition at line 259 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().

260 {
261  struct ast_json *json;
262  char *str;
263  char call_identifier_str[13];
264  size_t json_str_len;
265 
266  if (msg->callid) {
267  snprintf(call_identifier_str, sizeof(call_identifier_str), "[C-%08x]", msg->callid);
268  } else {
269  call_identifier_str[0] = '\0';
270  }
271 
272  json = ast_json_pack("{s: s, s: s, "
273  "s: {s: i, s: s} "
274  "s: {s: {s: s, s: s, s: i}, "
275  "s: s, s: s} }",
276  "hostname", ast_config_AST_SYSTEM_NAME,
277  "timestamp", msg->date,
278  "identifiers",
279  "lwp", msg->lwp,
280  "callid", S_OR(call_identifier_str, ""),
281  "logmsg",
282  "location",
283  "filename", msg->file,
284  "function", msg->function,
285  "line", msg->line,
286  "level", msg->level_name,
287  "message", msg->message);
288  if (!json) {
289  return -1;
290  }
291 
292  str = ast_json_dump_string(json);
293  if (!str) {
294  ast_json_unref(json);
295  return -1;
296  }
297 
298  ast_copy_string(buf, str, size);
299  json_str_len = strlen(str);
300  if (json_str_len > size - 1) {
301  json_str_len = size - 1;
302  }
303  buf[json_str_len] = '\n';
304  buf[json_str_len + 1] = '\0';
305 
306  term_strip(buf, buf, size);
307 
308  ast_json_free(str);
309  ast_json_unref(json);
310 
311  return 0;
312 }
int line
Definition: logger.c:169
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:171
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:170
const ast_string_field function
Definition: logger.c:178
const ast_string_field date
Definition: logger.c:178
int lwp
Definition: logger.c:170
const ast_string_field level_name
Definition: logger.c:178
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:178
Abstract JSON element (object, array, string, int, ...).
const ast_string_field file
Definition: logger.c:178

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

References format_log_message_ap().

Referenced by ast_log_full(), and logger_thread().

1749 {
1750  struct logmsg *logmsg;
1751  va_list ap;
1752 
1753  va_start(ap, fmt);
1754  logmsg = format_log_message_ap(level, sublevel, file, line, function, callid, fmt, ap);
1755  va_end(ap);
1756 
1757  return logmsg;
1758 }
int line
Definition: logger.c:169
ast_callid callid
Definition: logger.c:171
Definition: logger.c:165
int level
Definition: logger.c:167
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:1682
int sublevel
Definition: logger.c:168

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

References __LOG_VERBOSE, ast_calloc_with_stringfields, AST_DYNSTR_BUILD_FAILED, ast_ends_with(), ast_get_tid(), ast_localtime(), ast_str_append(), 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().

1685 {
1686  struct logmsg *logmsg = NULL;
1687  struct ast_str *buf = NULL;
1688  struct ast_tm tm;
1689  struct timeval now = ast_tvnow();
1690  int res = 0;
1691  char datestring[256];
1692 
1693  if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) {
1694  return NULL;
1695  }
1696 
1697  /* Build string */
1698  res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
1699 
1700  /* If the build failed, then abort and free this structure */
1701  if (res == AST_DYNSTR_BUILD_FAILED) {
1702  return NULL;
1703  }
1704 
1705  /* Automatically add a newline to format strings that don't have one */
1706  if (!ast_ends_with(ast_str_buffer(buf), "\n")) {
1707  ast_str_append(&buf, 0, "\n");
1708  }
1709 
1710  /* Create a new logging message */
1711  if (!(logmsg = ast_calloc_with_stringfields(1, struct logmsg, res + 128))) {
1712  return NULL;
1713  }
1714 
1715  /* Copy string over */
1717 
1718  /* Set type */
1719  if (level == __LOG_VERBOSE) {
1720  logmsg->type = LOGMSG_VERBOSE;
1721  } else {
1722  logmsg->type = LOGMSG_NORMAL;
1723  }
1724 
1725  if (display_callids && callid) {
1726  logmsg->callid = callid;
1727  }
1728 
1729  /* Create our date/time */
1730  ast_localtime(&now, &tm, NULL);
1731  ast_strftime(datestring, sizeof(datestring), dateformat, &tm);
1732  ast_string_field_set(logmsg, date, datestring);
1733 
1734  /* Copy over data */
1735  logmsg->level = level;
1736  logmsg->sublevel = sublevel;
1737  logmsg->line = line;
1738  ast_string_field_set(logmsg, level_name, levels[level]);
1739  ast_string_field_set(logmsg, file, file);
1740  ast_string_field_set(logmsg, function, function);
1741  logmsg->lwp = ast_get_tid();
1742 
1743  return logmsg;
1744 }
int line
Definition: logger.c:169
static int force_inline attribute_pure ast_ends_with(const char *str, const char *suffix)
Definition: strings.h:112
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
ast_callid callid
Definition: logger.c:171
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:257
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:206
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
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:256
Definition: logger.c:165
int ast_get_tid(void)
Get current thread ID.
Definition: main/utils.c:2504
int level
Definition: logger.c:167
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:170
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:166
static char dateformat[256]
Definition: logger.c:79
static int display_callids
Definition: logger.c:89
#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:168
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:514

◆ format_log_plain()

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

Definition at line 429 of file logger.c.

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

430 {
431  char call_identifier_str[13];
432  char linestr[32];
433  int has_file = !ast_strlen_zero(msg->file);
434  int has_line = (msg->line > 0);
435  int has_func = !ast_strlen_zero(msg->function);
436 
437  if (msg->callid) {
438  snprintf(call_identifier_str, sizeof(call_identifier_str), "[C-%08x]", msg->callid);
439  } else {
440  call_identifier_str[0] = '\0';
441  }
442 
443  switch (chan->type) {
444  case LOGTYPE_SYSLOG:
445  snprintf(buf, size, "%s[%d]%s: %s:%d in %s: %s",
446  levels[msg->level], msg->lwp, call_identifier_str, msg->file,
447  msg->line, msg->function, msg->message);
448  term_strip(buf, buf, size);
449  break;
450  case LOGTYPE_FILE:
451  case LOGTYPE_CONSOLE:
452  /* Turn the numerical line number into a string */
453  snprintf(linestr, sizeof(linestr), "%d", msg->line);
454  /* Build string to print out */
455  snprintf(buf, size, "[%s] %s[%d]%s: %s%s%s%s%s%s%s",
456  msg->date,
457  msg->level_name,
458  msg->lwp,
459  call_identifier_str,
460  has_file ? msg->file : "",
461  has_file ? ":" : "",
462  has_line ? linestr : "",
463  has_line ? " " : "",
464  has_func ? msg->function : "",
465  has_func ? ": " : "",
466  msg->message);
467  term_strip(buf, buf, size);
468  break;
469  }
470 
471  return 0;
472 }
int line
Definition: logger.c:169
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
ast_callid callid
Definition: logger.c:171
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:206
#define ast_strlen_zero(foo)
Definition: strings.h:52
const ast_string_field function
Definition: logger.c:178
int level
Definition: logger.c:167
const ast_string_field date
Definition: logger.c:178
enum logtypes type
Definition: logger.c:143
int lwp
Definition: logger.c:170
const ast_string_field level_name
Definition: logger.c:178
const ast_string_field message
Definition: logger.c:178
const ast_string_field file
Definition: logger.c:178

◆ 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 1449 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.

1450 {
1451  switch (cmd) {
1452  case CLI_INIT:
1453  e->command = "logger add channel";
1454  e->usage =
1455  "Usage: logger add channel <name> <levels>\n"
1456  " Adds a temporary logger channel. This logger channel\n"
1457  " will exist until removed or until Asterisk is restarted.\n"
1458  " <levels> is a comma-separated list of desired logger\n"
1459  " levels such as: verbose,warning,error\n"
1460  " An optional formatter may be specified with the levels;\n"
1461  " valid values are '[json]' and '[default]'.\n";
1462  return NULL;
1463  case CLI_GENERATE:
1464  return NULL;
1465  }
1466 
1467  if (a->argc < 5) {
1468  return CLI_SHOWUSAGE;
1469  }
1470 
1471  switch (ast_logger_create_channel(a->argv[3], a->argv[4])) {
1472  case AST_LOGGER_SUCCESS:
1473  return CLI_SUCCESS;
1474  case AST_LOGGER_FAILURE:
1475  ast_cli(a->fd, "Logger channel '%s' already exists\n", a->argv[3]);
1476  return CLI_SUCCESS;
1477  case AST_LOGGER_DECLINE:
1479  default:
1480  ast_cli(a->fd, "ERROR: Unable to create log channel '%s'\n", a->argv[3]);
1481  return CLI_FAILURE;
1482  }
1483 }
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:1419
#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 1216 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.

1217 {
1218  switch (cmd) {
1219  case CLI_INIT:
1220  e->command = "logger reload";
1221  e->usage =
1222  "Usage: logger reload [<alt-conf>]\n"
1223  " Reloads the logger subsystem state. Use after restarting syslogd(8) if you are using syslog logging.\n";
1224  return NULL;
1225  case CLI_GENERATE:
1226  return NULL;
1227  }
1228  if (reload_logger(0, a->argc == 3 ? a->argv[2] : NULL)) {
1229  ast_cli(a->fd, "Failed to reload the logger\n");
1230  return CLI_FAILURE;
1231  }
1232  return CLI_SUCCESS;
1233 }
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:1141
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 1510 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.

1511 {
1512  struct logchannel *chan;
1513  int gen_count = 0;
1514  char *gen_ret = NULL;
1515 
1516  switch (cmd) {
1517  case CLI_INIT:
1518  e->command = "logger remove channel";
1519  e->usage =
1520  "Usage: logger remove channel <name>\n"
1521  " Removes a temporary logger channel.\n";
1522  return NULL;
1523  case CLI_GENERATE:
1524  if (a->argc > 4 || (a->argc == 4 && a->pos > 3)) {
1525  return NULL;
1526  }
1529  if (chan->dynamic && (ast_strlen_zero(a->argv[3])
1530  || !strncmp(a->argv[3], chan->filename, strlen(a->argv[3])))) {
1531  if (gen_count == a->n) {
1532  gen_ret = ast_strdup(chan->filename);
1533  break;
1534  }
1535  gen_count++;
1536  }
1537  }
1539  return gen_ret;
1540  }
1541 
1542  if (a->argc < 4) {
1543  return CLI_SHOWUSAGE;
1544  }
1545 
1546  switch (ast_logger_remove_channel(a->argv[3])) {
1547  case AST_LOGGER_SUCCESS:
1548  ast_cli(a->fd, "Removed dynamic logger channel '%s'\n", a->argv[3]);
1549  return CLI_SUCCESS;
1550  case AST_LOGGER_FAILURE:
1551  ast_cli(a->fd, "Unable to find dynamic logger channel '%s'\n", a->argv[3]);
1552  return CLI_SUCCESS;
1553  default:
1554  ast_cli(a->fd, "Internal failure attempting to delete dynamic logger channel '%s'\n", a->argv[3]);
1555  return CLI_FAILURE;
1556  }
1557 }
int ast_logger_remove_channel(const char *log_channel)
Delete the specified log channel.
Definition: logger.c:1485
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_strlen_zero(foo)
Definition: strings.h:52
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
struct logchannel::@404 list
const int fd
Definition: cli.h:159
int dynamic
Definition: logger.c:153
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 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:147
#define CLI_SUCCESS
Definition: cli.h:44
const int pos
Definition: cli.h:164

◆ handle_logger_rotate()

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

Definition at line 1235 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.

1236 {
1237  switch (cmd) {
1238  case CLI_INIT:
1239  e->command = "logger rotate";
1240  e->usage =
1241  "Usage: logger rotate\n"
1242  " Rotates and Reopens the log files.\n";
1243  return NULL;
1244  case CLI_GENERATE:
1245  return NULL;
1246  }
1247  if (reload_logger(1, NULL)) {
1248  ast_cli(a->fd, "Failed to reload the logger and rotate log files\n");
1249  return CLI_FAILURE;
1250  }
1251  return CLI_SUCCESS;
1252 }
Definition: cli.h:152
#define NULL
Definition: resample.c:96
static int reload_logger(int rotate, const char *altconf)
Definition: logger.c:1141
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 1294 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.

1295 {
1296  int x;
1297  int state;
1298  int level = -1;
1299 
1300  switch (cmd) {
1301  case CLI_INIT:
1302  e->command = "logger set level {DEBUG|TRACE|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}";
1303  e->usage =
1304  "Usage: logger set level {DEBUG|TRACE|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off}\n"
1305  " Set a specific log level to enabled/disabled for this console.\n";
1306  return NULL;
1307  case CLI_GENERATE:
1308  return NULL;
1309  }
1310 
1311  if (a->argc < 5)
1312  return CLI_SHOWUSAGE;
1313 
1315 
1316  for (x = 0; x < ARRAY_LEN(levels); x++) {
1317  if (levels[x] && !strcasecmp(a->argv[3], levels[x])) {
1318  level = x;
1319  break;
1320  }
1321  }
1322 
1324 
1325  state = ast_true(a->argv[4]) ? 1 : 0;
1326 
1327  if (level != -1) {
1328  ast_console_toggle_loglevel(a->fd, level, state);
1329  ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off");
1330  } else
1331  return CLI_SHOWUSAGE;
1332 
1333  return CLI_SUCCESS;
1334 }
enum sip_cc_notify_state state
Definition: chan_sip.c:959
#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:206
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:1951
#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 1379 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.

1380 {
1381 #define FORMATL "%-35.35s %-8.8s %-10.10s %-9.9s "
1382  struct logchannel *chan;
1383  switch (cmd) {
1384  case CLI_INIT:
1385  e->command = "logger show channels";
1386  e->usage =
1387  "Usage: logger show channels\n"
1388  " List configured logger channels.\n";
1389  return NULL;
1390  case CLI_GENERATE:
1391  return NULL;
1392  }
1393  ast_cli(a->fd, "Logger queue limit: %d\n\n", logger_queue_limit);
1394  ast_cli(a->fd, FORMATL, "Channel", "Type", "Formatter", "Status");
1395  ast_cli(a->fd, "Configuration\n");
1396  ast_cli(a->fd, FORMATL, "-------", "----", "---------", "------");
1397  ast_cli(a->fd, "-------------\n");
1400  unsigned int level;
1401 
1402  ast_cli(a->fd, FORMATL, chan->filename, chan->type == LOGTYPE_CONSOLE ? "Console" : (chan->type == LOGTYPE_SYSLOG ? "Syslog" : "File"),
1403  chan->formatter.name,
1404  chan->disabled ? "Disabled" : "Enabled");
1405  ast_cli(a->fd, " - ");
1406  for (level = 0; level < ARRAY_LEN(levels); level++) {
1407  if ((chan->logmask & (1 << level)) && levels[level]) {
1408  ast_cli(a->fd, "%s ", levels[level]);
1409  }
1410  }
1411  ast_cli(a->fd, "\n");
1412  }
1414  ast_cli(a->fd, "\n");
1415 
1416  return CLI_SUCCESS;
1417 }
#define FORMATL
struct logformatter formatter
Definition: logger.c:133
#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:206
#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
struct logchannel::@404 list
const int fd
Definition: cli.h:159
unsigned int logmask
Definition: logger.c:135
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:137
enum logtypes type
Definition: logger.c:143
char * command
Definition: cli.h:186
const char * name
Definition: logger.c:120
const char * usage
Definition: cli.h:177
char filename[PATH_MAX]
Definition: logger.c:147
#define CLI_SUCCESS
Definition: cli.h:44
static int logger_queue_limit
Definition: logger.c:94

◆ init_logger()

int init_logger ( void  )

Provided by logger.c

Definition at line 1870 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_logger_category_load(), 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().

1871 {
1872  int res;
1873  /* auto rotate if sig SIGXFSZ comes a-knockin */
1874  sigaction(SIGXFSZ, &handle_SIGXFSZ, NULL);
1875 
1876  /* Re-initialize the logmsgs mutex. The recursive mutex can be accessed prior
1877  * to Asterisk being forked into the background, which can cause the thread
1878  * ID tracked by the underlying pthread mutex to be different than the ID of
1879  * the thread that unlocks the mutex. Since init_logger is called after the
1880  * fork, it is safe to initialize the mutex here for future accesses.
1881  */
1885 
1886  /* start logger thread */
1889  return -1;
1890  }
1891 
1892  /* register the logger cli commands */
1894 
1896 
1897  /* create log channels */
1899  res = init_logger_chain(NULL);
1901  ast_verb_update();
1902  logger_initialized = 1;
1903  if (res) {
1904  ast_log(LOG_ERROR, "Errors detected in logger.conf. Default console logging is being used.\n");
1905  }
1906 
1908 
1909  return 0;
1910 }
static struct ast_cli_entry cli_logger[]
Definition: logger.c:1559
static int init_logger_chain(const char *altconf)
Read config, setup channels.
Definition: logger.c:710
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static struct sigaction handle_SIGXFSZ
Definition: logger.c:1574
static pthread_t logthread
Definition: logger.c:189
void ast_verb_update(void)
Re-evaluate the system max verbosity level (ast_verb_sys_level).
Definition: logger.c:2232
#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:87
#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:159
static void * logger_thread(void *data)
Actual logging thread.
Definition: logger.c:1761
#define ast_pthread_create(a, b, c, d)
Definition: utils.h:559
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:2101
#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:188
static ast_cond_t logcond
Definition: logger.c:190
int ast_mkdir(const char *path, int mode)
Recursively create directory path.
Definition: main/utils.c:2231
int ast_logger_category_load(void)
Load/Initialize system wide logger category functionality.

◆ 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 710 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_strdup, ast_strdupa, 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, logger_register_level(), logchannel::logmask, make_logchannel(), ast_variable::name, ast_variable::next, NONE, NULL, queue_log_name, QUEUELOG, ROTATE, S_OR, SEQUENTIAL, strsep(), TIMESTAMP, ast_variable::value, and var.

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

711 {
712  struct logchannel *chan;
713  struct ast_config *cfg;
714  struct ast_variable *var;
715  const char *s;
716  struct ast_flags config_flags = { 0 };
717 
718  if (!(cfg = ast_config_load2(S_OR(altconf, "logger.conf"), "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
719  cfg = NULL;
720  }
721 
722  /* Set defaults */
723  hostname[0] = '\0';
724  display_callids = 1;
725  memset(&logfiles, 0, sizeof(logfiles));
726  logfiles.queue_log = 1;
727  ast_copy_string(dateformat, "%b %e %T", sizeof(dateformat));
729  exec_after_rotate[0] = '\0';
731 
732  /* delete our list of log channels */
733  while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) {
734  ast_free(chan);
735  }
736  global_logmask = 0;
737 
738  errno = 0;
739  /* close syslog */
740  closelog();
741 
742  /* If no config file, we're fine, set default options. */
743  if (!cfg) {
744  chan = make_logchannel("console", "error,warning,notice,verbose", 0, 0);
745  if (!chan) {
746  fprintf(stderr, "ERROR: Failed to initialize default logging\n");
747  return -1;
748  }
749 
750  AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
751  global_logmask |= chan->logmask;
752 
753  return -1;
754  }
755 
756  if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) {
757  if (ast_true(s)) {
758  if (gethostname(hostname, sizeof(hostname) - 1)) {
759  ast_copy_string(hostname, "unknown", sizeof(hostname));
760  fprintf(stderr, "What box has no hostname???\n");
761  }
762  }
763  }
764  if ((s = ast_variable_retrieve(cfg, "general", "display_callids"))) {
766  }
767  if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) {
769  }
770  if ((s = ast_variable_retrieve(cfg, "general", "queue_log"))) {
771  logfiles.queue_log = ast_true(s);
772  }
773  if ((s = ast_variable_retrieve(cfg, "general", "queue_log_to_file"))) {
774  logfiles.queue_log_to_file = ast_true(s);
775  }
776  if ((s = ast_variable_retrieve(cfg, "general", "queue_log_name"))) {
778  }
779  if ((s = ast_variable_retrieve(cfg, "general", "queue_log_realtime_use_gmt"))) {
780  logfiles.queue_log_realtime_use_gmt = ast_true(s);
781  }
782  if ((s = ast_variable_retrieve(cfg, "general", "exec_after_rotate"))) {
784  }
785  if ((s = ast_variable_retrieve(cfg, "general", "rotatestrategy"))) {
786  if (strcasecmp(s, "timestamp") == 0) {
788  } else if (strcasecmp(s, "rotate") == 0) {
790  } else if (strcasecmp(s, "sequential") == 0) {
792  } else if (strcasecmp(s, "none") == 0) {
794  } else {
795  fprintf(stderr, "Unknown rotatestrategy: %s\n", s);
796  }
797  } else {
798  if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) {
800  fprintf(stderr, "rotatetimestamp option has been deprecated. Please use rotatestrategy instead.\n");
801  }
802  }
803  if ((s = ast_variable_retrieve(cfg, "general", "logger_queue_limit"))) {
804  if (sscanf(s, "%30d", &logger_queue_limit) != 1) {
805  fprintf(stderr, "logger_queue_limit has an invalid value. Leaving at default of %d.\n",
807  }
808  if (logger_queue_limit < 10) {
809  fprintf(stderr, "logger_queue_limit must be >= 10. Setting to 10.\n");
810  logger_queue_limit = 10;
811  }
812  }
813 
814  /* Custom dynamic logging levels defined by user */
815  if ((s = ast_variable_retrieve(cfg, "general", "custom_logs"))) {
816  char *customlogs = ast_strdupa(s);
817  char *logfile;
818  while ((logfile = strsep(&customlogs, ","))) {
819  char *customlog = ast_strdup(logfile);
820  /* Lock already held, so directly register the level */
821  logger_register_level(customlog);
822  }
823  }
824 
825  var = ast_variable_browse(cfg, "logfiles");
826  for (; var; var = var->next) {
827  chan = make_logchannel(var->name, var->value, var->lineno, 0);
828  if (!chan) {
829  /* Print error message directly to the consoles since the lock is held
830  * and we don't want to unlock with the list partially built */
831  ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR);
834  continue;
835  }
836  AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);
837  global_logmask |= chan->logmask;
838  }
839 
840  if (qlog) {
841  fclose(qlog);
842  qlog = NULL;
843  }
844 
845  ast_config_destroy(cfg);
846 
847  return 0;
848 }
struct ast_variable * next
static unsigned int global_logmask
Definition: logger.c:85
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 ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
static FILE * qlog
Definition: logger.c:193
Definition: logger.c:101
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:717
unsigned int logmask
Definition: logger.c:135
void ast_config_destroy(struct ast_config *config)
Destroys a config.
Definition: extconf.c:1290
static int logger_register_level(const char *name)
Definition: logger.c:2464
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
static char queue_log_name[256]
Definition: logger.c:81
static char exec_after_rotate[256]
Definition: logger.c:82
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:1951
int errno
static struct logchannel * make_logchannel(const char *channel, const char *components, int lineno, int dynamic)
Definition: logger.c:617
#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:79
rotatestrategy
Definition: logger.c:98
char * strsep(char **str, const char *delims)
static int display_callids
Definition: logger.c:89
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
Definition: logger.c:99
static int logger_queue_limit
Definition: logger.c:94
static struct @403 logfiles
#define QUEUELOG
Definition: logger.h:35
static char hostname[MAXHOSTNAMELEN]
Definition: logger.c:112

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

320 {
321  const char *p;
322  const char *fmt;
323  struct ast_str *prefixed;
324  signed char magic = logmsg->sublevel > 9 ? -10 : -logmsg->sublevel - 1; /* 0 => -1, 1 => -2, etc. Can't pass NUL, as it is EOS-delimiter */
325 
326  /* For compatibility with modules still calling ast_verbose() directly instead of using ast_verb() */
327  if (logmsg->sublevel < 0) {
328  if (!strncmp(logmsg->message, VERBOSE_PREFIX_4, strlen(VERBOSE_PREFIX_4))) {
329  magic = -5;
330  } else if (!strncmp(logmsg->message, VERBOSE_PREFIX_3, strlen(VERBOSE_PREFIX_3))) {
331  magic = -4;
332  } else if (!strncmp(logmsg->message, VERBOSE_PREFIX_2, strlen(VERBOSE_PREFIX_2))) {
333  magic = -3;
334  } else if (!strncmp(logmsg->message, VERBOSE_PREFIX_1, strlen(VERBOSE_PREFIX_1))) {
335  magic = -2;
336  } else {
337  magic = -1;
338  }
339  }
340 
342  return -1;
343  }
344 
345  ast_str_reset(prefixed);
346 
347  /* for every newline found in the buffer add verbose prefix data */
348  fmt = logmsg->message;
349  do {
350  if (!(p = strchr(fmt, '\n'))) {
351  p = strchr(fmt, '\0') - 1;
352  }
353  ++p;
354 
355  ast_str_append(&prefixed, 0, "%c", (char)magic);
356  ast_str_append_substr(&prefixed, 0, fmt, p - fmt);
357  fmt = p;
358  } while (p && *p);
359 
360  snprintf(buf, size, "%s", ast_str_buffer(prefixed));
361 
362  return 0;
363 }
#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:254
#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:178
static struct ast_threadstorage verbose_buf
Definition: logger.c:252
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:168

◆ logger_print_normal()

static void logger_print_normal ( struct logmsg logmsg)
static

Print a normal log message to the channels.

Definition at line 1580 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().

1581 {
1582  struct logchannel *chan = NULL;
1583  char buf[BUFSIZ];
1584  int level = 0;
1585 
1587  if (!AST_RWLIST_EMPTY(&logchannels)) {
1589 
1590  /* If the channel is disabled, then move on to the next one */
1591  if (chan->disabled) {
1592  continue;
1593  }
1594  if (logmsg->level == __LOG_VERBOSE
1595  && (((chan->verbosity < 0) ? option_verbose : chan->verbosity)) < level) {
1596  continue;
1597  }
1598 
1599  if (!(chan->logmask & (1 << logmsg->level))) {
1600  continue;
1601  }
1602 
1603  switch (chan->type) {
1604  case LOGTYPE_SYSLOG:
1605  {
1606  int syslog_level = ast_syslog_priority_from_loglevel(logmsg->level);
1607 
1608  if (syslog_level < 0) {
1609  /* we are locked here, so cannot ast_log() */
1610  fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", logmsg->level);
1611  continue;
1612  }
1613 
1614  /* Don't use LOG_MAKEPRI because it's broken in glibc<2.17 */
1615  syslog_level = chan->facility | syslog_level; /* LOG_MAKEPRI(chan->facility, syslog_level); */
1616  if (!chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
1617  syslog(syslog_level, "%s", buf);
1618  }
1619  }
1620  break;
1621  case LOGTYPE_CONSOLE:
1622  if (!chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
1623  ast_console_puts_mutable_full(buf, logmsg->level, logmsg->sublevel);
1624  }
1625  break;
1626  case LOGTYPE_FILE:
1627  {
1628  int res = 0;
1629 
1630  if (!chan->fileptr) {
1631  continue;
1632  }
1633 
1634  if (chan->formatter.format_log(chan, logmsg, buf, BUFSIZ)) {
1635  continue;
1636  }
1637 
1638  /* Print out to the file */
1639  res = fprintf(chan->fileptr, "%s", buf);
1640  if (res > 0) {
1641  fflush(chan->fileptr);
1642  } else if (res <= 0 && !ast_strlen_zero(logmsg->message)) {
1643  fprintf(stderr, "**** Asterisk Logging Error: ***********\n");
1644  if (errno == ENOMEM || errno == ENOSPC) {
1645  fprintf(stderr, "Asterisk logging error: Out of disk space, can't log to log file %s\n", chan->filename);
1646  } else {
1647  fprintf(stderr, "Logger Warning: Unable to write to log file '%s': %s (disabled)\n", chan->filename, strerror(errno));
1648  }
1649 
1650  /*** DOCUMENTATION
1651  <managerEventInstance>
1652  <synopsis>Raised when a logging channel is disabled.</synopsis>
1653  <syntax>
1654  <parameter name="Channel">
1655  <para>The name of the logging channel.</para>
1656  </parameter>
1657  </syntax>
1658  </managerEventInstance>
1659  ***/
1660  manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: No\r\nReason: %d - %s\r\n", chan->filename, errno, strerror(errno));
1661  chan->disabled = 1;
1662  }
1663  }
1664  break;
1665  }
1666  }
1667  } else if (logmsg->level != __LOG_VERBOSE || option_verbose >= logmsg->sublevel) {
1668  fputs(logmsg->message, stdout);
1669  }
1670 
1672 
1673  /* If we need to reload because of the file size, then do so */
1674  if (filesize_reload_needed) {
1675  reload_logger(-1, NULL);
1676  ast_verb(1, "Rotated Logs Per SIGXFSZ (Exceeded file size limit)\n");
1677  }
1678 
1679  return;
1680 }
struct logformatter formatter
Definition: logger.c:133
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:139
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:1141
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:463
int verbosity
Definition: logger.c:141
#define ast_strlen_zero(foo)
Definition: strings.h:52
static int filesize_reload_needed
Definition: logger.c:84
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
#define EVENT_FLAG_SYSTEM
Definition: manager.h:71
struct logchannel::@404 list
unsigned int logmask
Definition: logger.c:135
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int level
Definition: logger.c:167
int(*const format_log)(struct logchannel *channel, struct logmsg *msg, char *buf, size_t size)
Definition: logger.c:122
int disabled
Definition: logger.c:137
#define AST_RWLIST_EMPTY
Definition: linkedlists.h:451
int errno
enum logtypes type
Definition: logger.c:143
FILE * fileptr
Definition: logger.c:145
char filename[PATH_MAX]
Definition: logger.c:147
#define __LOG_VERBOSE
Definition: logger.h:295
const ast_string_field message
Definition: logger.c:178
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:248
int sublevel
Definition: logger.c:168

◆ logger_queue_init()

static void logger_queue_init ( void  )
static

Definition at line 1817 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().

1818 {
1819  ast_unload_realtime("queue_log");
1820  if (logfiles.queue_log) {
1821  char qfname[PATH_MAX];
1822 
1823  if (logger_queue_rt_start()) {
1824  return;
1825  }
1826 
1827  /* Open the log file. */
1828  snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR,
1829  queue_log_name);
1830  if (qlog) {
1831  /* Just in case it was already open. */
1832  fclose(qlog);
1833  }
1834  qlog = fopen(qfname, "a");
1835  if (!qlog) {
1836  ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
1837  }
1838  }
1839 }
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:193
static int logger_queue_rt_start(void)
Definition: logger.c:1078
static char queue_log_name[256]
Definition: logger.c:81
#define LOG_ERROR
Definition: logger.h:285
int errno
const char * ast_config_AST_LOG_DIR
Definition: options.c:159
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:2101
#define PATH_MAX
Definition: asterisk.h:40
static struct @403 logfiles

◆ logger_queue_restart()

static int logger_queue_restart ( int  queue_rotate)
static

Definition at line 1113 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().

1114 {
1115  int res = 0;
1116  char qfname[PATH_MAX];
1117 
1118  if (logger_queue_rt_start()) {
1119  return res;
1120  }
1121 
1122  snprintf(qfname, sizeof(qfname), "%s/%s", ast_config_AST_LOG_DIR, queue_log_name);
1123  if (qlog) {
1124  /* Just in case it was still open. */
1125  fclose(qlog);
1126  qlog = NULL;
1127  }
1128  if (queue_rotate) {
1129  rotate_file(qfname);
1130  }
1131 
1132  /* Open the log file. */
1133  qlog = fopen(qfname, "a");
1134  if (!qlog) {
1135  ast_log(LOG_ERROR, "Unable to create queue log: %s\n", strerror(errno));
1136  res = -1;
1137  }
1138  return res;
1139 }
static int rotate_file(const char *filename)
Definition: logger.c:974
#define NULL
Definition: resample.c:96
static FILE * qlog
Definition: logger.c:193
static int logger_queue_rt_start(void)
Definition: logger.c:1078
static char queue_log_name[256]
Definition: logger.c:81
#define LOG_ERROR
Definition: logger.h:285
int errno
const char * ast_config_AST_LOG_DIR
Definition: options.c:159
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:2101
#define PATH_MAX
Definition: asterisk.h:40

◆ logger_queue_rt_start()

static int logger_queue_rt_start ( void  )
static

Definition at line 1078 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().

1079 {
1080  if (ast_check_realtime("queue_log")) {
1081  if (!ast_realtime_require_field("queue_log",
1082  "time", RQ_DATETIME, 26,
1083  "data1", RQ_CHAR, 20,
1084  "data2", RQ_CHAR, 20,
1085  "data3", RQ_CHAR, 20,
1086  "data4", RQ_CHAR, 20,
1087  "data5", RQ_CHAR, 20,
1088  SENTINEL)) {
1089  logfiles.queue_adaptive_realtime = 1;
1090  } else {
1091  logfiles.queue_adaptive_realtime = 0;
1092  }
1093 
1094  if (!logfiles.queue_log_to_file) {
1095  /* Don't open the log file. */
1096  return 1;
1097  }
1098  }
1099  return 0;
1100 }
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 @403 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 1854 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().

1855 {
1856  /* Must not be called before the logger is initialized. */
1858 
1860  if (!queuelog_init) {
1862  queuelog_init = 1;
1864  ast_queue_log("NONE", "NONE", "NONE", "QUEUESTART", "%s", "");
1865  } else {
1867  }
1868 }
static int queuelog_init
Definition: logger.c:86
#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:695
void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
Definition: logger.c:894
static int logger_initialized
Definition: logger.c:87
static void logger_queue_init(void)
Definition: logger.c:1817

◆ logger_register_level()

static int logger_register_level ( const char *  name)
static

Definition at line 2464 of file logger.c.

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

Referenced by ast_logger_register_level(), and init_logger_chain().

2465 {
2466  unsigned int level;
2467  unsigned int available = 0;
2468 
2469  for (level = 0; level < ARRAY_LEN(levels); level++) {
2470  if ((level >= 16) && !available && !levels[level]) {
2471  available = level;
2472  continue;
2473  }
2474 
2475  if (levels[level] && !strcasecmp(levels[level], name)) {
2477  "Unable to register dynamic logger level '%s': a standard logger level uses that name.\n",
2478  name);
2480 
2481  return -1;
2482  }
2483  }
2484 
2485  if (!available) {
2487  "Unable to register dynamic logger level '%s'; maximum number of levels registered.\n",
2488  name);
2490 
2491  return -1;
2492  }
2493 
2495 
2496  ast_debug(1, "Registered dynamic logger level '%s' with index %u.\n", name, available);
2497 
2499 
2500  return available;
2501 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
#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:206
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
static void update_logchannels(void)
Definition: logger.c:2360
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
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:2101

◆ logger_thread()

static void* logger_thread ( void *  data)
static

Actual logging thread.

Definition at line 1761 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().

1762 {
1763  struct logmsg *next = NULL, *msg = NULL;
1764 
1765  for (;;) {
1766  /* We lock the message list, and see if any message exists... if not we wait on the condition to be signalled */
1768  if (AST_LIST_EMPTY(&logmsgs)) {
1769  if (close_logger_thread) {
1771  break;
1772  } else {
1774  }
1775  }
1776 
1777  if (high_water_alert) {
1778  msg = format_log_message(__LOG_WARNING, 0, "logger", 0, "***", 0,
1779  "Logging resumed. %d message%s discarded.\n",
1781  if (msg) {
1783  }
1784  high_water_alert = 0;
1786  }
1787 
1788  next = AST_LIST_FIRST(&logmsgs);
1790  logger_queue_size = 0;
1792 
1793  /* Otherwise go through and process each message in the order added */
1794  while ((msg = next)) {
1795  /* Get the next entry now so that we can free our current structure later */
1796  next = AST_LIST_NEXT(msg, list);
1797 
1798  /* Depending on the type, send it to the proper function */
1799  logger_print_normal(msg);
1800 
1801  /* Free the data since we are done */
1802  logmsg_free(msg);
1803  }
1804  }
1805 
1806  return NULL;
1807 }
static void logger_print_normal(struct logmsg *logmsg)
Print a normal log message to the channels.
Definition: logger.c:1580
#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:182
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:139
#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:179
#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
struct logmsg::@405 list
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:1746
Definition: logger.c:165
static unsigned int high_water_alert
Definition: logger.c:96
#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:91
static int close_logger_thread
Definition: logger.c:191
ast_mutex_t lock
Definition: logger.c:188
static int logger_messages_discarded
Definition: logger.c:95
static ast_cond_t logcond
Definition: logger.c:190

◆ logmsg_free()

static void logmsg_free ( struct logmsg msg)
static

Definition at line 182 of file logger.c.

References ast_free, and ast_string_field_free_memory.

Referenced by ast_log_full(), and logger_thread().

183 {
185  ast_free(msg);
186 }
#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 479 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().

480 {
481  char *w;
482  unsigned int logmask = 0;
483  char *stringp = ast_strdupa(chan->components);
484  unsigned int x;
485  unsigned int verb_level;
486 
487  /* Default to using option_verbose as the verbosity level of the logging channel. */
488  verb_level = -1;
489 
490  w = strchr(stringp, '[');
491  if (w) {
492  char *end = strchr(w + 1, ']');
493  if (!end) {
494  fprintf(stderr, "Logger Warning: bad formatter definition for %s in logger.conf\n", chan->filename);
495  } else {
496  char *formatter_name = w + 1;
497 
498  *end = '\0';
499  stringp = end + 1;
500 
501  if (!strcasecmp(formatter_name, "json")) {
502  memcpy(&chan->formatter, &logformatter_json, sizeof(chan->formatter));
503  } else if (!strcasecmp(formatter_name, "default")) {
504  memcpy(&chan->formatter, &logformatter_default, sizeof(chan->formatter));
505  } else if (!strcasecmp(formatter_name, "plain")) {
506  memcpy(&chan->formatter, &logformatter_plain, sizeof(chan->formatter));
507  } else {
508  fprintf(stderr, "Logger Warning: Unknown formatter definition %s for %s in logger.conf; using 'default'\n",
509  formatter_name, chan->filename);
510  memcpy(&chan->formatter, &logformatter_default, sizeof(chan->formatter));
511  }
512  }
513  }
514 
515  if (!chan->formatter.name) {
516  memcpy(&chan->formatter, &logformatter_default, sizeof(chan->formatter));
517  }
518 
519  while ((w = strsep(&stringp, ","))) {
520  w = ast_strip(w);
521  if (ast_strlen_zero(w)) {
522  continue;
523  }
524  if (!strcmp(w, "*")) {
525  logmask = 0xFFFFFFFF;
526  } else if (!strncasecmp(w, "verbose(", 8)) {
527  if (levels[__LOG_VERBOSE] && sscanf(w + 8, "%30u)", &verb_level) == 1) {
528  logmask |= (1 << __LOG_VERBOSE);
529  }
530  } else {
531  for (x = 0; x < ARRAY_LEN(levels); ++x) {
532  if (levels[x] && !strcasecmp(w, levels[x])) {
533  logmask |= (1 << x);
534  break;
535  }
536  }
537  }
538  }
539  if (chan->type == LOGTYPE_CONSOLE) {
540  /*
541  * Force to use the root console verbose level so if the
542  * user specified any verbose level then it does not interfere
543  * with calculating the ast_verb_sys_level value.
544  */
545  chan->verbosity = -1;
546  logmask |= (1 << __LOG_VERBOSE);
547  } else {
548  chan->verbosity = verb_level;
549  }
550  chan->logmask = logmask;
551 }
struct logformatter formatter
Definition: logger.c:133
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
char components[0]
Definition: logger.c:155
static char * levels[NUMLOGLEVELS]
Logging channels used in the Asterisk logging system.
Definition: logger.c:206
char * end
Definition: eagi_proxy.c:73
int verbosity
Definition: logger.c:141
#define ast_strlen_zero(foo)
Definition: strings.h:52
static struct logformatter logformatter_json
Definition: logger.c:314
static struct logformatter logformatter_plain
Definition: logger.c:474
unsigned int logmask
Definition: logger.c:135
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:143
static struct logformatter logformatter_default
Definition: logger.c:424
const char * name
Definition: logger.c:120
char filename[PATH_MAX]
Definition: logger.c:147
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 560 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().

561 {
562  const char *log_dir_prefix = "";
563  const char *log_dir_separator = "";
564 
565  *filename = '\0';
566 
567  if (!strcasecmp(channel, "console")) {
568  return;
569  }
570 
571  if (!strncasecmp(channel, "syslog", 6)) {
572  ast_copy_string(filename, channel, size);
573  return;
574  }
575 
576  /* It's a filename */
577 
578  if (channel[0] != '/') {
579  log_dir_prefix = ast_config_AST_LOG_DIR;
580  log_dir_separator = "/";
581  }
582 
583  if (!ast_strlen_zero(hostname)) {
584  snprintf(filename, size, "%s%s%s.%s",
585  log_dir_prefix, log_dir_separator, channel, hostname);
586  } else {
587  snprintf(filename, size, "%s%s%s",
588  log_dir_prefix, log_dir_separator, channel);
589  }
590 }
Definition: muted.c:95
#define ast_strlen_zero(foo)
Definition: strings.h:52
const char * ast_config_AST_LOG_DIR
Definition: options.c:159
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:112

◆ make_logchannel()

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

Definition at line 617 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().

618 {
619  struct logchannel *chan;
620  char *facility;
621  struct ast_tm tm;
622  struct timeval now = ast_tvnow();
623  char datestring[256];
624 
625  if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1)))
626  return NULL;
627 
628  strcpy(chan->components, components);
629  chan->lineno = lineno;
630  chan->dynamic = dynamic;
631 
632  make_filename(channel, chan->filename, sizeof(chan->filename));
633 
634  if (!strcasecmp(channel, "console")) {
635  chan->type = LOGTYPE_CONSOLE;
636  } else if (!strncasecmp(channel, "syslog", 6)) {
637  /*
638  * syntax is:
639  * syslog.facility => level,level,level
640  */
641  facility = strchr(channel, '.');
642  if (!facility++ || !facility) {
643  facility = "local0";
644  }
645 
646  chan->facility = ast_syslog_facility(facility);
647 
648  if (chan->facility < 0) {
649  fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
650  ast_free(chan);
651  return NULL;
652  }
653 
654  chan->type = LOGTYPE_SYSLOG;
655  openlog("asterisk", LOG_PID, chan->facility);
656  } else {
657  if (!(chan->fileptr = fopen(chan->filename, "a"))) {
658  /* Can't do real logging here since we're called with a lock
659  * so log to any attached consoles */
660  ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR);
665  ast_free(chan);
666  return NULL;
667  } else {
668  /* Create our date/time */
669  ast_localtime(&now, &tm, NULL);
670  ast_strftime(datestring, sizeof(datestring), dateformat, &tm);
671 
672  fprintf(chan->fileptr, "[%s] Asterisk %s built by %s @ %s on a %s running %s on %s\n",
675  fflush(chan->fileptr);
676  }
677  chan->type = LOGTYPE_FILE;
678  }
679  make_components(chan);
680 
681  return chan;
682 }
const char * ast_build_user
Definition: buildinfo.c:34
int facility
Definition: logger.c:139
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:560
const char * ast_get_version(void)
Retrieve the Asterisk version string.
Definition: version.c:16
char components[0]
Definition: logger.c:155
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:479
const char * ast_build_hostname
Definition: buildinfo.c:29
#define ast_strlen_zero(foo)
Definition: strings.h:52
const char * ast_build_machine
Definition: buildinfo.c:31
int dynamic
Definition: logger.c:153
int errno
enum logtypes type
Definition: logger.c:143
#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:145
char filename[PATH_MAX]
Definition: logger.c:147
static char dateformat[256]
Definition: logger.c:79
int lineno
Definition: logger.c:151
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 1141 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().

1142 {
1143  int queue_rotate = rotate;
1144  struct logchannel *f;
1145  int res = 0;
1146 
1148 
1149  if (qlog) {
1150  if (rotate < 0) {
1151  /* Check filesize - this one typically doesn't need an auto-rotate */
1152  if (ftello(qlog) > 0x40000000) { /* Arbitrarily, 1 GB */
1153  fclose(qlog);
1154  qlog = NULL;
1155  } else {
1156  queue_rotate = 0;
1157  }
1158  } else {
1159  fclose(qlog);
1160  qlog = NULL;
1161  }
1162  } else {
1163  queue_rotate = 0;
1164  }
1165 
1167 
1169  if (f->disabled) {
1170  f->disabled = 0; /* Re-enable logging at reload */
1171  /*** DOCUMENTATION
1172  <managerEventInstance>
1173  <synopsis>Raised when a logging channel is re-enabled after a reload operation.</synopsis>
1174  <syntax>
1175  <parameter name="Channel">
1176  <para>The name of the logging channel.</para>
1177  </parameter>
1178  </syntax>
1179  </managerEventInstance>
1180  ***/
1181  manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename);
1182  }
1183  if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
1184  int rotate_this = 0;
1185  if (rotatestrategy != NONE && ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */
1186  /* Be more proactive about rotating massive log files */
1187  rotate_this = 1;
1188  }
1189  fclose(f->fileptr); /* Close file */
1190  f->fileptr = NULL;
1191  if (rotate || rotate_this) {
1192  rotate_file(f->filename);
1193  }
1194  }
1195  }
1196 
1198 
1199  init_logger_chain(altconf);
1200 
1201  ast_unload_realtime("queue_log");
1202  if (logfiles.queue_log) {
1203  res = logger_queue_restart(queue_rotate);
1205  ast_verb_update();
1206  ast_queue_log("NONE", "NONE", "NONE", "CONFIGRELOAD", "%s", "");
1207  ast_verb(1, "Asterisk Queue Logger restarted\n");
1208  } else {
1210  ast_verb_update();
1211  }
1212 
1213  return res;
1214 }
static int init_logger_chain(const char *altconf)
Read config, setup channels.
Definition: logger.c:710
static int rotate_file(const char *filename)
Definition: logger.c:974
void ast_verb_update(void)
Re-evaluate the system max verbosity level (ast_verb_sys_level).
Definition: logger.c:2232
#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:193
#define ast_verb(level,...)
Definition: logger.h:463
void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt,...)
Definition: logger.c:894
static int filesize_reload_needed
Definition: logger.c:84
#define EVENT_FLAG_SYSTEM
Definition: manager.h:71
struct logchannel::@404 list
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
int disabled
Definition: logger.c:137
const char * ast_config_AST_LOG_DIR
Definition: options.c:159
FILE * fileptr
Definition: logger.c:145
char filename[PATH_MAX]
Definition: logger.c:147
rotatestrategy
Definition: logger.c:98
Definition: logger.c:99
static int logger_queue_restart(int queue_rotate)
Definition: logger.c:1113
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:248
static struct @403 logfiles
int ast_mkdir(const char *path, int mode)
Recursively create directory path.
Definition: main/utils.c:2231

◆ reload_module()

static int reload_module ( void  )
static

Definition at line 2592 of file logger.c.

References NULL, and reload_logger().

Referenced by load_module().

2593 {
2594  return reload_logger(0, NULL);
2595 }
#define NULL
Definition: resample.c:96
static int reload_logger(int rotate, const char *altconf)
Definition: logger.c:1141

◆ rotate_file()

static int rotate_file ( const char *  filename)
static

Definition at line 974 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().

975 {
976  char old[PATH_MAX];
977  char new[PATH_MAX];
978  int x, y, which, found, res = 0, fd;
979  char *suffixes[4] = { "", ".gz", ".bz2", ".Z" };
980 
981  switch (rotatestrategy) {
982  case NONE:
983  /* No rotation */
984  break;
985  case SEQUENTIAL:
986  for (x = 0; ; x++) {
987  snprintf(new, sizeof(new), "%s.%d", filename, x);
988  fd = open(new, O_RDONLY);
989  if (fd > -1)
990  close(fd);
991  else
992  break;
993  }
994  if (rename(filename, new)) {
995  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
996  res = -1;
997  } else {
998  filename = new;
999  }
1000  break;
1001  case TIMESTAMP:
1002  snprintf(new, sizeof(new), "%s.%ld", filename, (long)time(NULL));
1003  if (rename(filename, new)) {
1004  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
1005  res = -1;
1006  } else {
1007  filename = new;
1008  }
1009  break;
1010  case ROTATE:
1011  /* Find the next empty slot, including a possible suffix */
1012  for (x = 0; ; x++) {
1013  found = 0;
1014  for (which = 0; which < ARRAY_LEN(suffixes); which++) {
1015  snprintf(new, sizeof(new), "%s.%d%s", filename, x, suffixes[which]);
1016  fd = open(new, O_RDONLY);
1017  if (fd > -1) {
1018  close(fd);
1019  found = 1;
1020  break;
1021  }
1022  }
1023  if (!found) {
1024  break;
1025  }
1026  }
1027 
1028  /* Found an empty slot */
1029  for (y = x; y > 0; y--) {
1030  for (which = 0; which < ARRAY_LEN(suffixes); which++) {
1031  snprintf(old, sizeof(old), "%s.%d%s", filename, y - 1, suffixes[which]);
1032  fd = open(old, O_RDONLY);
1033  if (fd > -1) {
1034  /* Found the right suffix */
1035  close(fd);
1036  snprintf(new, sizeof(new), "%s.%d%s", filename, y, suffixes[which]);
1037  if (rename(old, new)) {
1038  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", old, new);
1039  res = -1;
1040  }
1041  break;
1042  }
1043  }
1044  }
1045 
1046  /* Finally, rename the current file */
1047  snprintf(new, sizeof(new), "%s.0", filename);
1048  if (rename(filename, new)) {
1049  fprintf(stderr, "Unable to rename file '%s' to '%s'\n", filename, new);
1050  res = -1;
1051  } else {
1052  filename = new;
1053  }
1054  }
1055 
1058  char buf[512];
1059 
1060  pbx_builtin_setvar_helper(c, "filename", filename);
1061  pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf));
1062  if (c) {
1063  c = ast_channel_unref(c);
1064  }
1065  if (ast_safe_system(buf) == -1) {
1066  ast_log(LOG_WARNING, "error executing '%s'\n", buf);
1067  }
1068  }
1069  return res;
1070 }
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:2981
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
#define ast_strlen_zero(foo)
Definition: strings.h:52
Definition: logger.c:101
#define ast_dummy_channel_alloc()
Create a fake channel structure.
Definition: channel.h:1283
static char exec_after_rotate[256]
Definition: logger.c:82
int ast_safe_system(const char *s)
Safely spawn an OS shell command while closing file descriptors.
Definition: extconf.c:829
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:147
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:2101
rotatestrategy
Definition: logger.c:98
void pbx_substitute_variables_helper(struct ast_channel *c, const char *cp1, char *cp2, int count)
Definition: ael_main.c:211
Definition: logger.c:99
#define PATH_MAX
Definition: asterisk.h:40

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 2597 of file logger.c.

Referenced by load_module().

2598 {
2599  return 0;
2600 }

◆ update_logchannels()

static void update_logchannels ( void  )
static

Definition at line 2360 of file logger.c.

References AST_RWLIST_TRAVERSE, AST_THREADSTORAGE_RAW(), global_logmask, logchannel::list, logchannel::logmask, and make_components().

Referenced by ast_logger_unregister_level(), and logger_register_level().

2361 {
2362  struct logchannel *cur;
2363 
2364  global_logmask = 0;
2365 
2367  make_components(cur);
2368  global_logmask |= cur->logmask;
2369  }
2370 }
static unsigned int global_logmask
Definition: logger.c:85
static void make_components(struct logchannel *chan)
Definition: logger.c:479
struct logchannel::@404 list
unsigned int logmask
Definition: logger.c:135
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493

◆ verb_console_free()

static void verb_console_free ( void *  v_console)
static

Definition at line 2285 of file logger.c.

References ast_free, and verb_console_unregister().

2286 {
2287  struct verb_console *console = v_console;
2288 
2289  verb_console_unregister(console);
2290  ast_free(console);
2291 }
#define ast_free(a)
Definition: astmm.h:182
static void verb_console_unregister(struct verb_console *console)
Definition: logger.c:2275

◆ verb_console_unregister()

static void verb_console_unregister ( struct verb_console console)
static

Definition at line 2275 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().

2276 {
2278  console = AST_RWLIST_REMOVE(&verb_consoles, console, node);
2280  if (console) {
2281  ast_verb_update();
2282  }
2283 }
Definition: test_heap.c:38
void ast_verb_update(void)
Re-evaluate the system max verbosity level (ast_verb_sys_level).
Definition: logger.c:2232
#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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = 0, }
static

Definition at line 2615 of file logger.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 2615 of file logger.c.

◆ cli_logger

struct ast_cli_entry cli_logger[]
static

Definition at line 1559 of file logger.c.

◆ close_logger_thread

int close_logger_thread = 0
static

Definition at line 191 of file logger.c.

◆ colors

const int colors[NUMLOGLEVELS]
static

Colors used in the console for logging.

Definition at line 217 of file logger.c.

◆ dateformat

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

◆ display_callids

int display_callids
static

Definition at line 89 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 82 of file logger.c.

Referenced by init_logger_chain(), and rotate_file().

◆ filesize_reload_needed

int filesize_reload_needed
static

Definition at line 84 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:1568

Definition at line 1574 of file logger.c.

◆ high_water_alert

unsigned int high_water_alert
static

Definition at line 96 of file logger.c.

Referenced by ast_log_full(), and logger_thread().

◆ hostname

char hostname[MAXHOSTNAMELEN]
static

Definition at line 112 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 206 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 256 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 190 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:365

Definition at line 424 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:259

Definition at line 314 of file logger.c.

◆ logformatter_plain

struct logformatter logformatter_plain
static
Initial value:
= {
.name = "plain",
.format_log = format_log_plain,
}
static int format_log_plain(struct logchannel *chan, struct logmsg *msg, char *buf, size_t size)
Definition: logger.c:429

Definition at line 474 of file logger.c.

◆ logger_initialized

int logger_initialized
static

◆ logger_messages_discarded

int logger_messages_discarded
static

Definition at line 95 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 91 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 189 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 88 of file logger.c.

Referenced by ast_create_callid().

◆ qlog

FILE* qlog
static

Definition at line 193 of file logger.c.

◆ queue_adaptive_realtime

unsigned int queue_adaptive_realtime

Definition at line 108 of file logger.c.

◆ queue_log

unsigned int queue_log

Definition at line 106 of file logger.c.

◆ queue_log_name

char queue_log_name[256] = QUEUELOG
static

Definition at line 81 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 109 of file logger.c.

◆ queue_log_to_file

unsigned int queue_log_to_file

Definition at line 107 of file logger.c.

◆ queuelog_init

int queuelog_init
static

Definition at line 86 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 2230 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 252 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 253 of file logger.c.