obmc-console: syslog handler support high precise timestamp
Add syslog_ts_high_precision configuration for syslog handler to support
syslog timestamp accurate to 100ms.
Tested:
run command
for i in {1..10}; do echo test ${i}; usleep 200000; done
high precise timestamp enabled get log as following in different seconds
```
Nov 13 16:53:41.395962 mvt19-nfd11.prod.google.com n1[20712]: test 1
Nov 13 16:53:41.567652 mvt19-nfd11.prod.google.com n1[20712]: test 2
Nov 13 16:53:41.826274 mvt19-nfd11.prod.google.com n1[20712]: test 3
Nov 13 16:53:41.998670 mvt19-nfd11.prod.google.com n1[20712]: test 4
Nov 13 16:53:42.171093 mvt19-nfd11.prod.google.com n1[20712]: test 5
Nov 13 16:53:42.429577 mvt19-nfd11.prod.google.com n1[20712]: test 6
Nov 13 16:53:42.602563 mvt19-nfd11.prod.google.com n1[20712]: test 7
Nov 13 16:53:42.774245 mvt19-nfd11.prod.google.com n1[20712]: test 8
Nov 13 16:53:43.032813 mvt19-nfd11.prod.google.com n1[20712]: test 9
Nov 13 16:53:43.207131 mvt19-nfd11.prod.google.com n1[20712]: test 10
```
w/o enable it get log as following in one second
```
Nov 13 16:53:54.875536 mvt19-nfd11.prod.google.com n2[20682]: test 1
Nov 13 16:53:54.875570 mvt19-nfd11.prod.google.com n2[20682]: test 2
Nov 13 16:53:54.875611 mvt19-nfd11.prod.google.com n2[20682]: test 3
Nov 13 16:53:54.875640 mvt19-nfd11.prod.google.com n2[20682]: test 4
Nov 13 16:53:54.875668 mvt19-nfd11.prod.google.com n2[20682]: test 5
Nov 13 16:53:54.875695 mvt19-nfd11.prod.google.com n2[20682]: test 6
Nov 13 16:53:54.875722 mvt19-nfd11.prod.google.com n2[20682]: test 7
Nov 13 16:53:54.875754 mvt19-nfd11.prod.google.com n2[20682]: test 8
Nov 13 16:53:54.875781 mvt19-nfd11.prod.google.com n2[20682]: test 9
Nov 13 16:53:54.875807 mvt19-nfd11.prod.google.com n2[20682]: test 10
```
http://fusion2/bad995d8-fbac-3e16-935c-4d16829860d0
Google-Bug-Id: 330467754
Change-Id: Id46b85ef7c60dc26942e5a5da277d1fc22b6da06
Signed-off-by: Dan Zhang <zhdaniel@google.com>
diff --git a/recipes-phosphor/console/obmc-console/0001-Add-syslog-handler.patch b/recipes-phosphor/console/obmc-console/0001-Add-syslog-handler.patch
index 53715a2..775df9e 100644
--- a/recipes-phosphor/console/obmc-console/0001-Add-syslog-handler.patch
+++ b/recipes-phosphor/console/obmc-console/0001-Add-syslog-handler.patch
@@ -1,7 +1,7 @@
-From c1c9e1e782bac752adb9ae7ed4c930d17db933be Mon Sep 17 00:00:00 2001
+From 509ae06211e5ccae426b7d1c997779fc857328b1 Mon Sep 17 00:00:00 2001
From: Dan Zhang <zhdaniel@google.com>
Date: Mon, 20 May 2024 22:02:21 +0000
-Subject: [PATCH 1/2] Add syslog-handler
+Subject: [PATCH 1/3] Add syslog-handler
Log the console data to syslog when syslogid configured.
Will buffer small piece of data to avoid overwhelming the syslog with
@@ -15,8 +15,8 @@
Signed-off-by: Dan Zhang <zhdaniel@google.com>
---
meson.build | 1 +
- syslog-handler.c | 215 +++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 216 insertions(+)
+ syslog-handler.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 228 insertions(+)
create mode 100644 syslog-handler.c
diff --git a/meson.build b/meson.build
@@ -33,10 +33,10 @@
c_args: [
diff --git a/syslog-handler.c b/syslog-handler.c
new file mode 100644
-index 0000000..a410dae
+index 0000000..7d1603f
--- /dev/null
+++ b/syslog-handler.c
-@@ -0,0 +1,215 @@
+@@ -0,0 +1,227 @@
+/**
+ * Copyright © 2024 Google
+ *
@@ -73,15 +73,18 @@
+
+/* syslog data buffering size threshold 1KB */
+#define SYSLOG_HANDLER_BUF_SIZE_THRESHOLD 1024
-+/* syslog data buffering time threshold 1s */
-+#define SYSLOG_HANDLER_BUF_TIME_THRESHOLD_SEC 1
+
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
-+static struct timeval const syslog_handler_timeout = {
-+ .tv_sec = SYSLOG_HANDLER_BUF_TIME_THRESHOLD_SEC,
++static struct timeval const syslog_ts_low_precision = {
++ .tv_sec = 1,
+ .tv_usec = 0,
+};
++static struct timeval const syslog_ts_high_precision = {
++ .tv_sec = 0,
++ .tv_usec = 100000, /* 100 ms */
++};
++static struct timeval const *syslog_handler_timeout = &syslog_ts_low_precision;
+
+struct syslog_handler {
+ struct handler handler;
@@ -152,7 +155,8 @@
+ }
+}
+
-+static enum ringbuffer_poll_ret syslog_ringbuffer_poll(void *arg, size_t force_len)
++static enum ringbuffer_poll_ret syslog_ringbuffer_poll(void *arg,
++ size_t force_len)
+{
+ struct syslog_handler *lh = arg;
+ size_t len;
@@ -168,7 +172,7 @@
+ /* Buffer the console data unitl more than 1K or idle 1 second
+ to push the data to syslog */
+ console_poller_set_timeout(lh->console, lh->poller,
-+ &syslog_handler_timeout);
++ syslog_handler_timeout);
+ return RINGBUFFER_POLL_OK;
+ }
+ syslog_drain_queue(lh, len);
@@ -199,6 +203,7 @@
+{
+ struct syslog_handler *lh = to_syslog_handler(handler);
+ const char *syslogid;
++ const char *ts_high_precision;
+
+ lh->console = console;
+ lh->poller = NULL;
@@ -212,6 +217,13 @@
+ return -1;
+ }
+
++ syslog_handler_timeout = &syslog_ts_low_precision;
++ ts_high_precision =
++ config_get_value(config, "syslog_ts_high_precision");
++ if (ts_high_precision && !strcasecmp(ts_high_precision, "true")) {
++ syslog_handler_timeout = &syslog_ts_high_precision;
++ }
++
+ /* regsiter console_poller used for timeout only so create a dummy pipe */
+ if (pipe(lh->pipefd) == -1) {
+ warn("syslog handler create pipe failed");
@@ -225,8 +237,8 @@
+ accum_timeout, lh->pipefd[0], 0,
+ NULL);
+
-+ lh->rbc = console_ringbuffer_consumer_register(console,
-+ syslog_ringbuffer_poll, lh);
++ lh->rbc = console_ringbuffer_consumer_register(
++ console, syslog_ringbuffer_poll, lh);
+
+ return 0;
+}
@@ -253,5 +265,5 @@
+
+console_handler_register(&syslog_handler.handler);
--
-2.45.1.288.g0e0cd299f1-goog
+2.47.0.338.g60cca15819-goog