Log to syslog only if option is specified.
If no --syslog is given then use console only.

Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
---
 app/test/test_eal_flags.c                     | 16 +++----
 doc/guides/linux_gsg/linux_eal_parameters.rst | 27 ------------
 doc/guides/prog_guide/log_lib.rst             |  5 +--
 lib/eal/common/eal_common_options.c           |  4 +-
 lib/log/log.c                                 | 43 +++++++++----------
 lib/log/log_freebsd.c                         | 11 -----
 lib/log/log_internal.h                        |  6 ---
 lib/log/log_private.h                         | 10 +++++
 lib/log/log_syslog.c                          | 21 ++++-----
 lib/log/log_windows.c                         | 22 ----------
 lib/log/version.map                           |  3 +-
 11 files changed, 51 insertions(+), 117 deletions(-)
 delete mode 100644 lib/log/log_freebsd.c
 create mode 100644 lib/log/log_private.h
 delete mode 100644 lib/log/log_windows.c

diff --git a/app/test/test_eal_flags.c b/app/test/test_eal_flags.c
index 71d8dba731..9fcf0d56e6 100644
--- a/app/test/test_eal_flags.c
+++ b/app/test/test_eal_flags.c
@@ -985,12 +985,12 @@ test_misc_flags(void)
        /* With -v */
        const char *argv2[] = {prgname, prefix, mp_flag, "-v"};
        /* With valid --syslog */
-       const char *argv3[] = {prgname, prefix, mp_flag,
-                       "--syslog", "syslog"};
-       /* With empty --syslog (should fail) */
+       const char *argv3[] = {prgname, prefix, mp_flag, "--syslog=user"};
+       /* With empty --syslog (now defaults) */
        const char *argv4[] = {prgname, prefix, mp_flag, "--syslog"};
        /* With invalid --syslog */
-       const char *argv5[] = {prgname, prefix, mp_flag, "--syslog", "error"};
+       const char *argv5[] = {prgname, prefix, mp_flag, "--syslog=invalid"};
+
        /* With no-sh-conf, also use no-huge to ensure this test runs on BSD */
        const char *argv6[] = {prgname, "-m", DEFAULT_MEM_SIZE,
                        no_shconf, nosh_prefix, no_huge};
