]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Logger does not warn of failure to open logging channels
authorKinsey Moore <kmoore@digium.com>
Fri, 12 Aug 2011 16:20:25 +0000 (16:20 +0000)
committerKinsey Moore <kmoore@digium.com>
Fri, 12 Aug 2011 16:20:25 +0000 (16:20 +0000)
Currently, logger only prints an error message to stderr when it fails to open
a logger channel where many users will not see it because the logger lock is
held.  The alternative provided by this patch is to log the error to all
attached consoles in the hopes that it will be easier to see.  Additionally,
this patch prevents the failed logger channel from being added to the list
where it would silently fail on each call to the Asterisk logger.

(closes issue ASTERISK-16231)
Review: https://reviewboard.asterisk.org/r/1338

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@331649 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/logger.c

index 9bfb93b003cce7ad677f85d0a34db265aedd2381..0e0d2a0b33761c42b034095902ef30061ad53ef3 100644 (file)
@@ -283,9 +283,16 @@ static struct logchannel *make_logchannel(const char *channel, const char *compo
                                 channel[0] != '/' ? ast_config_AST_LOG_DIR : "", channel);
                }
                if (!(chan->fileptr = fopen(chan->filename, "a"))) {
-                       /* Can't log here, since we're called with a lock */
-                       fprintf(stderr, "Logger Warning: Unable to open log file '%s': %s\n", chan->filename, strerror(errno));
-               } 
+                       /* Can't do real logging here since we're called with a lock
+                        * so log to any attached consoles */
+                       ast_console_puts_mutable("ERROR: Unable to open log file '", __LOG_ERROR);
+                       ast_console_puts_mutable(chan->filename, __LOG_ERROR);
+                       ast_console_puts_mutable("': ", __LOG_ERROR);
+                       ast_console_puts_mutable(strerror(errno), __LOG_ERROR);
+                       ast_console_puts_mutable("'\n", __LOG_ERROR);
+                       ast_free(chan);
+                       return NULL;
+               }
                chan->type = LOGTYPE_FILE;
        }
        chan->logmask = make_components(chan->components, lineno);
@@ -393,6 +400,11 @@ static void init_logger_chain(int locked)
        var = ast_variable_browse(cfg, "logfiles");
        for (; var; var = var->next) {
                if (!(chan = make_logchannel(var->name, var->value, var->lineno))) {
+                       /* Print error message directly to the consoles since the lock is held
+                        * and we don't want to unlock with the list partially built */
+                       ast_console_puts_mutable("ERROR: Unable to create log channel '", __LOG_ERROR);
+                       ast_console_puts_mutable(var->name, __LOG_ERROR);
+                       ast_console_puts_mutable("'\n", __LOG_ERROR);
                        continue;
                }
                AST_RWLIST_INSERT_HEAD(&logchannels, chan, list);