From patchwork Tue Oct 5 13:56:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 45894 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2803B385AC3D for ; Tue, 5 Oct 2021 14:02:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2803B385AC3D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1633442526; bh=giEnArJ9sPefHfpWpeXII0wIdougBvvLHhQ3/nOtSvY=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=qQls0T/23A7kTqJcEn9GlJgPaeg0Cn2gxjT7CKJY1R1CtAi7gX5N0FpBxEVdk+tvY Vq2gnmA40Uw0xk9AcATa4Z3bfoIlOSe/DTItR8NrEmeOmNE6/75kn2IAgQpNAF8mfK 6I5IrjyzKgJzTez6Ge+9mU/izkw3M5j629YjKjC0= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-vk1-xa2a.google.com (mail-vk1-xa2a.google.com [IPv6:2607:f8b0:4864:20::a2a]) by sourceware.org (Postfix) with ESMTPS id 3F3D2385840B for ; Tue, 5 Oct 2021 13:56:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3F3D2385840B Received: by mail-vk1-xa2a.google.com with SMTP id b67so9314389vkb.13 for ; Tue, 05 Oct 2021 06:56:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=giEnArJ9sPefHfpWpeXII0wIdougBvvLHhQ3/nOtSvY=; b=VuOPiktNQQMZVT8LP3egskGov5MfSy4kQCBYzSroXJ3eCCubZXTTxOhc+la7rocpwU Gm58poCLm/5BHswkUJCe+UklwfAXeYA8PeTfuczxu7hDPaH6Vpuj5Bp9PbKncXj/3tfd 0nM+y9ktwDJw5MTGxVCK+E20XwBk8H9xRm6g2c472BSFJIWuCY5LWoJno6Ouo95Sm/dl H2YAQXZVflFTO8wS6ULZiuUKqAIYDEYZB8SjxE1WhMMMSfFwxIf3Ntlb5aiBCId2tPNL qB2hNpB8TUwwPPf7LPl/xteF8xGd4Bu603tf6v1jZ8P5gA1iIiPByceZqm1f+/utzyk0 sV6Q== X-Gm-Message-State: AOAM532+0qpH/Ba6OlIhQ0ogxEUttkXuVZdJuSIp0FYA5dOgEhFL903/ ogYPu3f4lF2GRwo0BffDzjOFs7Xow3ahUg== X-Google-Smtp-Source: ABdhPJyotS0O9fwgvakg1tZyWUkzOG3lVjgkl7jVGyWuEtOoffOva1NnJUBGvDZArJuuLgZrM+lljg== X-Received: by 2002:ac5:cfd0:: with SMTP id m16mr13949532vkf.7.1633442202442; Tue, 05 Oct 2021 06:56:42 -0700 (PDT) Received: from birita.. ([2804:431:c7cb:807a:9735:fcf:f170:1c20]) by smtp.gmail.com with ESMTPSA id g204sm3204902vkg.1.2021.10.05.06.56.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Oct 2021 06:56:42 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 7/7] misc: syslog: Use RFC5424 Date: Tue, 5 Oct 2021 10:56:31 -0300 Message-Id: <20211005135631.3209020-8-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211005135631.3209020-1-adhemerval.zanella@linaro.org> References: <20211005135631.3209020-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_NUMSUBJECT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Current syslog format provides limited timestamp information (not full year information nor microsecond precision) and the timezone information might incur in confusion [1] since there is no metadata information on how it was generated. So instead of using another ad-hoc syslog format, this patch adapts it to follow RFC5424: - VERSION is set as 1. - TIMESTAMP is logged as described by RFC 3339 using UTC ('Z') with maximum allowed TIME-SECFRAC precision (microseconds). - HOSTNAME is obtained with gethostname (as allowed by the RFC). - PROCID is only set if LOG_PID is previously set by openlog. - MSGID and STRUCTURED-DATA are both set to NILVALUE. Checked on x86_64-linux-gnu. [1] https://sourceware.org/pipermail/libc-alpha/2021-March/123583.html --- misc/syslog.c | 69 ++++++++++++++++++++++++++++++++--------------- misc/tst-syslog.c | 28 +++++++++---------- 2 files changed, 60 insertions(+), 37 deletions(-) diff --git a/misc/syslog.c b/misc/syslog.c index 99fa595b40..6ad9452c8a 100644 --- a/misc/syslog.c +++ b/misc/syslog.c @@ -42,6 +42,10 @@ static char sccsid[] = "@(#)syslog.c 8.4 (Berkeley) 3/18/94"; #include #include +#ifndef HOST_NAME_MAX +# define HOST_NAME_MAX 64 +#endif + static int LogType = SOCK_DGRAM; /* type of socket connection */ static int LogFile = -1; /* fd for log */ static bool connected; /* have done connect */ @@ -117,6 +121,31 @@ __vsyslog_chk(int pri, int flag, const char *fmt, va_list ap) __vsyslog_internal (pri, fmt, ap, (flag > 0) ? PRINTF_FORTIFY : 0); } +/* Defined by RFC5424. */ +#define NILVALUE "-" + +struct timebuf_t +{ + char b[sizeof ("YYYY-MM-DDThh:mm:ss.nnnnnnZ")]; +}; + +/* Fill TIMEBUF with a RFC3339 timestamp. Use UTC time and maximum + TIME-SECFRAC accurancy allowed (6 digits for microseconds). */ +static void +syslog_rfc3339_timestamp (struct timebuf_t *timebuf) +{ + struct __timespec64 ts; + __clock_gettime64 (TIME_CLOCK_GETTIME_CLOCKID, &ts); + struct tm now_tm; + __gmtime64_r (&ts.tv_sec, &now_tm); + + __snprintf (timebuf->b, sizeof (timebuf->b), + "%04d-%02d-%02dT%02d:%02d:%02d.%06dZ", + now_tm.tm_year + 1900, now_tm.tm_mon + 1, now_tm.tm_mday, + now_tm.tm_hour, now_tm.tm_min, now_tm.tm_sec, + (int32_t) ts.tv_nsec / 1000); +} + void __vsyslog_internal(int pri, const char *fmt, va_list ap, unsigned int mode_flags) @@ -149,35 +178,31 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, if ((pri & LOG_FACMASK) == 0) pri |= LogFacility; - pid_t pid = LogStat & LOG_PID ? __getpid () : 0; - enum - { - timebuf_size = 3+1 /* "%h " */ - + 2+1 /* "%e " */ - + 2+1 + 2+1 + 2+1 + 1, /* "%T " */ + struct timebuf_t timestamp; + syslog_rfc3339_timestamp (×tamp); - bufs_size = 1024 - }; + char hostname[HOST_NAME_MAX]; + if (__gethostname (hostname, sizeof (hostname)) == -1) + strcpy (hostname, NILVALUE); - /* "%h %e %H:%M:%S " */ - char timestamp[timebuf_size]; - time_t now = time_now (); - struct tm now_tm; - __localtime_r (&now, &now_tm); - __strftime_l (timestamp, sizeof (timestamp), "%h %e %T ", &now_tm, - _nl_C_locobj_ptr); + pid_t pid = LogStat & LOG_PID ? __getpid () : 0; -#define SYSLOG_HEADER(__pri, __timestamp, __msgoff, pid) \ - "<%d>%s %n%s%s%.0d%s: ", \ - __pri, __timestamp, __msgoff, \ - LogTag == NULL ? __progname : LogTag, \ - pid != 0 ? "[" : "", pid, pid != 0 ? "]" : "" +#define SYSLOG_HEADER(__pri, __timestamp, __msgoff, __hostname, __pid) \ + "<%d>1 %s %n%s %s %s%.0d %s %s ", \ + __pri, /* PRI */ \ + __timestamp.b, /* TIMESTAMP */ \ + __msgoff, __hostname, /* HOSTNAME */ \ + LogTag == NULL ? __progname : LogTag, /* APP-NAME */ \ + NILVALUE + !!__pid, __pid, /* PROCID */ \ + NILVALUE, /* MSGID */ \ + NILVALUE /* STRUCT-DATA */ /* Try to use a static buffer as an optimization. */ + enum { bufs_size = 1024 }; char bufs[bufs_size]; int l = __snprintf (bufs, sizeof bufs, - SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + SYSLOG_HEADER (pri, timestamp, &msgoff, hostname, pid)); if (l < sizeof (bufs)) { va_list apc; @@ -205,7 +230,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap, if (f != NULL) { __fsetlocking (f, FSETLOCKING_BYCALLER); - fprintf (f, SYSLOG_HEADER (pri, timestamp, &msgoff, pid)); + fprintf (f, SYSLOG_HEADER (pri, timestamp, &msgoff, hostname, pid)); /* Restore errno for %m format. */ __set_errno (saved_errno); __vfprintf_internal (f, fmt, ap, mode_flags); diff --git a/misc/tst-syslog.c b/misc/tst-syslog.c index 168fb72ebc..5d8737129b 100644 --- a/misc/tst-syslog.c +++ b/misc/tst-syslog.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -201,7 +202,7 @@ check_openlog_message (const struct msg_t *msg, int msgnum, { if (options & LOG_PID) TEST_COMPARE (msg->pid, pid); - TEST_COMPARE_STRING (msg->ident, expected_ident); + TEST_COMPARE_STRING (msg->ident, OPENLOG_IDENT); TEST_COMPARE (msg->facility, LOG_LOCAL0); } else if (msgnum < 2 * array_length (priorities)) @@ -212,28 +213,25 @@ check_openlog_message (const struct msg_t *msg, int msgnum, return true; } +#define NILVALUE "-" + static struct msg_t parse_syslog_msg (const char *msg) { struct msg_t r = { .pid = -1 }; int number; + char procid[INT_BUFSIZE_BOUND (pid_t)]; /* The message in the form: <179>Apr 8 14:51:19 tst-syslog: syslog message 176 3 */ - int n = sscanf (msg, "<%3d>%*s %*d %*d:%*d:%*d %32s %64s %*d %*d", - &number, r.ident, r.msg); - TEST_COMPARE (n, 3); + int n = sscanf (msg, "<%6d>1 %*s %*s %32s %s - - %s", + &number, r.ident, procid, r.msg); + TEST_COMPARE (n, 4); r.facility = number & LOG_FACMASK; r.priority = number & LOG_PRIMASK; - char *pid_start = strchr (r.ident, '['); - if (pid_start != NULL) - { - char *pid_end = strchr (r.ident, ']'); - if (pid_end != NULL) - r.pid = strtoul (pid_start + 1, NULL, 10); - } + r.pid = strcmp (procid, NILVALUE) == 0 ? 0 : strtoul (procid, NULL, 10); return r; } @@ -246,9 +244,9 @@ parse_syslog_console (const char *msg) struct msg_t r; /* The message in the form: - openlog_ident: syslog_message 128 0 */ - int n = sscanf (msg, "%32s %64s %d %d", - r.ident, r.msg, &facility, &priority); + mymachine openlog_ident PID - syslog_message 128 0 */ + int n = sscanf (msg, "%*s %32s %*s - - %s %d %d", + r.ident, r.msg, &facility, &priority); TEST_COMPARE (n, 4); r.facility = facility; @@ -384,7 +382,7 @@ check_syslog_console_read (FILE *fp) while (fgets (buf, sizeof (buf), fp) != NULL) { struct msg_t msg = parse_syslog_console (buf); - TEST_COMPARE_STRING (msg.ident, OPENLOG_IDENT ":"); + TEST_COMPARE_STRING (msg.ident, OPENLOG_IDENT); TEST_COMPARE (msg.priority, priorities[msgnum]); TEST_COMPARE (msg.facility, LOG_LOCAL0);