<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/20045">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">logging: introduce 'systemd-journal' target<br><br>This change implements 'systemd-journal' logging target, that is<br>similar to the existing 'syslog' target.  The key difference is<br>that 'systemd-journal' allows us to offload rendering of the meta<br>information, such as location (file name, line number), subsystem,<br>and logging level, to systemd.  Moreover, we can attach arbitrary,<br>user-specific fields [1] to the logging messages, so they can be<br>used for advanced log filtering (e.g. by IMSI/TMSI/TLLI):<br><br>  $ journalctl OSMO_SUBSYS=DMSC -f<br><br>Since we don't want to make libsystemd a required dependency, this<br>feature is optional, and needs to be enabled at build-time:<br><br>  $ ./configure --enable-systemd-logging<br><br>The new logging target can be configured in the same way as any<br>other one - via the VTY interface, or using the configuration file:<br><br>  log systemd-journal [raw]<br>    logging level set-all notice<br>    logging filter all 1<br><br>Two logging handlers are available: generic and raw.  The first one<br>behaves similarly to both 'syslog' and 'stderr', i.e. all the meta<br>information is rendered by libosmocore itself, and then passed to<br>systemd together with the logging message.  The later is more like<br>the 'gsmtap' target, so all available meta information is handed<br>over to systemd in form of fields [1]:<br><br>  - CODE_FILE / CODE_LINE - location info,<br>  - PRIORITY - syslog-compatible logging level,<br>  - OSMO_SUBSYS - Osmocom-specific sub-system (e.g. DMSC),<br>  - OSMO_SUBSYS_HEX - same as OSMO_SUBSYS, but encoded in hex,<br>  - MESSAGE - the logging message itself,<br><br>and then can be rendered in any supported format (e.g. JSON).<br><br>More details about the API can be found in [2].<br><br>[1] https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html<br>[2] https://www.freedesktop.org/software/systemd/man/sd-journal.html<br><br>Change-Id: I609f5cf438e6ad9038d8fc95f00add6aac29fb23<br>---<br>M configure.ac<br>M include/osmocom/core/logging.h<br>M src/Makefile.am<br>A src/logging_systemd.c<br>M src/vty/logging_vty.c<br>5 files changed, 211 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index b07a3bd..e867197 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -181,6 +181,19 @@</span><br><span>    AC_DEFINE([USE_GNUTLS], [1], [Use GnuTLS as a fallback for missing getrandom()])</span><br><span> fi</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE([systemd_logging],</span><br><span style="color: hsl(120, 100%, 40%);">+  [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-systemd-logging],</span><br><span style="color: hsl(120, 100%, 40%);">+           [Build with systemd-journal logging support]</span><br><span style="color: hsl(120, 100%, 40%);">+  )],</span><br><span style="color: hsl(120, 100%, 40%);">+   [systemd_logging=$enableval], [systemd_logging="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+AS_IF([test "x$systemd_logging" = "xyes"], [</span><br><span style="color: hsl(120, 100%, 40%);">+     PKG_CHECK_MODULES(SYSTEMD, libsystemd)</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_DEFINE([ENABLE_SYSTEMD_LOGGING], [1], [Enable systemd-journal logging target])</span><br><span style="color: hsl(120, 100%, 40%);">+])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL(ENABLE_SYSTEMD_LOGGING, test "x$systemd_logging" = "xyes")</span><br><span style="color: hsl(120, 100%, 40%);">+AC_SUBST(ENABLE_SYSTEMD_LOGGING)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AC_ARG_ENABLE([libsctp], [AS_HELP_STRING([--disable-libsctp], [Do not enable socket multiaddr APIs requiring libsctp])],</span><br><span>         [ENABLE_LIBSCTP=$enableval], [ENABLE_LIBSCTP="yes"])</span><br><span> AM_CONDITIONAL(ENABLE_LIBSCTP, test x"$ENABLE_LIBSCTP" = x"yes")</span><br><span>diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h</span><br><span>index 36ce941..6d0d5a3 100644</span><br><span>--- a/include/osmocom/core/logging.h</span><br><span>+++ b/include/osmocom/core/logging.h</span><br><span>@@ -244,6 +244,7 @@</span><br><span>    LOG_TGT_TYPE_STDERR,    /*!< stderr logging */</span><br><span>    LOG_TGT_TYPE_STRRB,     /*!< osmo_strrb-backed logging */</span><br><span>         LOG_TGT_TYPE_GSMTAP,    /*!< GSMTAP network logging */</span><br><span style="color: hsl(120, 100%, 40%);">+     LOG_TGT_TYPE_SYSTEMD,   /*!< systemd journal logging */</span><br><span> };</span><br><span> </span><br><span> /*! Whether/how to log the source filename (and line number). */</span><br><span>@@ -311,6 +312,10 @@</span><br><span>                      const char *ident;</span><br><span>                   const char *hostname;</span><br><span>                } tgt_gsmtap;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      bool raw;</span><br><span style="color: hsl(120, 100%, 40%);">+             } sd_journal;</span><br><span>        };</span><br><span> </span><br><span>       /*! call-back function to be called when the logging framework</span><br><span>@@ -392,6 +397,8 @@</span><br><span>                                             const char *ident,</span><br><span>                                           bool ofd_wq_mode,</span><br><span>                                            bool add_sink);</span><br><span style="color: hsl(120, 100%, 40%);">+struct log_target *log_target_create_systemd(bool raw);</span><br><span style="color: hsl(120, 100%, 40%);">+void log_target_systemd_set_raw(struct log_target *target, bool raw);</span><br><span> int log_target_file_reopen(struct log_target *tgt);</span><br><span> int log_targets_reopen(void);</span><br><span> </span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 891b4a6..b2c9204 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -71,5 +71,10 @@</span><br><span> libosmocore_la_SOURCES += serial.c</span><br><span> endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_SYSTEMD_LOGGING</span><br><span style="color: hsl(120, 100%, 40%);">+libosmocore_la_SOURCES += logging_systemd.c</span><br><span style="color: hsl(120, 100%, 40%);">+libosmocore_la_LIBADD += $(SYSTEMD_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> crc%gen.c: crcXXgen.c.tpl</span><br><span>     $(AM_V_GEN)sed -e's/XX/$*/g' $< > $@</span><br><span>diff --git a/src/logging_systemd.c b/src/logging_systemd.c</span><br><span>new file mode 100644</span><br><span>index 0000000..7c96686</span><br><span>--- /dev/null</span><br><span>+++ b/src/logging_systemd.c</span><br><span>@@ -0,0 +1,121 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0+</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \addtogroup logging</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @{</span><br><span style="color: hsl(120, 100%, 40%);">+ * \file logging_systemd.c */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <syslog.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Do not use this file as location in sd_journal_print() */</span><br><span style="color: hsl(120, 100%, 40%);">+#define SD_JOURNAL_SUPPRESS_LOCATION</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <systemd/sd-journal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: copy-pasted from logging_syslog.c */</span><br><span style="color: hsl(120, 100%, 40%);">+static int logp2syslog_level(unsigned int level)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (level >= LOGL_FATAL)</span><br><span style="color: hsl(120, 100%, 40%);">+           return LOG_CRIT;</span><br><span style="color: hsl(120, 100%, 40%);">+      else if (level >= LOGL_ERROR)</span><br><span style="color: hsl(120, 100%, 40%);">+              return LOG_ERR;</span><br><span style="color: hsl(120, 100%, 40%);">+       else if (level >= LOGL_NOTICE)</span><br><span style="color: hsl(120, 100%, 40%);">+             return LOG_NOTICE;</span><br><span style="color: hsl(120, 100%, 40%);">+    else if (level >= LOGL_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+               return LOG_INFO;</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          return LOG_DEBUG;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void _systemd_output(struct log_target *target,</span><br><span style="color: hsl(120, 100%, 40%);">+                            unsigned int level, const char *log)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   /* systemd accepts the same level constants as syslog */</span><br><span style="color: hsl(120, 100%, 40%);">+      sd_journal_print(logp2syslog_level(level), "%s", log);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void _systemd_raw_output(struct log_target *target, int subsys,</span><br><span style="color: hsl(120, 100%, 40%);">+                         unsigned int level, const char *file,</span><br><span style="color: hsl(120, 100%, 40%);">+                         int line, int cont, const char *format,</span><br><span style="color: hsl(120, 100%, 40%);">+                               va_list ap)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        char buf[4096];</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = vsnprintf(buf, sizeof(buf), format, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              sd_journal_print(LOG_ERR, "vsnprintf() failed to render a message "</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "originated from %s:%d (rc=%d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                          file, line, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   sd_journal_send("CODE_FILE=%s, CODE_LINE=%d", file, line,</span><br><span style="color: hsl(120, 100%, 40%);">+                   "PRIORITY=%d", logp2syslog_level(level),</span><br><span style="color: hsl(120, 100%, 40%);">+                    "OSMO_SUBSYS=%s", log_category_name(subsys),</span><br><span style="color: hsl(120, 100%, 40%);">+                        "OSMO_SUBSYS_HEX=%4.4x", subsys,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "MESSAGE=%s", buf,</span><br><span style="color: hsl(120, 100%, 40%);">+                  NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Create a new logging target for systemd journal logging.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] raw whether to offload rendering of the meta information</span><br><span style="color: hsl(120, 100%, 40%);">+ *             (location, category) to systemd-journal.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns Log target in case of success, NULL in case of error.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct log_target *log_target_create_systemd(bool raw)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct log_target *target;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  target = log_target_create();</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!target)</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        target->type = LOG_TGT_TYPE_SYSTEMD;</span><br><span style="color: hsl(120, 100%, 40%);">+       log_target_systemd_set_raw(target, raw);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return target;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Change meta information handling of an existing logging target.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] target logging target to be modified.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] raw whether to offload rendering of the meta information</span><br><span style="color: hsl(120, 100%, 40%);">+ *                (location, category) to systemd-journal.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void log_target_systemd_set_raw(struct log_target *target, bool raw)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     target->sd_journal.raw = raw;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (raw) {</span><br><span style="color: hsl(120, 100%, 40%);">+            target->raw_output = _systemd_raw_output;</span><br><span style="color: hsl(120, 100%, 40%);">+          target->output = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              target->output = _systemd_output;</span><br><span style="color: hsl(120, 100%, 40%);">+          target->raw_output = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* @} */</span><br><span>diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c</span><br><span>index 200b45a..0282350 100644</span><br><span>--- a/src/vty/logging_vty.c</span><br><span>+++ b/src/vty/logging_vty.c</span><br><span>@@ -732,6 +732,64 @@</span><br><span> }</span><br><span> #endif /* HAVE_SYSLOG_H */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_log_systemd_journal, cfg_log_systemd_journal_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "log systemd-journal [raw]",</span><br><span style="color: hsl(120, 100%, 40%);">+      LOG_STR "Logging to systemd-journal\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Offload rendering of the meta information (location, category) to systemd\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_SYSTEMD_LOGGING</span><br><span style="color: hsl(120, 100%, 40%);">+  struct log_target *tgt;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool raw = argc > 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     log_tgt_mutex_lock();</span><br><span style="color: hsl(120, 100%, 40%);">+ tgt = log_target_find(LOG_TGT_TYPE_SYSTEMD, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (tgt == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+            tgt = log_target_create_systemd(raw);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (tgt == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    vty_out(vty, "%% Unable to create systemd-journal "</span><br><span style="color: hsl(120, 100%, 40%);">+                         "log target%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                       RET_WITH_UNLOCK(CMD_WARNING);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             log_add_target(tgt);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else if (tgt->sd_journal.raw != raw) {</span><br><span style="color: hsl(120, 100%, 40%);">+           log_target_systemd_set_raw(tgt, raw);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vty->index = tgt;</span><br><span style="color: hsl(120, 100%, 40%);">+  vty->node = CFG_LOG_NODE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        RET_WITH_UNLOCK(CMD_SUCCESS);</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "%% systemd-journal logging is not available "</span><br><span style="color: hsl(120, 100%, 40%);">+         "in this build of libosmocore%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* ENABLE_SYSTEMD_LOGGING */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_no_log_systemd_journal, cfg_no_log_systemd_journal_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "no log systemd-journal",</span><br><span style="color: hsl(120, 100%, 40%);">+   NO_STR LOG_STR "Logging to systemd-journal\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_SYSTEMD_LOGGING</span><br><span style="color: hsl(120, 100%, 40%);">+    struct log_target *tgt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     log_tgt_mutex_lock();</span><br><span style="color: hsl(120, 100%, 40%);">+ tgt = log_target_find(LOG_TGT_TYPE_SYSTEMD, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!tgt) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% No systemd-journal logging active%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                RET_WITH_UNLOCK(CMD_WARNING);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   log_target_destroy(tgt);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    RET_WITH_UNLOCK(CMD_SUCCESS);</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "%% systemd-journal logging is not available "</span><br><span style="color: hsl(120, 100%, 40%);">+         "in this build of libosmocore%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* ENABLE_SYSTEMD_LOGGING */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_log_gsmtap, cfg_log_gsmtap_cmd,</span><br><span>   "log gsmtap [HOSTNAME]",</span><br><span>   LOG_STR "Logging via GSMTAP\n"</span><br><span>@@ -926,6 +984,11 @@</span><br><span>              vty_out(vty, "log gsmtap %s%s",</span><br><span>                    tgt->tgt_gsmtap.hostname, VTY_NEWLINE);</span><br><span>           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case LOG_TGT_TYPE_SYSTEMD:</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "log systemd-journal%s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                     tgt->sd_journal.raw ? " raw" : "",</span><br><span style="color: hsl(120, 100%, 40%);">+                     VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span>       }</span><br><span> </span><br><span>        vty_out(vty, " logging filter all %u%s",</span><br><span>@@ -1127,5 +1190,7 @@</span><br><span>   install_lib_element(CONFIG_NODE, &cfg_log_syslog_local_cmd);</span><br><span>     install_lib_element(CONFIG_NODE, &cfg_no_log_syslog_cmd);</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+       install_lib_element(CONFIG_NODE, &cfg_log_systemd_journal_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_lib_element(CONFIG_NODE, &cfg_no_log_systemd_journal_cmd);</span><br><span>       install_lib_element(CONFIG_NODE, &cfg_log_gsmtap_cmd);</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/20045">change 20045</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/20045"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I609f5cf438e6ad9038d8fc95f00add6aac29fb23 </div>
<div style="display:none"> Gerrit-Change-Number: 20045 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>