@@ -1080,15 +1080,15 @@ test_misc_flags(void)
 #endif
 
        if (launch_proc(argv3) != 0) {
-               printf("Error - process did not run ok with --syslog flag\n");
+               printf("Error - process did not run ok with --syslog=user 
flag\n");
                goto fail;
        }
-       if (launch_proc(argv4) == 0) {
-               printf("Error - process run ok with empty --syslog flag\n");
+       if (launch_proc(argv4) != 0) {
+               printf("Error - process did not run ok with --syslog flag\n");
                goto fail;
        }
        if (launch_proc(argv5) == 0) {
-               printf("Error - process run ok with invalid --syslog flag\n");
+               printf("Error - process run ok with --syslog=invalid flag\n");
                goto fail;
        }
        if (launch_proc(argv7) != 0) {
diff --git a/doc/guides/linux_gsg/linux_eal_parameters.rst 
b/doc/guides/linux_gsg/linux_eal_parameters.rst
index ea8f381391..d86f94d8a8 100644
--- a/doc/guides/linux_gsg/linux_eal_parameters.rst
+++ b/doc/guides/linux_gsg/linux_eal_parameters.rst
@@ -108,30 +108,3 @@ Memory-related options
 *   ``--match-allocations``
 
     Free hugepages back to system exactly as they were originally allocated.
-
-Other options
-~~~~~~~~~~~~~
-
-*   ``--syslog <syslog facility>``
-
-    Set syslog facility. Valid syslog facilities are::
-
-        auth
-        cron
-        daemon
-        ftp
-        kern
-        lpr
-        mail
-        news
-        syslog
-        user
-        uucp
-        local0
-        local1
-        local2
-        local3
-        local4
-        local5
-        local6
-        local7
diff --git a/doc/guides/prog_guide/log_lib.rst 
b/doc/guides/prog_guide/log_lib.rst
index ff9d1b54a2..c87830ac00 100644
--- a/doc/guides/prog_guide/log_lib.rst
+++ b/doc/guides/prog_guide/log_lib.rst
@@ -5,9 +5,7 @@ Log Library
 ===========
 
 The DPDK Log library provides the logging functionality for other DPDK 
libraries and drivers.
-By default, in a Linux application, logs are sent to syslog and also to the 
console.
-On FreeBSD and Windows applications, logs are sent only to the console.
-However, the log function can be overridden by the user to use a different 
logging mechanism.
+The messages can be sent to one or more sources controlled by the EAL command 
line options.
 
 Log Levels
 ----------
@@ -59,6 +57,7 @@ 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.
 
+
 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 71c672e93e..ca7b702e03 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -91,7 +91,7 @@ eal_long_options[] = {
        {OPT_SOCKET_MEM,        1, NULL, OPT_SOCKET_MEM_NUM       },
        {OPT_SOCKET_LIMIT,      1, NULL, OPT_SOCKET_LIMIT_NUM     },
 #ifndef RTE_EXEC_ENV_WINDOWS
-       {OPT_SYSLOG,            1, NULL, OPT_SYSLOG_NUM           },
+       {OPT_SYSLOG,            2, NULL, OPT_SYSLOG_NUM           },
 #endif
        {OPT_VDEV,              1, NULL, OPT_VDEV_NUM             },
        {OPT_VFIO_INTR,         1, NULL, OPT_VFIO_INTR_NUM        },
@@ -2209,7 +2209,7 @@ eal_common_usage(void)
               "  --"OPT_VMWARE_TSC_MAP"    Use VMware TSC map instead of 
native RDTSC\n"
               "  --"OPT_PROC_TYPE"         Type of this process 
(primary|secondary|auto)\n"
 #ifndef RTE_EXEC_ENV_WINDOWS
-              "  --"OPT_SYSLOG"            Set syslog facility\n"
+              "  --"OPT_SYSLOG"[=<when>]   Enable use of syslog\n"
 #endif
               "  --"OPT_LOG_LEVEL"=<level> Set global log level\n"
               "  --"OPT_LOG_LEVEL"=<type-match>:<level>\n"
diff --git a/lib/log/log.c b/lib/log/log.c
index 152aa634c7..b863a0b6bc 100644
--- a/lib/log/log.c
+++ b/lib/log/log.c
@@ -12,15 +12,18 @@
 #include <regex.h>
 #include <fnmatch.h>
 #include <sys/queue.h>
+#include <unistd.h>
 
 #include <rte_common.h>
 #include <rte_log.h>
 #include <rte_per_lcore.h>
+
 #ifdef RTE_EXEC_ENV_WINDOWS
 #include <rte_os_shim.h>
 #endif
 
 #include "log_internal.h"
+#include "log_private.h"
 
 struct rte_log_dynamic_type {
        const char *name;
@@ -61,9 +64,6 @@ TAILQ_HEAD(rte_eal_opt_loglevel_list, rte_eal_opt_loglevel);
 static struct rte_eal_opt_loglevel_list opt_loglevel_list =
        TAILQ_HEAD_INITIALIZER(opt_loglevel_list);
 
-/* Stream to use for logging if rte_logs.file is NULL */
-static FILE *default_log_stream;
-
 /**
  * This global structure stores some information about the message
  * that is currently being processed by one lcore
@@ -76,8 +76,6 @@ struct log_cur_msg {
  /* per core log */
 static RTE_DEFINE_PER_LCORE(struct log_cur_msg, log_cur_msg);
 
-/* default logs */
-
 /* Change the stream that will be used by logging system */
 int
 rte_openlog_stream(FILE *f)
@@ -92,17 +90,7 @@ rte_log_get_stream(void)
 {
        FILE *f = rte_logs.file;
 
-       if (f == NULL) {
-               /*
-                * Grab the current value of stderr here, rather than
-                * just initializing default_log_stream to stderr. This
-                * ensures that we will always use the current value
-                * of stderr, even if the application closes and
-                * reopens it.
-                */
-               return default_log_stream != NULL ? default_log_stream : stderr;
-       }
-       return f;
+       return (f == NULL) ? stderr : f;
 }
 
 /* Set global log level */
@@ -513,12 +501,18 @@ rte_log(uint32_t level, uint32_t logtype, const char 
*format, ...)
 }
 
 /*
- * Called by environment-specific initialization functions.
+ * Called by rte_eal_init
  */
 void
-eal_log_set_default(FILE *default_log)
+eal_log_init(const char *id)
 {
-       default_log_stream = default_log;
+#ifndef RTE_EXEC_ENV_WINDOWS
+       FILE *logf;
+
+       logf = log_syslog_open(id);
+       if (logf)
+               rte_openlog_stream(logf);
+#endif
 
 #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
        RTE_LOG(NOTICE, EAL,
@@ -532,8 +526,11 @@ eal_log_set_default(FILE *default_log)
 void
 rte_eal_log_cleanup(void)
 {
-       if (default_log_stream) {
-               fclose(default_log_stream);
-               default_log_stream = NULL;
-       }
+       FILE *log_stream = rte_logs.file;
+
+       /* don't close stderr on the application */
+       if (log_stream != NULL)
+               fclose(log_stream);
+
+       rte_logs.file = NULL;
 }
diff --git a/lib/log/log_freebsd.c b/lib/log/log_freebsd.c
deleted file mode 100644
index 33a0925c43..0000000000
--- a/lib/log/log_freebsd.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2023 Intel Corporation
- */
-
-#include <rte_common.h>
-#include "log_internal.h"
-
-void
-eal_log_init(__rte_unused const char *id)
-{
-}
diff --git a/lib/log/log_internal.h b/lib/log/log_internal.h
index d5fabd7ef7..3c46328e7b 100644
--- a/lib/log/log_internal.h
+++ b/lib/log/log_internal.h
@@ -16,12 +16,6 @@
 __rte_internal
 void eal_log_init(const char *id);
 
-/*
- * Determine where log data is written when no call to rte_openlog_stream.
- */
-__rte_internal
-void eal_log_set_default(FILE *default_log);
-
 /*
  * Save a log option for later.
  */
diff --git a/lib/log/log_private.h b/lib/log/log_private.h
new file mode 100644
index 0000000000..43e7ff7b01
--- /dev/null
+++ b/lib/log/log_private.h
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+
+#ifndef LOG_PRIVATE_H
+#define LOG_PRIVATE_H
+
+#ifndef RTE_EXEC_ENV_WINDOWS
+FILE *log_syslog_open(const char *id);
+#endif
+
+#endif /* LOG_PRIVATE_H */
diff --git a/lib/log/log_syslog.c b/lib/log/log_syslog.c
index ce34fa4f22..4a05835068 100644
--- a/lib/log/log_syslog.c
+++ b/lib/log/log_syslog.c
@@ -5,12 +5,16 @@
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
 #include <syslog.h>
 
 #include <rte_common.h>
 #include <rte_log.h>
 
 #include "log_internal.h"
+#include "log_private.h"
 
 static int log_facility = LOG_DAEMON;
 
@@ -77,20 +81,11 @@ static cookie_io_functions_t log_syslog_func = {
        .close = log_syslog_close,
 };
 
-/*
- * set the log to default function, called during eal init process,
- * once memzones are available.
- */
-void
-eal_log_init(const char *id)
+FILE *
+log_syslog_open(const char *id)
 {
-       FILE *log_stream;
-
        openlog(id, LOG_NDELAY | LOG_PID | LOG_PERROR, log_facility);
 
-       log_stream = fopencookie(NULL, "w+", log_syslog_func);
-       if (log_stream != NULL)
-               eal_log_set_default(log_stream);
-       else
-               eal_log_set_default(stderr);
+       /* redirect other log messages to syslog as well */
+       return fopencookie(NULL, "w", log_syslog_func);
 }
diff --git a/lib/log/log_windows.c b/lib/log/log_windows.c
deleted file mode 100644
index d7c30e4cfa..0000000000
--- a/lib/log/log_windows.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017-2018 Intel Corporation
- */
-
-#include <rte_common.h>
-#include <rte_log.h>
-#include "log_internal.h"
-
-int
-eal_log_syslog(const char *name __rte_unused)
-{
-       return -1; /* not used */
-}
-
-/* set the log to default function, called during eal init process. */
-void
-eal_log_init(__rte_unused const char *id)
-{
-       rte_openlog_stream(stderr);
-
-       eal_log_set_default(stderr);
-}
diff --git a/lib/log/version.map b/lib/log/version.map
index 879567ba15..1637fba3b9 100644
--- a/lib/log/version.map
+++ b/lib/log/version.map
@@ -29,7 +29,6 @@ INTERNAL {
        eal_log_level2str;
        eal_log_save_pattern;
        eal_log_save_regexp;
-       eal_log_set_default;
-       eal_log_syslog;
+       eal_log_syslog; # WINDOWS_NO_EXPORT
        rte_eal_log_cleanup;
 };
-- 
2.45.2

Reply via email to