]> 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)
committerTomas Krizek <tomas.krizek@nic.cz>
Thu, 29 Jul 2021 09:40:49 +0000 (11:40 +0200)
daemon/main.c
lib/log.c
lib/log.h
lib/meson.build

index e24a7653f3230b29fc556efb487a6deb7cbb4719..b57a9ebdf236253a0f882a8ca80855db588fc8c6 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_STDOUT);
        int ret = parse_args(argc, argv, the_args);
        if (ret >= 0) goto cleanup_args;
 
index 5bcb149207dab08785fa88bb1c88bd30a8a94a12..2b80091ae16e74161cfbc6cac5ab84fe745b5623 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
@@ -2,19 +2,63 @@
  *  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 {
+                       vsyslog(level, fmt, args);
+               }
+#else
+               vsyslog(level, fmt, args);
+#endif
+               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 +72,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 */
@@ -46,8 +91,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 476b18b431488ad000d580dde83c8a8f8a25dd55..bce8e08f34b048e7cb796b9ce565de2323f1d701 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,
 )