]> granicus.if.org Git - icinga2/commitdiff
fix "Console" log to flush
authorAlan Jenkins <alan.christopher.jenkins@gmail.com>
Mon, 28 May 2018 20:08:57 +0000 (21:08 +0100)
committerAlan Jenkins <alan.christopher.jenkins@gmail.com>
Sat, 25 Aug 2018 08:54:55 +0000 (09:54 +0100)
It's called "Console", which would be line-buffered anyway.  But, it's
implemented as std::cout.  This might be piped to a logger, as in
daemontools or systemd.  In this case it will not be a TTY, and log lines
should be flushed without too much delay.  Let's just flush each message.

Let's not introduce a static instance of StreamLogger (flushed by interval
timer).  That's too stressful to read, because static instances are really
annoying to order.  Example citation: "Yay, our static destructors are
pretty much beyond repair at this point." -- application.cpp.

I don't know if there will be any need to optimize logging syscalls.  The
init script uses `--daemonize`.  I think the systemd service should also
avoid using the "Console" log after startup (see next commit).  The
documentation does not warn that the syslog feature is less efficient
in system calls than mainlog; deferred flusing does not seem to be a highly
prominent feature.  There's no cool comment in the code about how much the
syscalls were slowing down some use case (or qualifying that this
optimization can only eliminate syscalls on platforms with both mutexes and
clocks that can work without syscalls).

lib/base/logger.cpp

index 9a59d199f32c5242064f850a00c265cc27353434..8af34d6ca7ca5ab9240267d5cfa5a7b5af1393d7 100644 (file)
@@ -245,8 +245,13 @@ Log::~Log()
 #endif /* I2_DEBUG */
        }
 
-       if (Logger::IsConsoleLogEnabled() && entry.Severity >= Logger::GetConsoleLogSeverity())
+       if (Logger::IsConsoleLogEnabled() && entry.Severity >= Logger::GetConsoleLogSeverity()) {
                StreamLogger::ProcessLogEntry(std::cout, entry);
+
+               /* "Console" might be a pipe/socket (systemd, daemontools, docker, ...),
+                * then cout will not flush lines automatically. */
+               std::cout << std::flush;
+       }
 }
 
 Log& Log::operator<<(const char *val)