From a2eca852b71b917b8444a9ce792577baa516f06b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 21 Apr 2017 12:52:54 -0400 Subject: [PATCH 1/1] basic/log: expose log_dispatch This is useful when we want to avoid printf formatting on the message. It's nicer than using log_struct with "%s" as the format, because printf is slow and with a large message (like from a backtrace) this would require extra unnecessary memory. I'm not exposing all the fields in the wrapper: only level and errno. Those are the most likely to be useful. --- src/basic/log.c | 94 ++++++++++++++++++------------------------------- src/basic/log.h | 15 ++++++++ 2 files changed, 49 insertions(+), 60 deletions(-) diff --git a/src/basic/log.c b/src/basic/log.c index df1a775f1..a2285b4f5 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -58,8 +58,7 @@ #define SNDBUF_SIZE (8*1024*1024) static LogTarget log_target = LOG_TARGET_CONSOLE; -static int log_max_level[] = {LOG_INFO, LOG_INFO}; -assert_cc(ELEMENTSOF(log_max_level) == _LOG_REALM_MAX); +static int log_max_level = LOG_INFO; static int log_facility = LOG_DAEMON; static int console_fd = STDERR_FILENO; @@ -328,11 +327,10 @@ void log_forget_fds(void) { } #endif // 0 -void log_set_max_level_realm(LogRealm realm, int level) { +void log_set_max_level(int level) { assert((level & LOG_PRIMASK) == level); - assert(realm < ELEMENTSOF(log_max_level)); - log_max_level[realm] = level; + log_max_level = level; } void log_set_facility(int facility) { @@ -654,14 +652,13 @@ int log_dispatch_internal( } int log_dump_internal( - int level, - int error, - const char *file, - int line, - const char *func, - char *buffer) { + int level, + int error, + const char *file, + int line, + const char *func, + char *buffer) { - LogRealm realm = LOG_REALM_REMOVE_LEVEL(level); PROTECT_ERRNO; /* This modifies the buffer... */ @@ -669,13 +666,13 @@ int log_dump_internal( if (error < 0) error = -error; - if (_likely_(LOG_PRI(level) > log_max_level[realm])) + if (_likely_(LOG_PRI(level) > log_max_level)) return -error; return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer); } -int log_internalv_realm( +int log_internalv( int level, int error, const char *file, @@ -684,14 +681,13 @@ int log_internalv_realm( const char *format, va_list ap) { - LogRealm realm = LOG_REALM_REMOVE_LEVEL(level); - char buffer[LINE_MAX]; PROTECT_ERRNO; + char buffer[LINE_MAX]; if (error < 0) error = -error; - if (_likely_(LOG_PRI(level) > log_max_level[realm])) + if (_likely_(LOG_PRI(level) > log_max_level)) return -error; /* Make sure that %m maps to the specified error */ @@ -703,7 +699,7 @@ int log_internalv_realm( return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer); } -int log_internal_realm( +int log_internal( int level, int error, const char *file, @@ -715,7 +711,7 @@ int log_internal_realm( int r; va_start(ap, format); - r = log_internalv_realm(level, error, file, line, func, format, ap); + r = log_internalv(level, error, file, line, func, format, ap); va_end(ap); return r; @@ -741,7 +737,7 @@ int log_object_internalv( if (error < 0) error = -error; - if (_likely_(LOG_PRI(level) > log_max_level[LOG_REALM_SYSTEMD])) + if (_likely_(LOG_PRI(level) > log_max_level)) return -error; /* Make sure that %m maps to the specified error */ @@ -799,9 +795,8 @@ static void log_assert( const char *format) { static char buffer[LINE_MAX]; - LogRealm realm = LOG_REALM_REMOVE_LEVEL(level); - if (_likely_(LOG_PRI(level) > log_max_level[realm])) + if (_likely_(LOG_PRI(level) > log_max_level)) return; DISABLE_WARNING_FORMAT_NONLITERAL; @@ -813,42 +808,23 @@ static void log_assert( log_dispatch_internal(level, 0, file, line, func, NULL, NULL, NULL, NULL, buffer); } -noreturn void log_assert_failed_realm( - LogRealm realm, - const char *text, - const char *file, - int line, - const char *func) { - log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_CRIT), text, file, line, func, - "Assertion '%s' failed at %s:%u, function %s(). Aborting."); +noreturn void log_assert_failed(const char *text, const char *file, int line, const char *func) { + log_assert(LOG_CRIT, text, file, line, func, "Assertion '%s' failed at %s:%u, function %s(). Aborting."); abort(); } -noreturn void log_assert_failed_unreachable_realm( - LogRealm realm, - const char *text, - const char *file, - int line, - const char *func) { - log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_CRIT), text, file, line, func, - "Code should not be reached '%s' at %s:%u, function %s(). Aborting."); +noreturn void log_assert_failed_unreachable(const char *text, const char *file, int line, const char *func) { + log_assert(LOG_CRIT, text, file, line, func, "Code should not be reached '%s' at %s:%u, function %s(). Aborting."); abort(); } -void log_assert_failed_return_realm( - LogRealm realm, - const char *text, - const char *file, - int line, - const char *func) { +void log_assert_failed_return(const char *text, const char *file, int line, const char *func) { PROTECT_ERRNO; - log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_DEBUG), text, file, line, func, - "Assertion '%s' failed at %s:%u, function %s(). Ignoring."); + log_assert(LOG_DEBUG, text, file, line, func, "Assertion '%s' failed at %s:%u, function %s(). Ignoring."); } -int log_oom_internal(LogRealm realm, const char *file, int line, const char *func) { - log_internal_realm(LOG_REALM_PLUS_LEVEL(realm, LOG_ERR), - ENOMEM, file, line, func, "Out of memory."); +int log_oom_internal(const char *file, int line, const char *func) { + log_internal(LOG_ERR, ENOMEM, file, line, func, "Out of memory."); return -ENOMEM; } @@ -908,14 +884,13 @@ int log_struct_internal( char buf[LINE_MAX]; bool found = false; - LogRealm realm = LOG_REALM_REMOVE_LEVEL(level); PROTECT_ERRNO; va_list ap; if (error < 0) error = -error; - if (_likely_(LOG_PRI(level) > log_max_level[realm])) + if (_likely_(LOG_PRI(level) > log_max_level)) return -error; if (log_target == LOG_TARGET_NULL) @@ -1001,14 +976,14 @@ int log_set_target_from_string(const char *e) { return 0; } -int log_set_max_level_from_string_realm(LogRealm realm, const char *e) { +int log_set_max_level_from_string(const char *e) { int t; t = log_level_from_string(e); if (t < 0) return -EINVAL; - log_set_max_level_realm(realm, t); + log_set_max_level(t); return 0; } @@ -1056,7 +1031,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat return 0; } -void log_parse_environment_realm(LogRealm realm) { +void log_parse_environment(void) { const char *e; if (get_ctty_devnr(0, NULL) < 0) @@ -1069,7 +1044,7 @@ void log_parse_environment_realm(LogRealm realm) { log_warning("Failed to parse log target '%s'. Ignoring.", e); e = secure_getenv("SYSTEMD_LOG_LEVEL"); - if (e && log_set_max_level_from_string_realm(realm, e) < 0) + if (e && log_set_max_level_from_string(e) < 0) log_warning("Failed to parse log level '%s'. Ignoring.", e); e = secure_getenv("SYSTEMD_LOG_COLOR"); @@ -1085,8 +1060,8 @@ LogTarget log_get_target(void) { return log_target; } -int log_get_max_level_realm(LogRealm realm) { - return log_max_level[realm]; +int log_get_max_level(void) { + return log_max_level; } void log_show_color(bool b) { @@ -1194,7 +1169,7 @@ int log_syntax_internal( if (error < 0) error = -error; - if (_likely_(LOG_PRI(level) > log_max_level[LOG_REALM_SYSTEMD])) + if (_likely_(LOG_PRI(level) > log_max_level)) return -error; if (log_target == LOG_TARGET_NULL) @@ -1211,8 +1186,7 @@ int log_syntax_internal( unit_fmt = getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s"; return log_struct_internal( - LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level), - error, + level, error, file, line, func, "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR, "CONFIG_FILE=%s", config_file, diff --git a/src/basic/log.h b/src/basic/log.h index d4bc3a934..8353394ff 100644 --- a/src/basic/log.h +++ b/src/basic/log.h @@ -77,6 +77,18 @@ void log_close_console(void); void log_parse_environment(void); +int log_dispatch_internal( + int level, + int error, + const char *file, + int line, + const char *func, + const char *object_field, + const char *object, + const char *extra, + const char *extra_field, + char *buffer); + int log_internal( int level, int error, @@ -169,6 +181,9 @@ void log_assert_failed_return( int line, const char *func); +#define log_dispatch(level, error, buffer) \ + log_dispatch_internal(level, error, __FILE__, __LINE__, __func__, NULL, NULL, NULL, NULL, buffer) + /* Logging with level */ #define log_full_errno(level, error, ...) \ ({ \ -- 2.30.2