]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
log: add syslog target, systemd
authorLukáš Ježek <lukas.jezek@nic.cz>
Thu, 13 May 2021 08:50:57 +0000 (10:50 +0200)
committerLukáš Ježek <lukas.jezek@nic.cz>
Tue, 22 Jun 2021 12:37:30 +0000 (14:37 +0200)
daemon/main.c
lib/log.c
lib/log.h
lib/meson.build

index e24a7653f3230b29fc556efb487a6deb7cbb4719..2e00a53a9517765128041d49560842223e71d1f5 100644 (file)
@@ -422,7 +422,7 @@ int main(int argc, char **argv)
 
        the_args = &the_args_value;
        args_init(the_args);
-       kr_log_init(LOG_WARNING);
+       kr_log_init(LOG_WARNING, LOG_TARGET_SYSLOG);
        int ret = parse_args(argc, argv, the_args);
        if (ret >= 0) goto cleanup_args;
 
index ec2ca9c6d16968579e5ef3ba91ebeece58a07245..652b5c9d92d98a7cb59dc0fbf0b5bcea2bb5a2ff 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
@@ -2,19 +2,62 @@
  *  SPDX-License-Identifier: GPL-3.0-or-later
  */
 
+#include "kresconfig.h"
+
 #include <stdio.h>
 #include <gnutls/gnutls.h>
 #include "lib/log.h"
 
+#if ENABLE_LIBSYSTEMD
+#include <stdlib.h>
+#include <systemd/sd-daemon.h>
+#include <systemd/sd-journal.h>
+
+int use_journal = 0;
+#endif
+
 log_level_t kr_log_level = LOG_CRIT;
+log_target_t kr_log_target = LOG_TARGET_STDOUT;
+
 
 void kr_log_fmt(log_level_t level, const char *fmt, ...)
 {
        va_list args;
-       va_start(args, fmt);
-       if (KR_LOG_LEVEL_IS(level))
-               vfprintf(stdout, fmt, args);
-       va_end(args);
+
+       if (kr_log_target == LOG_TARGET_SYSLOG) {
+               va_start(args, fmt);
+#if ENABLE_LIBSYSTEMD
+               if (use_journal) {
+                       char *code_line = NULL;
+                       if (asprintf(&code_line, "%d", __LINE__) == -1) {
+                               sd_journal_printv(level, fmt, args);
+                       } else {
+                               sd_journal_printv_with_location(level,
+                                               __FILE__, code_line, __func__,
+                                               fmt, args);
+                               free(code_line);
+                       }
+               } else
+#endif
+               {
+                       vsyslog(level, fmt, args);
+               }
+               va_end(args);
+       } else {
+               if (!KR_LOG_LEVEL_IS(level))
+                       return;
+
+               FILE *stream;
+               switch(kr_log_target) {
+               case LOG_TARGET_STDOUT: stream = stdout; break;
+               case LOG_TARGET_STDERR: stream = stderr; break;
+               default: stream = stdout; break;
+               }
+
+               va_start(args, fmt);
+               vfprintf(stream, fmt, args);
+               va_end(args);
+       }
 }
 
 static void kres_gnutls_log(int level, const char *message)
@@ -28,6 +71,7 @@ int kr_log_level_set(log_level_t level)
                return kr_log_level;
 
        kr_log_level = level;
+       setlogmask(LOG_UPTO(kr_log_level));
 
        /* gnutls logs messages related to our TLS and also libdnssec,
         * and the logging is set up in a global way only */
@@ -45,8 +89,15 @@ log_level_t kr_log_level_get(void)
        return kr_log_level;
 }
 
-void kr_log_init(log_level_t level)
+void kr_log_init(log_level_t level, log_target_t target)
 {
        kr_log_level = level;
+       kr_log_target = target;
+
+#if ENABLE_LIBSYSTEMD
+       use_journal = sd_booted();
+#endif
+       openlog(NULL, LOG_PID, LOG_DAEMON);
+       setlogmask(LOG_UPTO(kr_log_level));
 }
 
index 31c51ea181e7743aa9a6c70e714bc9b149adbe3e..9ce4b25faae6149f1e2a94f914b92c5d5f17ab71 100644 (file)
--- a/lib/log.h
+++ b/lib/log.h
@@ -5,22 +5,29 @@
 #pragma once
 
 #include <stdarg.h>
+#include <syslog.h>
 #include "lib/defines.h"
 
+typedef int log_level_t;
+
 typedef enum {
-       LOG_CRIT = 0,
-       LOG_ERR,
-       LOG_WARNING,
-       LOG_NOTICE,
-       LOG_INFO,
-       LOG_DEBUG
-} log_level_t;
-
-KR_EXPORT KR_PRINTF(2) void kr_log_fmt(log_level_t level, const char *fmt, ...);
-KR_EXPORT extern log_level_t kr_log_level;
-KR_EXPORT int kr_log_level_set(log_level_t level);
-KR_EXPORT log_level_t kr_log_level_get(void);
-void kr_log_init(log_level_t level);
+       LOG_TARGET_SYSLOG = 0,
+       LOG_TARGET_STDERR = 1,
+       LOG_TARGET_STDOUT = 2,
+} log_target_t;
+
+KR_EXPORT
+extern log_level_t kr_log_level;
+KR_EXPORT
+extern log_target_t kr_log_target;
+KR_EXPORT KR_PRINTF(2)
+void kr_log_fmt(log_level_t level, const char *fmt, ...);
+KR_EXPORT
+int kr_log_level_set(log_level_t level);
+KR_EXPORT
+log_level_t kr_log_level_get(void);
+KR_EXPORT
+void kr_log_init(log_level_t level, log_target_t target);
 
 #define kr_log_debug(fmt, ...) kr_log_fmt(LOG_DEBUG, fmt, ## __VA_ARGS__)
 #define kr_log_info(fmt, ...) kr_log_fmt(LOG_INFO, fmt, ## __VA_ARGS__)
index 2098b343b1af39ce99f9062ba9295867ab29371e..d02bfe99d04c47f4bb8ecb005c7089271e836683 100644 (file)
@@ -101,6 +101,7 @@ libkres_lib = library('kres',
     libdnssec,
     gnutls,
     luajit,
+    libsystemd,
   ],
   install: true,
 )