From 5b8e1963c56406b71357aa5428672c02363bc0da Mon Sep 17 00:00:00 2001 From: Brett Bryant Date: Thu, 29 May 2008 21:30:37 +0000 Subject: Adds support for changing logger settingss on remote consoles with a new command "logger set level". i.e. "logger set level debug off" (closes issue #10891) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@119126 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/asterisk.c | 26 ++++++++++++++++++++------ main/logger.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 8 deletions(-) (limited to 'main') diff --git a/main/asterisk.c b/main/asterisk.c index 8d60acaa9..a5683c745 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -179,6 +179,7 @@ struct console { int p[2]; /*!< Pipe */ pthread_t t; /*!< Thread of handler */ int mute; /*!< Is the console muted for logs */ + int levels[NUMLOGLEVELS]; /*!< Which log levels are enabled for the console */ }; struct ast_atexit { @@ -900,6 +901,17 @@ int ast_safe_system(const char *s) return res; } +void ast_console_toggle_loglevel(int fd, int level, int state) +{ + int x; + for (x = 0;x < AST_MAX_CONNECTS; x++) { + if (fd == consoles[x].fd) { + consoles[x].levels[level] = state; + return; + } + } +} + /*! * \brief mute or unmute a console from logging */ @@ -925,14 +937,16 @@ void ast_console_toggle_mute(int fd, int silent) { /*! * \brief log the string to all attached console clients */ -static void ast_network_puts_mutable(const char *string) +static void ast_network_puts_mutable(const char *string, int level) { int x; for (x = 0;x < AST_MAX_CONNECTS; x++) { if (consoles[x].mute) continue; - if (consoles[x].fd > -1) - fdprint(consoles[x].p[1], string); + if (consoles[x].fd > -1) { + if (!consoles[x].levels[level]) + fdprint(consoles[x].p[1], string); + } } } @@ -940,11 +954,11 @@ static void ast_network_puts_mutable(const char *string) * \brief log the string to the console, and all attached * console clients */ -void ast_console_puts_mutable(const char *string) +void ast_console_puts_mutable(const char *string, int level) { fputs(string, stdout); fflush(stdout); - ast_network_puts_mutable(string); + ast_network_puts_mutable(string, level); } /*! @@ -972,7 +986,7 @@ void ast_console_puts(const char *string) static void network_verboser(const char *s) { - ast_network_puts_mutable(s); + ast_network_puts_mutable(s, __LOG_VERBOSE); } static pthread_t lthread; diff --git a/main/logger.c b/main/logger.c index d20ac8bc5..94cbac208 100644 --- a/main/logger.c +++ b/main/logger.c @@ -728,6 +728,44 @@ static char *handle_logger_rotate(struct ast_cli_entry *e, int cmd, struct ast_c return CLI_SUCCESS; } +static char *handle_logger_set_level(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + int x; + int state; + int level = -1; + + switch (cmd) { + case CLI_INIT: + e->command = "logger set level"; + e->usage = + "Usage: logger set level\n" + " Set a specific log level to enabled/disabled for this console.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + if (a->argc < 5) + return CLI_SHOWUSAGE; + + for (x = 0; x <= NUMLOGLEVELS; x++) { + if (!strcasecmp(a->argv[3], levels[x])) { + level = x; + break; + } + } + + state = ast_true(a->argv[4]) ? 1 : 0; + + if (level != -1) { + ast_console_toggle_loglevel(a->fd, level, state); + ast_cli(a->fd, "Logger status for '%s' has been set to '%s'.\n", levels[level], state ? "on" : "off"); + } else + return CLI_SHOWUSAGE; + + return CLI_SUCCESS; +} + /*! \brief CLI command to show logging system configuration */ static char *handle_logger_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { @@ -784,7 +822,8 @@ static AST_RWLIST_HEAD_STATIC(verbosers, verb); static struct ast_cli_entry cli_logger[] = { AST_CLI_DEFINE(handle_logger_show_channels, "List configured log channels"), AST_CLI_DEFINE(handle_logger_reload, "Reopens the log files"), - AST_CLI_DEFINE(handle_logger_rotate, "Rotates and reopens the log files") + AST_CLI_DEFINE(handle_logger_rotate, "Rotates and reopens the log files"), + AST_CLI_DEFINE(handle_logger_set_level, "Enables/Disables a specific logging level for this console") }; static int handle_SIGXFSZ(int sig) @@ -863,7 +902,7 @@ static void logger_print_normal(struct logmsg *logmsg) term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)), logmsg->str); /* Print out */ - ast_console_puts_mutable(buf); + ast_console_puts_mutable(buf, logmsg->level); /* File channels */ } else if (chan->type == LOGTYPE_FILE && (chan->logmask & (1 << logmsg->level))) { int res = 0; -- cgit v1.2.3