On Wed, Jun 19, 2024 at 10:17:21AM +0200, Stefano Brivio wrote: > On Wed, 19 Jun 2024 12:10:38 +1000 > David Gibson wrote: > > > 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. > > No, not really: it's not regardless of that. If the log file is given, > we don't want to log to standard error (once we're up and running) But... why? -- 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