<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/20045">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">logging: introduce experimental systemd journal target<br><br>TODO<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, 153 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/45/20045/1</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..b028058 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 journalctl 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 79eec10..7150b8b 100644</span><br><span>--- a/include/osmocom/core/logging.h</span><br><span>+++ b/include/osmocom/core/logging.h</span><br><span>@@ -243,6 +243,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>@@ -391,6 +392,7 @@</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(void);</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..7633217</span><br><span>--- /dev/null</span><br><span>+++ b/src/logging_systemd.c</span><br><span>@@ -0,0 +1,74 @@</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 <syslog.h></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%);">+/*! Create a new logging target for systemd journal logging.</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(void)</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%);">+       target->output = _systemd_output;</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%);">+/* @} */</span><br><span>diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c</span><br><span>index 0e1782a..0471ca6 100644</span><br><span>--- a/src/vty/logging_vty.c</span><br><span>+++ b/src/vty/logging_vty.c</span><br><span>@@ -731,6 +731,60 @@</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, cfg_log_systemd_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "log systemd",</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%);">+{</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 == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+            tgt = log_target_create_systemd();</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%);">+  }</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, cfg_no_log_systemd_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "no log systemd",</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 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>@@ -924,6 +978,9 @@</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%s", 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>@@ -1125,5 +1182,7 @@</span><br><span>   install_element(CONFIG_NODE, &cfg_log_syslog_local_cmd);</span><br><span>         install_element(CONFIG_NODE, &cfg_no_log_syslog_cmd);</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(CONFIG_NODE, &cfg_log_systemd_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(CONFIG_NODE, &cfg_no_log_systemd_cmd);</span><br><span>   install_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: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>