From: Lukáš Ježek Date: Thu, 13 May 2021 08:50:57 +0000 (+0200) Subject: log: add syslog target, systemd X-Git-Tag: v5.4.0~2^2~59 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1cb8c56cdd44d2e76ba6898ebc709fdb0fe3207;p=thirdparty%2Fknot-resolver.git log: add syslog target, systemd --- diff --git a/daemon/main.c b/daemon/main.c index e24a7653f..b57a9ebdf 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -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; diff --git a/lib/log.c b/lib/log.c index 5bcb14920..2b80091ae 100644 --- a/lib/log.c +++ b/lib/log.c @@ -2,19 +2,63 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +#include "kresconfig.h" + #include #include #include "lib/log.h" +#if ENABLE_LIBSYSTEMD +#include +#include +#include + +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)); } diff --git a/lib/log.h b/lib/log.h index 476b18b43..bce8e08f3 100644 --- a/lib/log.h +++ b/lib/log.h @@ -5,22 +5,29 @@ #pragma once #include +#include #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__) diff --git a/lib/meson.build b/lib/meson.build index 2098b343b..d02bfe99d 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -101,6 +101,7 @@ libkres_lib = library('kres', libdnssec, gnutls, luajit, + libsystemd, ], install: true, )