From: Lukáš Ježek Date: Tue, 18 May 2021 06:42:13 +0000 (+0200) Subject: log: lua interface X-Git-Tag: v5.4.0~2^2~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae3f586c9d1c131857b966e1e2c61d6dc5c361b8;p=thirdparty%2Fknot-resolver.git log: lua interface --- diff --git a/daemon/engine.c b/daemon/engine.c index 8617ef4b5..28349db59 100644 --- a/daemon/engine.c +++ b/daemon/engine.c @@ -74,6 +74,7 @@ static int l_help(lua_State *L) "package_version()\n return package version\n" "user(name[, group])\n change process user (and group)\n" "verbose(true|false)\n toggle verbose mode\n" + "set_log_level\n logging level (crit, err, warning, notice, info or debug)\n" "option(opt[, new_val])\n get/set server option\n" "mode(strict|normal|permissive)\n set resolver strictness level\n" "reorder_RR([true|false])\n set/get reordering of RRs within RRsets\n" @@ -152,6 +153,26 @@ static int l_verbose(lua_State *L) return 1; } +static int l_set_log_level(lua_State *L) +{ + if (lua_gettop(L) != 1 || !lua_isstring(L, 1)) { + lua_error_p(L, "takes one string parameter"); + return 0; + } + + log_level_t lvl = kr_log_name2level(lua_tostring(L, 1)); + + lua_pushinteger(L, kr_log_level_set(lvl)); + return 1; +} + +static int l_get_log_level(lua_State *L) +{ + printf("%s\n", kr_log_level2name(kr_log_level_get())); + + return 0; +} + char *engine_get_hostname(struct engine *engine) { static char hostname_str[KNOT_DNAME_MAXLEN]; if (!engine) { @@ -432,6 +453,10 @@ static int init_state(struct engine *engine) lua_setglobal(engine->L, "package_version"); lua_pushcfunction(engine->L, l_verbose); lua_setglobal(engine->L, "verbose"); + lua_pushcfunction(engine->L, l_set_log_level); + lua_setglobal(engine->L, "set_log_level"); + lua_pushcfunction(engine->L, l_get_log_level); + lua_setglobal(engine->L, "get_log_level"); lua_pushcfunction(engine->L, l_setuser); lua_setglobal(engine->L, "user"); lua_pushcfunction(engine->L, l_hint_root_file); diff --git a/daemon/main.c b/daemon/main.c index b57a9ebdf..f7e18896b 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, LOG_TARGET_STDOUT); + kr_log_init(LOG_DEFAULT_LEVEL, 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 2b80091ae..90228f2a9 100644 --- a/lib/log.c +++ b/lib/log.c @@ -18,7 +18,19 @@ int use_journal = 0; log_level_t kr_log_level = LOG_CRIT; log_target_t kr_log_target = LOG_TARGET_STDOUT; - +#ifndef SYSLOG_NAMES +syslog_code_t prioritynames[] = { + { "alert", LOG_ALERT }, + { "crit", LOG_CRIT }, + { "debug", LOG_DEBUG }, + { "emerg", LOG_EMERG }, + { "err", LOG_ERR }, + { "info", LOG_INFO }, + { "notice", LOG_NOTICE }, + { "warning", LOG_WARNING }, + { NULL, -1 }, +}; +#endif void kr_log_fmt(log_level_t level, const char *fmt, ...) { @@ -66,6 +78,28 @@ static void kres_gnutls_log(int level, const char *message) kr_log_debug("[gnutls] (%d) %s", level, message); } +char *kr_log_level2name(log_level_t level) +{ + for (int i = 0; prioritynames[i].c_name; ++i) + { + if (prioritynames[i].c_val == level) + return prioritynames[i].c_name; + } + + return NULL; +} + +log_level_t kr_log_name2level(const char *name) +{ + for (int i = 0; prioritynames[i].c_name; ++i) + { + if (strcmp(prioritynames[i].c_name, name) == 0) + return prioritynames[i].c_val; + } + + return -1; +} + int kr_log_level_set(log_level_t level) { if (level < LOG_CRIT || level > LOG_DEBUG) @@ -93,13 +127,12 @@ log_level_t kr_log_level_get(void) 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)); + kr_log_level_set(level); } diff --git a/lib/log.h b/lib/log.h index bce8e08f3..3395e83f3 100644 --- a/lib/log.h +++ b/lib/log.h @@ -8,6 +8,9 @@ #include #include "lib/defines.h" + +#define LOG_DEFAULT_LEVEL LOG_WARNING + typedef int log_level_t; typedef enum { @@ -28,6 +31,10 @@ KR_EXPORT log_level_t kr_log_level_get(void); KR_EXPORT void kr_log_init(log_level_t level, log_target_t target); +KR_EXPORT +char *kr_log_level2name(log_level_t level); +KR_EXPORT +log_level_t kr_log_name2level(const char *name); #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__) @@ -39,3 +46,14 @@ void kr_log_init(log_level_t level, log_target_t target); #define kr_log_deprecate(fmt, ...) kr_log_fmt(LOG_WARNING, "deprecation WARNING: " fmt, ## __VA_ARGS__) #define KR_LOG_LEVEL_IS(exp) ((kr_log_level >= (exp)) ? true : false) + + +#ifndef SYSLOG_NAMES +typedef struct _code { + char *c_name; + int c_val; +} syslog_code_t; + +KR_EXPORT +extern syslog_code_t prioritynames[]; +#endif