DPDK patches and discussions
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>,
	Bruce Richardson <bruce.richardson@intel.com>,
	Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,
	Tyler Retzlaff <roretzla@linux.microsoft.com>,
	Pallavi Kadam <pallavi.kadam@intel.com>
Subject: [PATCH v14 12/15] log: add timestamp option
Date: Tue, 26 Mar 2024 10:34:32 -0700	[thread overview]
Message-ID: <20240326173552.97249-13-stephen@networkplumber.org> (raw)
In-Reply-To: <20240326173552.97249-1-stephen@networkplumber.org>

When debugging driver or startup issues, it is useful to have
a timestamp on each message printed. The messages in syslog
already have a timestamp, but often syslog is not available
during testing.

There are multiple timestamp formats similar to Linux dmesg.
The default is time relative since startup (when first
step of logging initialization is done by constructor).
Other alternative formats are delta, ctime, reltime and iso formats.

Example:
$ dpdk-testpmd --log-timestamp -- -i
[     0.008610] EAL: Detected CPU lcores: 8
[     0.008634] EAL: Detected NUMA nodes: 1
[     0.008792] EAL: Detected static linkage of DPDK
[     0.010620] EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
[     0.012618] EAL: Selected IOVA mode 'VA'
[     0.016675] testpmd: No probed ethernet devices
Interactive-mode selected

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_eal_flags.c           |  26 ++++
 doc/guides/prog_guide/log_lib.rst   |  26 ++++
 lib/eal/common/eal_common_options.c |  14 ++-
 lib/eal/common/eal_options.h        |   2 +
 lib/eal/freebsd/eal.c               |   6 +-
 lib/eal/linux/eal.c                 |   4 +-
 lib/eal/windows/eal.c               |   4 +-
 lib/log/log.c                       | 183 +++++++++++++++++++++++++++-
 lib/log/log_internal.h              |   9 ++
 lib/log/version.map                 |   1 +
 10 files changed, 268 insertions(+), 7 deletions(-)

diff --git a/app/test/test_eal_flags.c b/app/test/test_eal_flags.c
index 36e3185a10..e54f6e8b7f 100644
--- a/app/test/test_eal_flags.c
+++ b/app/test/test_eal_flags.c
@@ -1054,6 +1054,19 @@ test_misc_flags(void)
 	const char * const argv22[] = {prgname, prefix, mp_flag,
 				       "--huge-worker-stack=512"};
 
+	/* Try running with --log-timestamp */
+	const char * const argv23[] = {prgname, prefix, mp_flag,
+				       "--log-timestamp" };
+
+	/* Try running with --log-timestamp=iso */
+	const char * const argv24[] = {prgname, prefix, mp_flag,
+				       "--log-timestamp=iso" };
+
+	/* Try running with invalid timestamp */
+	const char * const argv25[] = {prgname, prefix, mp_flag,
+				       "--log-timestamp=invalid" };
+
+
 	/* run all tests also applicable to FreeBSD first */
 
 	if (launch_proc(argv0) == 0) {
@@ -1161,6 +1174,19 @@ test_misc_flags(void)
 		printf("Error - process did not run ok with --huge-worker-stack=size parameter\n");
 		goto fail;
 	}
+	if (launch_proc(argv23) != 0) {
+		printf("Error - process did not run ok with --log-timestamp parameter\n");
+		goto fail;
+	}
+	if (launch_proc(argv24) != 0) {
+		printf("Error - process did not run ok with --log-timestamp=iso parameter\n");
+		goto fail;
+	}
+	if (launch_proc(argv25) == 0) {
+		printf("Error - process did run ok with --log-timestamp=invalid parameter\n");
+		goto fail;
+	}
+
 
 	rmdir(hugepath_dir3);
 	rmdir(hugepath_dir2);
diff --git a/doc/guides/prog_guide/log_lib.rst b/doc/guides/prog_guide/log_lib.rst
index ff9d1b54a2..504eefe1d2 100644
--- a/doc/guides/prog_guide/log_lib.rst
+++ b/doc/guides/prog_guide/log_lib.rst
@@ -59,6 +59,32 @@ For example::
 
 Within an application, the same result can be got using the ``rte_log_set_level_pattern()`` or ``rte_log_set_level_regex()`` APIs.
 
+Log timestamp
+~~~~~~~~~~~~~
+
+An optional timestamp can be added before each message
+by adding the ``--log-timestamp`` option.
+For example::
+
+	/path/to/app --log-level=lib.*:debug --log-timestamp
+
+Multiple timestamp alternative timestamp formats are available:
+
+.. csv-table:: Log time stamp format
+   :header: "Format", "Description", "Example"
+   :widths: 6, 30, 32
+
+   "ctime", "Unix ctime", "``[Wed Mar 20 07:26:12 2024]``"
+   "delta", "Offset since last", "``[<    3.162373>]``"
+   "reltime", "Seconds since last or time if minute changed", "``[  +3.001791]`` or ``[Mar20 07:26:12]``"
+   "iso", "ISO-8601", "``[2024-03-20T07:26:12−07:00]``"
+
+To prefix all console messages with ISO format time the syntax is::
+
+	/path/to/app --log-timestamp=iso
+
+
+
 Using Logging APIs to Generate Log Messages
 -------------------------------------------
 
diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c
index 9ab512e8a1..5173835c2c 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -74,6 +74,7 @@ eal_long_options[] = {
 	{OPT_IOVA_MODE,	        1, NULL, OPT_IOVA_MODE_NUM        },
 	{OPT_LCORES,            1, NULL, OPT_LCORES_NUM           },
 	{OPT_LOG_LEVEL,         1, NULL, OPT_LOG_LEVEL_NUM        },
+	{OPT_LOG_TIMESTAMP,     2, NULL, OPT_LOG_TIMESTAMP_NUM    },
 	{OPT_TRACE,             1, NULL, OPT_TRACE_NUM            },
 	{OPT_TRACE_DIR,         1, NULL, OPT_TRACE_DIR_NUM        },
 	{OPT_TRACE_BUF_SIZE,    1, NULL, OPT_TRACE_BUF_SIZE_NUM   },
@@ -1616,6 +1617,7 @@ eal_log_level_parse(int argc, char * const argv[])
 		switch (opt) {
 		case OPT_LOG_LEVEL_NUM:
 		case OPT_SYSLOG_NUM:
+		case OPT_LOG_TIMESTAMP_NUM:
 			if (eal_parse_common_option(opt, optarg, internal_conf) < 0)
 				return -1;
 			break;
@@ -1843,7 +1845,7 @@ eal_parse_common_option(int opt, const char *optarg,
 		break;
 #endif
 
-	case OPT_LOG_LEVEL_NUM: {
+	case OPT_LOG_LEVEL_NUM:
 		if (eal_parse_log_level(optarg) < 0) {
 			EAL_LOG(ERR,
 				"invalid parameters for --"
@@ -1851,7 +1853,14 @@ eal_parse_common_option(int opt, const char *optarg,
 			return -1;
 		}
 		break;
-	}
+
+	case OPT_LOG_TIMESTAMP_NUM:
+		if (eal_log_timestamp(optarg) < 0) {
+			EAL_LOG(ERR, "invalid parameters for --"
+				OPT_LOG_TIMESTAMP);
+			return -1;
+		}
+		break;
 
 #ifndef RTE_EXEC_ENV_WINDOWS
 	case OPT_TRACE_NUM: {
@@ -2216,6 +2225,7 @@ eal_common_usage(void)
 	       "  --"OPT_LOG_LEVEL"=<type-match>:<level>\n"
 	       "                      Set specific log level\n"
 	       "  --"OPT_LOG_LEVEL"=help    Show log types and levels\n"
+	       "  --"OPT_LOG_TIMESTAMP"[=<format>]  Timestamp log output\n"
 #ifndef RTE_EXEC_ENV_WINDOWS
 	       "  --"OPT_TRACE"=<regex-match>\n"
 	       "                      Enable trace based on regular expression trace name.\n"
diff --git a/lib/eal/common/eal_options.h b/lib/eal/common/eal_options.h
index f3f2e104f6..e24c9eca53 100644
--- a/lib/eal/common/eal_options.h
+++ b/lib/eal/common/eal_options.h
@@ -35,6 +35,8 @@ enum {
 	OPT_LCORES_NUM,
 #define OPT_LOG_LEVEL         "log-level"
 	OPT_LOG_LEVEL_NUM,
+#define OPT_LOG_TIMESTAMP     "log-timestamp"
+	OPT_LOG_TIMESTAMP_NUM,
 #define OPT_TRACE             "trace"
 	OPT_TRACE_NUM,
 #define OPT_TRACE_DIR         "trace-dir"
diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
index 55ff27a4da..662a829ce8 100644
--- a/lib/eal/freebsd/eal.c
+++ b/lib/eal/freebsd/eal.c
@@ -392,8 +392,10 @@ eal_parse_args(int argc, char **argv)
 			goto out;
 		}
 
-		/* eal_log_level_parse() already handled these */
-		if (opt == OPT_LOG_LEVEL_NUM || opt == OPT_LOG_SYSLOG_NUM)
+		/* eal_log_level_parse() already handled these options */
+		if (opt == OPT_LOG_LEVEL_NUM ||
+		    opt == OPT_SYSLOG_NUM ||
+		    opt == OPT_LOG_TIMESTAMP_NUM)
 			continue;
 
 		ret = eal_parse_common_option(opt, optarg, internal_conf);
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index b9a0fb1742..8cbea480e0 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -611,7 +611,9 @@ eal_parse_args(int argc, char **argv)
 		}
 
 		/* eal_log_level_parse() already handled these options */
-		if (opt == OPT_LOG_LEVEL_NUM || opt == OPT_SYSLOG_NUM)
+		if (opt == OPT_LOG_LEVEL_NUM ||
+		    opt == OPT_SYSLOG_NUM ||
+		    opt == OPT_LOG_TIMESTAMP_NUM)
 			continue;
 
 		ret = eal_parse_common_option(opt, optarg, internal_conf);
diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c
index e59aba954e..b251dc3e1b 100644
--- a/lib/eal/windows/eal.c
+++ b/lib/eal/windows/eal.c
@@ -121,7 +121,9 @@ eal_parse_args(int argc, char **argv)
 		}
 
 		/* eal_log_level_parse() already handled these options */
-		if (opt == OPT_LOG_LEVEL_NUM || opt == OPT_SYSLOG_NUM)
+		if (opt == OPT_LOG_LEVEL_NUM ||
+		    opt == OPT_SYSLOG_NUM ||
+		    opt == OPT_LOG_TIMESTAMP_NUM)
 			continue;
 
 		ret = eal_parse_common_option(opt, optarg, internal_conf);
diff --git a/lib/log/log.c b/lib/log/log.c
index acd4c320b6..2dca91306e 100644
--- a/lib/log/log.c
+++ b/lib/log/log.c
@@ -11,6 +11,7 @@
 #include <regex.h>
 #include <fnmatch.h>
 #include <sys/queue.h>
+#include <unistd.h>
 
 #include <rte_log.h>
 #include <rte_per_lcore.h>
@@ -18,7 +19,7 @@
 #include "log_internal.h"
 
 #ifdef RTE_EXEC_ENV_WINDOWS
-#define strdup _strdup
+#include <rte_os_shim.h>
 #endif
 
 struct rte_log_dynamic_type {
@@ -26,6 +27,15 @@ struct rte_log_dynamic_type {
 	uint32_t loglevel;
 };
 
+enum eal_log_time_format {
+	EAL_LOG_TIMESTAMP_NONE = 0,
+	EAL_LOG_TIMESTAMP_TIME,		/* time since start */
+	EAL_LOG_TIMESTAMP_DELTA,	/* time since last message */
+	EAL_LOG_TIMESTAMP_RELTIME,
+	EAL_LOG_TIMESTAMP_CTIME,
+	EAL_LOG_TIMESTAMP_ISO,
+};
+
 typedef int (*log_print_t)(FILE *f, uint32_t level, const char *fmt, va_list ap);
 static int log_print(FILE *f, uint32_t level, const char *format, va_list ap);
 
@@ -35,6 +45,11 @@ static struct rte_logs {
 	uint32_t level; /**< Log level. */
 	FILE *file;     /**< Output file set by rte_openlog_stream, or NULL. */
 	log_print_t print_func;
+
+	enum eal_log_time_format time_format;
+	struct timespec started;   /* when log was initialized */
+	struct timespec previous;  /* when last msg was printed */
+
 	size_t dynamic_types_len;
 	struct rte_log_dynamic_type *dynamic_types;
 } rte_logs = {
@@ -375,6 +390,9 @@ RTE_INIT_PRIO(log_init, LOG)
 {
 	uint32_t i;
 
+	clock_gettime(CLOCK_MONOTONIC, &rte_logs.started);
+	rte_logs.previous = rte_logs.started;
+
 	rte_log_set_global_level(RTE_LOG_DEBUG);
 
 	rte_logs.dynamic_types = calloc(RTE_LOGTYPE_FIRST_EXT_ID,
@@ -519,6 +537,152 @@ eal_log_syslog(const char *mode __rte_unused)
 	return -1;
 }
 
+/* Set the log timestamp format */
+int
+eal_log_timestamp(const char *str)
+{
+	if (str == NULL)
+		rte_logs.time_format = EAL_LOG_TIMESTAMP_TIME;
+	else if (strcmp(str, "notime") == 0)
+		rte_logs.time_format = EAL_LOG_TIMESTAMP_NONE;
+	else if (strcmp(str, "reltime") == 0)
+		rte_logs.time_format = EAL_LOG_TIMESTAMP_RELTIME;
+	else if (strcmp(str, "delta") == 0)
+		rte_logs.time_format = EAL_LOG_TIMESTAMP_DELTA;
+	else if (strcmp(str, "ctime") == 0)
+		rte_logs.time_format =  EAL_LOG_TIMESTAMP_CTIME;
+	else if (strcmp(str, "iso") == 0)
+		rte_logs.time_format = EAL_LOG_TIMESTAMP_ISO;
+	else
+		return -1;
+
+	return 0;
+}
+
+/* Subtract two timespec values and handle wraparound */
+static struct timespec
+timespec_sub(const struct timespec *t0, const struct timespec *t1)
+{
+	struct timespec ts;
+
+	ts.tv_sec = t0->tv_sec - t1->tv_sec;
+	ts.tv_nsec = t0->tv_nsec - t1->tv_nsec;
+	if (ts.tv_nsec < 0) {
+		ts.tv_sec--;
+		ts.tv_nsec += 1000000000L;
+	}
+	return ts;
+}
+
+
+/* Format current timespec into ISO8601 format */
+static ssize_t
+format_iso8601(char *tsbuf, size_t tsbuflen, const struct timespec *now)
+{
+	struct tm *tm, tbuf;
+	char dbuf[64]; /* "2024-05-01T22:11:00" */
+	char zbuf[16] = { }; /* "+0800" */
+
+	tm = localtime_r(&now->tv_sec, &tbuf);
+
+	/* make "2024-05-01T22:11:00,123456+0100" */
+	if (strftime(dbuf, sizeof(dbuf), "%Y-%m-%dT%H:%M:%S", tm) == 0)
+		return 0;
+
+	/* convert timezone to +hhmm */
+	if (strftime(zbuf, sizeof(zbuf), "%z", tm) == 0)
+		return 0;
+
+	/* the result for strftime is "+hhmm" but ISO wants "+hh:mm" */
+	return snprintf(tsbuf, tsbuflen, "%s,%06lu%.3s:%.2s",
+			dbuf, now->tv_nsec / 1000u,
+			zbuf, zbuf + 3);
+}
+
+/*
+ * Make a timestamp where if the minute, hour or day has
+ * changed from the last message, then print abbreviated
+ * "Month day hour:minute" format.
+ * Otherwise print delta from last printed message as +sec.usec
+ */
+static ssize_t
+format_reltime(char *tsbuf, size_t tsbuflen, const struct timespec *now)
+{
+	struct tm *tm, tbuf;
+	static struct tm last_tm;
+	struct timespec delta;
+
+	tm = localtime_r(&now->tv_sec, &tbuf);
+	delta = timespec_sub(now, &rte_logs.previous);
+	rte_logs.previous = *now;
+
+	/* if minute, day, hour hasn't changed then print delta */
+	if (tm->tm_min != last_tm.tm_min ||
+	    tm->tm_hour != last_tm.tm_hour ||
+	    tm->tm_yday != last_tm.tm_yday) {
+		last_tm = *tm;
+		return strftime(tsbuf, tsbuflen, "%b%d %H:%M", tm);
+	} else {
+		return snprintf(tsbuf, tsbuflen, "+%3lu.%06lu",
+				(unsigned long)delta.tv_sec,
+				(unsigned long)delta.tv_nsec / 1000u);
+	}
+}
+
+/* Format up a timestamp based on current format */
+static ssize_t
+format_timestamp(char *tsbuf, size_t tsbuflen)
+{
+	struct timespec now, delta;
+
+	switch (rte_logs.time_format) {
+	case EAL_LOG_TIMESTAMP_NONE:
+		return 0;
+
+	case EAL_LOG_TIMESTAMP_TIME:
+		if (clock_gettime(CLOCK_MONOTONIC, &now) < 0)
+			return 0;
+
+		delta = timespec_sub(&now, &rte_logs.started);
+
+		return snprintf(tsbuf, tsbuflen, "%6lu.%06lu",
+				(unsigned long)delta.tv_sec,
+				(unsigned long)delta.tv_nsec / 1000u);
+
+	case EAL_LOG_TIMESTAMP_DELTA:
+		if (clock_gettime(CLOCK_MONOTONIC, &now) < 0)
+			return 0;
+
+		delta = timespec_sub(&now, &rte_logs.previous);
+		rte_logs.previous = now;
+
+		return snprintf(tsbuf, tsbuflen, "<%6lu.%06lu>",
+				(unsigned long)delta.tv_sec,
+				(unsigned long)delta.tv_nsec / 1000u);
+
+	case EAL_LOG_TIMESTAMP_RELTIME:
+		if (clock_gettime(CLOCK_REALTIME, &now) < 0)
+			return 0;
+
+		return format_reltime(tsbuf, tsbuflen, &now);
+
+	case EAL_LOG_TIMESTAMP_CTIME:
+		if (clock_gettime(CLOCK_REALTIME, &now) < 0)
+			return 0;
+
+		/* trncate to remove newline from ctime result */
+		return snprintf(tsbuf, tsbuflen, "%.24s", ctime(&now.tv_sec));
+
+	case EAL_LOG_TIMESTAMP_ISO:
+		if (clock_gettime(CLOCK_REALTIME, &now) < 0)
+			return 0;
+
+		return format_iso8601(tsbuf, tsbuflen, &now);
+	}
+
+	return 0;
+}
+
 /* default log print function */
 __rte_format_printf(3, 0)
 static int
@@ -528,12 +692,29 @@ log_print(FILE *f, uint32_t level __rte_unused,
 	return vfprintf(f, format, ap);
 }
 
+/* print timestamp before message */
+__rte_format_printf(3, 0)
+static int
+log_print_with_timestamp(FILE *f, uint32_t level,
+			 const char *format, va_list ap)
+{
+	char tsbuf[128];
+
+	if (format_timestamp(tsbuf, sizeof(tsbuf)) > 0)
+		fprintf(f, "[%s] ", tsbuf);
+
+	return log_print(f, level, format, ap);
+}
+
 /*
  * Called by rte_eal_init
  */
 void
 eal_log_init(const char *id __rte_unused)
 {
+	if (rte_logs.time_format != EAL_LOG_TIMESTAMP_NONE)
+		rte_logs.print_func = log_print_with_timestamp;
+
 	default_log_stream = stderr;
 
 #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
diff --git a/lib/log/log_internal.h b/lib/log/log_internal.h
index 3c46328e7b..7c7d44eed2 100644
--- a/lib/log/log_internal.h
+++ b/lib/log/log_internal.h
@@ -5,8 +5,10 @@
 #ifndef LOG_INTERNAL_H
 #define LOG_INTERNAL_H
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdint.h>
+#include <time.h>
 
 #include <rte_compat.h>
 
@@ -39,4 +41,11 @@ const char *eal_log_level2str(uint32_t level);
 __rte_internal
 void rte_eal_log_cleanup(void);
 
+/*
+ * Add timestamp to console logs
+ */
+__rte_internal
+int eal_log_timestamp(const char *fmt);
+
+
 #endif /* LOG_INTERNAL_H */
diff --git a/lib/log/version.map b/lib/log/version.map
index 32b9680c31..14d6681a5f 100644
--- a/lib/log/version.map
+++ b/lib/log/version.map
@@ -30,5 +30,6 @@ INTERNAL {
 	eal_log_save_pattern;
 	eal_log_save_regexp;
 	eal_log_syslog;
+	eal_log_timestamp;
 	rte_eal_log_cleanup;
 };
-- 
2.43.0


  parent reply	other threads:[~2024-03-26 17:37 UTC|newest]

Thread overview: 255+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-14 17:34 [dpdk-dev] [PATCH] eal: add option to put timestamp on console output Stephen Hemminger
2020-08-14 18:39 ` Dmitry Kozlyuk
2020-08-14 18:45   ` Stephen Hemminger
2020-08-14 19:09     ` Dmitry Kozlyuk
2020-08-14 19:20       ` Stephen Hemminger
2020-08-17 10:37         ` Bruce Richardson
2020-08-17 15:11           ` Stephen Hemminger
2020-10-19 14:11             ` Thomas Monjalon
2020-10-19 15:25               ` Stephen Hemminger
2024-03-21 17:22                 ` Thomas Monjalon
2023-03-06 18:18 ` [PATCH v2 0/2] Add option to timestamp console log Stephen Hemminger
2023-03-06 18:18   ` [PATCH v2 1/2] eal: unify logging code for FreeBsd and Linux Stephen Hemminger
2023-03-06 18:18   ` [PATCH v2 2/2] eal: add option to put timestamp on console output Stephen Hemminger
2023-03-07  9:09   ` [PATCH v2 0/2] Add option to timestamp console log Bruce Richardson
2023-03-06 19:28 ` [PATCH v3 " Stephen Hemminger
2023-03-06 19:28   ` [PATCH v3 1/2] eal: unify logging code for FreeBsd and Linux Stephen Hemminger
2023-03-06 19:28   ` [PATCH v3 2/2] eal: add option to put timestamp on console output Stephen Hemminger
2023-03-07  9:35     ` fengchengwen
2023-03-07 16:05       ` Stephen Hemminger
2023-03-07 16:06       ` Stephen Hemminger
2023-03-08  0:36         ` fengchengwen
2023-03-08  2:03           ` Stephen Hemminger
2023-03-09  0:55             ` fengchengwen
2023-03-08  2:51           ` Stephen Hemminger
2023-03-07  7:33   ` [PATCH v3 0/2] Add option to timestamp console log Morten Brørup
2023-03-07  9:12     ` Bruce Richardson
2023-03-07 16:04     ` Stephen Hemminger
2023-06-26 18:42 ` [PATCH v4 0/5] Logging related patchs Stephen Hemminger
2023-06-26 18:42   ` [PATCH v4 1/5] eal: unify logging code for FreeBsd and Linux Stephen Hemminger
2023-06-26 18:42   ` [PATCH v4 2/5] eal: turn off getopt_long error message during eal_log_level Stephen Hemminger
2023-06-26 18:42   ` [PATCH v4 3/5] eal: skip stdio on console logging Stephen Hemminger
2023-06-26 18:42   ` [PATCH v4 4/5] eal: move logging initialization earlier Stephen Hemminger
2023-06-26 18:42   ` [PATCH v4 5/5] eal: add option to put timestamp on console output Stephen Hemminger
2023-06-27  7:40   ` [PATCH v4 0/5] Logging related patchs Morten Brørup
2023-06-27 14:49     ` Stephen Hemminger
2023-06-27 15:04       ` Morten Brørup
2023-06-27 15:02     ` Bruce Richardson
2023-06-28 17:58 ` [PATCH v5 0/6] Logging related patches Stephen Hemminger
2023-06-28 17:58   ` [PATCH v5 1/6] eal: unify logging code for FreeBsd and Linux Stephen Hemminger
2023-06-28 17:58   ` [PATCH v5 2/6] eal: turn off getopt_long error message during eal_log_level Stephen Hemminger
2023-06-28 17:58   ` [PATCH v5 3/6] eal: fix handling of syslog facility Stephen Hemminger
2023-06-28 17:58   ` [PATCH v5 4/6] eal: skip stdio on console logging Stephen Hemminger
2023-06-28 17:58   ` [PATCH v5 5/6] eal: allow user to set default log stream before init Stephen Hemminger
2023-06-28 17:58   ` [PATCH v5 6/6] eal: add option to put timestamp on console output Stephen Hemminger
2023-06-29 15:58 ` [PATCH v6 0/6] Logging related patches Stephen Hemminger
2023-06-29 15:58   ` [PATCH v6 1/6] eal: unify logging code Stephen Hemminger
2023-06-29 15:58   ` [PATCH v6 2/6] eal: turn off getopt_long error message during eal_log_level Stephen Hemminger
2023-06-29 15:58   ` [PATCH v6 3/6] eal: fix help message for syslog option Stephen Hemminger
2023-06-29 15:58   ` [PATCH v6 4/6] eal: skip stdio on console logging Stephen Hemminger
2023-06-29 15:58   ` [PATCH v6 5/6] eal: allow user to set default log stream before init Stephen Hemminger
2023-06-29 15:58   ` [PATCH v6 6/6] eal: add option to put timestamp on console output Stephen Hemminger
2023-07-05 22:48 ` [PATCH v7 0/5] Logging timetamp and related patches Stephen Hemminger
2023-07-05 22:48   ` [PATCH v7 1/5] windows: make getopt functions have const properties Stephen Hemminger
2023-07-10 21:10     ` Tyler Retzlaff
2023-07-05 22:48   ` [PATCH v7 2/5] eal: fix help message for syslog option Stephen Hemminger
2023-07-05 22:48   ` [PATCH v7 3/5] eal: unify logging code Stephen Hemminger
2023-07-05 22:48   ` [PATCH v7 4/5] eal: allow user to set default log stream before init Stephen Hemminger
2023-07-05 22:48   ` [PATCH v7 5/5] eal: add option to put timestamp on console output Stephen Hemminger
2024-03-18 18:30 ` [PATCH v8 0/5] Logging timestamp and related patches Stephen Hemminger
2024-03-18 18:30   ` [PATCH v8 1/5] log: unify logging code Stephen Hemminger
2024-03-18 18:30   ` [PATCH v8 2/5] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-18 18:30   ` [PATCH v8 3/5] eal: allow user to set default log stream before init Stephen Hemminger
2024-03-18 18:30   ` [PATCH v8 4/5] eal: add option to put timestamp on console output Stephen Hemminger
2024-03-18 18:30   ` [PATCH v8 5/5] eal: initialize logging before plugins Stephen Hemminger
2024-03-18 22:02 ` [PATCH v9 0/5] Logging unification and timestamp Stephen Hemminger
2024-03-18 22:02   ` [PATCH v9 1/5] log: unify logging code Stephen Hemminger
2024-03-18 22:02   ` [PATCH v9 2/5] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-18 22:02   ` [PATCH v9 3/5] eal: initialize logging before plugins Stephen Hemminger
2024-03-18 22:03   ` [PATCH v9 4/5] eal: allow user to set default log stream before init Stephen Hemminger
2024-03-18 22:03   ` [PATCH v9 5/5] eal: add option to put timestamp on console output Stephen Hemminger
2024-03-19  7:37     ` Morten Brørup
2024-03-19 15:51       ` Stephen Hemminger
2024-03-19 16:13         ` Morten Brørup
2024-03-20  3:33           ` Stephen Hemminger
2024-03-20  8:34             ` Morten Brørup
2024-03-20 14:38               ` Stephen Hemminger
2024-03-20 17:38                 ` Morten Brørup
2024-03-21 16:00 ` [PATCH v10 00/10] Logging enhancements Stephen Hemminger
2024-03-21 16:00   ` [PATCH v10 01/10] windows: make getopt functions have const properties Stephen Hemminger
2024-03-21 16:00   ` [PATCH v10 02/10] log: unify logging code Stephen Hemminger
2024-03-21 16:00   ` [PATCH v10 03/10] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-21 17:00     ` Tyler Retzlaff
2024-03-21 16:00   ` [PATCH v10 04/10] eal: initialize log earlier in startup Stephen Hemminger
2024-03-21 16:00   ` [PATCH v10 05/10] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-21 16:00   ` [PATCH v10 06/10] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-21 17:04     ` Tyler Retzlaff
2024-03-21 16:00   ` [PATCH v10 07/10] eal: allow user to set default log stream before init Stephen Hemminger
2024-03-21 17:07     ` Tyler Retzlaff
2024-03-21 16:00   ` [PATCH v10 08/10] eal: add option to put timestamp on console output Stephen Hemminger
2024-03-21 17:11     ` Tyler Retzlaff
2024-03-21 17:16       ` Stephen Hemminger
2024-03-21 17:49         ` Tyler Retzlaff
2024-03-22  0:30           ` Stephen Hemminger
2024-03-21 16:00   ` [PATCH v10 09/10] log: colorize log output Stephen Hemminger
2024-03-21 16:00   ` [PATCH v10 10/10] doc: add documentation of logging options Stephen Hemminger
2024-03-24  2:33 ` [PATCH v11 0/9] Logging unification and enhancements Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 1/9] windows: make getopt functions have const properties Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 2/9] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 3/9] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 4/9] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 5/9] log: drop syslog support, and make code common Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 6/9] log: add hook for printing log messages Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 7/9] log: add timestamp option Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 8/9] log: add support for systemd journal Stephen Hemminger
2024-03-24  2:33   ` [PATCH v11 9/9] log: colorize log output Stephen Hemminger
2024-03-24 11:18   ` [PATCH v11 0/9] Logging unification and enhancements Mattias Rönnblom
2024-03-25 20:46 ` [PATCH v12 00/14] " Stephen Hemminger
2024-03-25 20:46   ` [PATCH v12 01/14] windows: make getopt functions have const properties Stephen Hemminger
2024-03-25 20:46   ` [PATCH v12 02/14] windows: add os shim for localtime_r Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 03/14] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 04/14] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 05/14] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-27  7:17     ` Tyler Retzlaff
2024-03-25 20:47   ` [PATCH v12 06/14] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 07/14] eal: initialize log before everything else Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 08/14] log: drop syslog support, and make code common Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 09/14] log: add hook for printing log messages Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 10/14] log: add timestamp option Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 11/14] log: add optional support of syslog Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 12/14] log: add support for systemd journal Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 13/14] log: colorize log output Stephen Hemminger
2024-03-25 20:47   ` [PATCH v12 14/14] maintainers: add for log library Stephen Hemminger
2024-03-26  1:56 ` [PATCH v13 00/11] Logging unification and improvements Stephen Hemminger
2024-03-26  1:56   ` [PATCH v13 01/11] windows: make getopt functions have const properties Stephen Hemminger
2024-03-26  9:35     ` Morten Brørup
2024-03-26  1:56   ` [PATCH v13 02/11] windows: add os shim for localtime_r Stephen Hemminger
2024-03-26  1:56   ` [PATCH v13 03/11] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-26  1:56   ` [PATCH v13 04/11] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-26  1:57   ` [PATCH v13 05/11] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-26  1:57   ` [PATCH v13 06/11] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-26  1:57   ` [PATCH v13 07/11] eal: initialize log before everything else Stephen Hemminger
2024-03-26  1:57   ` [PATCH v13 08/11] log: drop syslog support, and make code common Stephen Hemminger
2024-03-26  1:57   ` [PATCH v13 09/11] log: add hook for printing log messages Stephen Hemminger
2024-03-26  1:57   ` [PATCH v13 10/11] log: add timestamp option Stephen Hemminger
2024-03-26  1:57   ` [PATCH v13 11/11] log: add optional support of syslog Stephen Hemminger
2024-03-26 17:34 ` [PATCH v14 00/15] Logging unification and improvments Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 01/15] maintainers: add for log library Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 02/15] windows: make getopt functions have const properties Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 03/15] windows: add os shim for localtime_r Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 04/15] windows: common wrapper for vasprintf and asprintf Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 05/15] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 06/15] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 07/15] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 08/15] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 09/15] eal: initialize log before everything else Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 10/15] log: drop syslog support, and make code common Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 11/15] log: add hook for printing log messages Stephen Hemminger
2024-03-26 17:34   ` Stephen Hemminger [this message]
2024-03-26 17:34   ` [PATCH v14 13/15] log: add optional support of syslog Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 14/15] log: add support for systemd journal Stephen Hemminger
2024-03-26 17:34   ` [PATCH v14 15/15] log: colorize log output Stephen Hemminger
2024-03-27  0:26 ` [PATCH v15 00/15] Logging unification and improvements Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 01/15] maintainers: add for log library Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 02/15] windows: make getopt functions have const properties Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 03/15] windows: add os shim for localtime_r Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 04/15] windows: common wrapper for vasprintf and asprintf Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 05/15] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 06/15] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 07/15] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 08/15] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 09/15] eal: initialize log before everything else Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 10/15] log: drop syslog support, and make code common Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 11/15] log: add hook for printing log messages Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 12/15] log: add timestamp option Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 13/15] log: add optional support of syslog Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 14/15] log: add support for systemd journal Stephen Hemminger
2024-03-27  0:27   ` [PATCH v15 15/15] log: colorize log output Stephen Hemminger
2024-03-27 16:45 ` [PATCH v16 00/15] Logging unification and improvements Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 01/15] maintainers: add for log library Stephen Hemminger
2024-03-27 16:52     ` Tyler Retzlaff
2024-03-27 16:45   ` [PATCH v16 02/15] windows: make getopt functions have const properties Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 03/15] windows: add os shim for localtime_r Stephen Hemminger
2024-03-27 16:56     ` Tyler Retzlaff
2024-03-27 17:30       ` Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 04/15] windows: common wrapper for vasprintf and asprintf Stephen Hemminger
2024-03-27 17:08     ` Tyler Retzlaff
2024-03-27 16:45   ` [PATCH v16 05/15] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-27 17:11     ` Tyler Retzlaff
2024-03-27 16:45   ` [PATCH v16 06/15] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-27 17:11     ` Tyler Retzlaff
2024-03-27 16:45   ` [PATCH v16 07/15] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-27 17:12     ` Tyler Retzlaff
2024-03-27 16:45   ` [PATCH v16 08/15] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 09/15] eal: initialize log before everything else Stephen Hemminger
2024-03-27 17:14     ` Tyler Retzlaff
2024-03-27 16:45   ` [PATCH v16 10/15] log: drop syslog support, and make code common Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 11/15] log: add hook for printing log messages Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 12/15] log: add timestamp option Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 13/15] log: add optional support of syslog Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 14/15] log: add support for systemd journal Stephen Hemminger
2024-03-27 16:45   ` [PATCH v16 15/15] log: colorize log output Stephen Hemminger
2024-03-27 23:28 ` [PATCH v17 00/15] Logging unification and improvements Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 01/15] maintainers: add for log library Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 02/15] windows: make getopt functions have const properties Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 03/15] windows: add os shim for localtime_r Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 04/15] windows: common wrapper for vasprintf and asprintf Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 05/15] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 06/15] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 07/15] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 08/15] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 09/15] eal: initialize log before everything else Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 10/15] log: drop syslog support, and make code common Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 11/15] log: add hook for printing log messages Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 12/15] log: add timestamp option Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 13/15] log: add optional support of syslog Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 14/15] log: add support for systemd journal Stephen Hemminger
2024-03-27 23:28   ` [PATCH v17 15/15] log: colorize log output Stephen Hemminger
2024-03-28 23:49 ` [PATCH v18 00/15] Logging unification and improvements Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 01/15] maintainers: add for log library Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 02/15] windows: make getopt functions have const properties Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 03/15] windows: add os shim for localtime_r Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 04/15] windows: common wrapper for vasprintf and asprintf Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 05/15] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 06/15] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 07/15] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 08/15] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 09/15] eal: initialize log before everything else Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 10/15] log: drop syslog support, and make code common Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 11/15] log: add hook for printing log messages Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 12/15] log: add timestamp option Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 13/15] log: add optional support of syslog Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 14/15] log: add support for systemd journal Stephen Hemminger
2024-03-28 23:49   ` [PATCH v18 15/15] log: colorize log output Stephen Hemminger
2024-03-30  3:00 ` [PATCH v19 00/15] Logging unification and improvements Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 01/15] maintainers: add for log library Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 02/15] windows: make getopt functions have const properties Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 03/15] windows: add os shim for localtime_r Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 04/15] windows: common wrapper for vasprintf and asprintf Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 05/15] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 06/15] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 07/15] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 08/15] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 09/15] eal: initialize log before everything else Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 10/15] log: drop syslog support, and make code common Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 11/15] log: add hook for printing log messages Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 12/15] log: add timestamp option Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 13/15] log: add optional support of syslog Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 14/15] log: add support for systemd journal Stephen Hemminger
2024-03-30  3:00   ` [PATCH v19 15/15] log: colorize log output Stephen Hemminger
2024-03-30 16:42 ` [PATCH v20 00/14] Logging unification and improvements Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 01/14] maintainers: add for log library Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 02/14] windows: make getopt functions have const properties Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 03/14] windows: add os shim for localtime_r Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 04/14] eal: make eal_log_level_parse common Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 05/14] eal: do not duplicate rte_init_alert() messages Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 06/14] eal: change rte_exit() output to match rte_log() Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 07/14] log: move handling of syslog facility out of eal Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 08/14] eal: initialize log before everything else Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 09/14] log: drop syslog support, and make code common Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 10/14] log: add hook for printing log messages Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 11/14] log: add timestamp option Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 12/14] log: add optional support of syslog Stephen Hemminger
2024-03-30 16:42   ` [PATCH v20 13/14] log: add support for systemd journal Stephen Hemminger
2024-04-01 11:18     ` Luca Boccassi
2024-03-30 16:42   ` [PATCH v20 14/14] log: colorize log output Stephen Hemminger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240326173552.97249-13-stephen@networkplumber.org \
    --to=stephen@networkplumber.org \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=dmitry.kozliuk@gmail.com \
    --cc=pallavi.kadam@intel.com \
    --cc=roretzla@linux.microsoft.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).