]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
logger: always update header when read from stdin
authorKarel Zak <kzak@redhat.com>
Tue, 1 Nov 2022 09:30:06 +0000 (10:30 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 1 Nov 2022 09:30:06 +0000 (10:30 +0100)
The current code updates the header only when the priority has been
changed. It's incorrect because wanted is a valid header or each entry
(don't forget that logger for stdin use-case is used in pipe to log
long-time running processes).

This patch also fixes the initial timestamp; it was originally generated
on logger startup, it now generates the header on the first message.

$ (sleep 2; date; sleep 2; date; sleep 2; date) | logger --stderr --no-act

old:
<13>Nov  1 10:42:14 kzak: Tue Nov  1 10:42:16 AM CET 2022
<13>Nov  1 10:42:14 kzak: Tue Nov  1 10:42:18 AM CET 2022
<13>Nov  1 10:42:14 kzak: Tue Nov  1 10:42:20 AM CET 2022

new:
<13>Nov  1 10:19:02 kzak: Tue Nov  1 10:19:02 AM CET 2022
<13>Nov  1 10:19:04 kzak: Tue Nov  1 10:19:04 AM CET 2022
<13>Nov  1 10:19:06 kzak: Tue Nov  1 10:19:06 AM CET 2022

Fixes: https://github.com/util-linux/util-linux/issues/1866
Signed-off-by: Karel Zak <kzak@redhat.com>
misc-utils/logger.c

index bec684f15b7862cdc8f0c7629f5d110569bc82bf..e2b0b41abe853a9e46f3b130033b2f9c9cda1207 100644 (file)
@@ -945,8 +945,6 @@ static void logger_open(struct logger_ctl *ctl)
                ctl->tag = ctl->login = xgetlogin();
        if (!ctl->tag)
                ctl->tag = "<someone>";
-
-       generate_syslog_header(ctl);
 }
 
 /* re-open; usually after failed connection */
@@ -996,10 +994,8 @@ static void logger_stdin(struct logger_ctl *ctl)
 {
        /* note: we re-generate the syslog header for each log message to
         * update header timestamps and to reflect possible priority changes.
-        * The initial header is generated by logger_open().
         */
        int default_priority = ctl->pri;
-       int last_pri = default_priority;
        char *buf = xmalloc(ctl->max_message_size + 2 + 2);
        int pri;
        int c;
@@ -1026,10 +1022,6 @@ static void logger_stdin(struct logger_ctl *ctl)
                        } else
                                ctl->pri = default_priority;
 
-                       if (ctl->pri != last_pri) {
-                               generate_syslog_header(ctl);
-                               last_pri = ctl->pri;
-                       }
                        if (c != EOF && c != '\n')
                                c = getchar();
                }
@@ -1040,8 +1032,10 @@ static void logger_stdin(struct logger_ctl *ctl)
                }
                buf[i] = '\0';
 
-               if (i > 0 || !ctl->skip_empty_lines)
+               if (i > 0 || !ctl->skip_empty_lines) {
+                       generate_syslog_header(ctl);
                        write_output(ctl, buf);
+               }
 
                if (c == '\n')  /* discard line terminator */
                        c = getchar();
@@ -1317,12 +1311,14 @@ int main(int argc, char **argv)
                abort();
        }
        logger_open(&ctl);
-       if (0 < argc)
+       if (0 < argc) {
+               generate_syslog_header(&ctl);
                logger_command_line(&ctl, argv);
-       else
+       else
                /* Note. --file <arg> reopens stdin making the below
                 * function to be used for file inputs. */
                logger_stdin(&ctl);
+
        logger_close(&ctl);
        return EXIT_SUCCESS;
 }