On Tue, Jun 18, 2024 at 08:01:31AM +0200, Stefano Brivio wrote: > On Tue, 18 Jun 2024 10:44:20 +1000 > David Gibson wrote: > > > On Mon, Jun 17, 2024 at 02:03:16PM +0200, Stefano Brivio wrote: > > > After commit 15001b39ef1d ("conf: set the log level much earlier"), we > > > had a phase during initialisation when messages wouldn't be printed to > > > standard error anymore. > > > > > > Commit f67238aa864d ("passt, log: Call __openlog() earlier, log to > > > stderr until we detach") fixed that, but only for the case where no > > > log files are given. > > > > > > If a log file is configured, vlogmsg() will not call passt_vsyslog(), > > > but during initialisation, LOG_PERROR is set, so to avoid duplicated > > > prints (which would result from passt_vsyslog() printing to stderr), > > > we don't call fprintf() from vlogmsg() either. > > > > > > This is getting a bit too complicated. Instead of abusing LOG_PERROR, > > > define an internal logging flag that clearly represents that we're not > > > done with the initialisation phase yet. > > > > > > If this flag is not set, make sure we always print to stderr, if the > > > log mask matches. Then, set LOG_PERROR only as we set this internal > > > flag, to make sure we don't duplicate messages. > > > > > > Reported-by: Yalan Zhang > > > Signed-off-by: Stefano Brivio > > > --- > > > log.c | 4 +++- > > > log.h | 1 + > > > passt.1 | 3 ++- > > > passt.c | 17 ++++++++++------- > > > 4 files changed, 16 insertions(+), 9 deletions(-) > > > > > > diff --git a/log.c b/log.c > > > index 3b5a1c6..939bb93 100644 > > > --- a/log.c > > > +++ b/log.c > > > @@ -49,6 +49,7 @@ int log_trace; /* --trace mode enabled */ > > > void vlogmsg(int pri, const char *format, va_list ap) > > > { > > > bool debug_print = (log_mask & LOG_MASK(LOG_DEBUG)) && log_file == -1; > > > + bool before_daemon = !(log_flags & LOG_FLAG_DAEMON_READY); > > > > As in 2/6 would just a global bool be simpler than flags. > > > > > bool early_print = !(log_flags & LOG_FLAG_CONF_PARSED); > > > struct timespec tp; > > > > > > @@ -71,7 +72,8 @@ void vlogmsg(int pri, const char *format, va_list ap) > > > va_end(ap2); > > > } > > > > > > - if (debug_print || (early_print && !(log_opt & LOG_PERROR))) { > > > + if (debug_print || early_print || > > > + (before_daemon && (log_mask & LOG_MASK(LOG_PRI(pri))))) { > > > (void)vfprintf(stderr, format, ap); > > > if (format[strlen(format)] != '\n') > > > fprintf(stderr, "\n"); > > > diff --git a/log.h b/log.h > > > index 6a3224a..680baab 100644 > > > --- a/log.h > > > +++ b/log.h > > > @@ -10,6 +10,7 @@ > > > #include > > > > > > #define LOG_FLAG_CONF_PARSED BIT(0) /* We already parsed logging options */ > > > +#define LOG_FLAG_DAEMON_READY BIT(1) /* Daemonised, or ready in foreground */ > > > > > > #define LOGFILE_SIZE_DEFAULT (1024 * 1024UL) > > > #define LOGFILE_CUT_RATIO 30 /* When full, cut ~30% size */ > > > diff --git a/passt.1 b/passt.1 > > > index 3a23a43..31e528e 100644 > > > --- a/passt.1 > > > +++ b/passt.1 > > > @@ -99,7 +99,8 @@ terminal, and to both system logger and standard error otherwise. > > > > > > .TP > > > .BR \-l ", " \-\-log-file " " \fIPATH\fR > > > -Log to file \fIPATH\fR, not to standard error, and not to the system logger. > > > +Log to file \fIPATH\fR, not to standard error (once initialisation is complete), > > > +and not to the system logger. > > > > IIUC when -l is set we'll log to the logfile _as well as_ stderr > > before we daemonize. The description above doesn't exactly contradict > > that, but seems to imply something different. > > Is that because "(once initialisation is complete)" doesn't clearly > refer to "not to standard error"? Yes, or rather that it's not entirely clear it refers *only* to that clause and not to the "Log to file" part at the beginning. > I could go with something slightly more verbose: > > Log to file \fIPATH\fR, not to standard error, and not to the system > logger. > > During initialisation phase, that is, before forking to background, > or before being ready for communication when running in foreground, > messages are always printed to standard error as well. Hrm... so I want to say: Log to file PATH instead of to system logger. Which may not be totally accurate for the current behaviour... but seems like it might be a sensible behaviour. That is, we typically log to syslog, but -l replaces it with a logfile. Regardless of which, under some circumstances we'll also log to stderr. -- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson