diff --git a/src/basic/log.c b/src/basic/log.c index 53f8df634f2..12dfdce897e 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -40,8 +40,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; @@ -352,11 +351,10 @@ void log_forget_fds(void) { console_fd = kmsg_fd = syslog_fd = journal_fd = -1; } -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) { @@ -716,18 +714,17 @@ int log_dump_internal( const char *func, char *buffer) { - LogRealm realm = LOG_REALM_REMOVE_LEVEL(level); PROTECT_ERRNO; /* This modifies the buffer... */ - if (_likely_(LOG_PRI(level) > log_max_level[realm])) + if (_likely_(LOG_PRI(level) > log_max_level)) return -ERRNO_VALUE(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, @@ -736,11 +733,10 @@ int log_internalv_realm( const char *format, va_list ap) { - LogRealm realm = LOG_REALM_REMOVE_LEVEL(level); char buffer[LINE_MAX]; PROTECT_ERRNO; - if (_likely_(LOG_PRI(level) > log_max_level[realm])) + if (_likely_(LOG_PRI(level) > log_max_level)) return -ERRNO_VALUE(error); /* Make sure that %m maps to the specified error (or "Success"). */ @@ -751,7 +747,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, @@ -763,7 +759,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; @@ -785,7 +781,7 @@ int log_object_internalv( PROTECT_ERRNO; char *buffer, *b; - if (_likely_(LOG_PRI(level) > log_max_level[LOG_REALM_SYSTEMD])) + if (_likely_(LOG_PRI(level) > log_max_level)) return -ERRNO_VALUE(error); /* Make sure that %m maps to the specified error (or "Success"). */ @@ -838,9 +834,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; @@ -852,41 +847,38 @@ 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, +_noreturn_ void log_assert_failed( const char *text, const char *file, int line, const char *func) { - log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_CRIT), text, file, line, 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, +_noreturn_ void log_assert_failed_unreachable( const char *text, const char *file, int line, const char *func) { - log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_CRIT), text, file, line, 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, +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, + log_assert(LOG_DEBUG, text, file, line, func, "Assertion '%s' failed at %s:%u, function %s(). Ignoring."); } int log_oom_internal(int level, const char *file, int line, const char *func) { - return log_internal_realm(level, ENOMEM, file, line, func, "Out of memory."); + return log_internal(level, ENOMEM, file, line, func, "Out of memory."); } int log_format_iovec( @@ -941,13 +933,12 @@ int log_struct_internal( const char *func, const char *format, ...) { - LogRealm realm = LOG_REALM_REMOVE_LEVEL(level); char buf[LINE_MAX]; bool found = false; PROTECT_ERRNO; va_list ap; - if (_likely_(LOG_PRI(level) > log_max_level[realm]) || + if (_likely_(LOG_PRI(level) > log_max_level) || log_target == LOG_TARGET_NULL) return -ERRNO_VALUE(error); @@ -1041,12 +1032,11 @@ int log_struct_iovec_internal( const struct iovec input_iovec[], size_t n_input_iovec) { - LogRealm realm = LOG_REALM_REMOVE_LEVEL(level); PROTECT_ERRNO; size_t i; char *m; - if (_likely_(LOG_PRI(level) > log_max_level[realm]) || + if (_likely_(LOG_PRI(level) > log_max_level) || log_target == LOG_TARGET_NULL) return -ERRNO_VALUE(error); @@ -1101,14 +1091,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; } @@ -1167,17 +1157,17 @@ 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) { if (getpid_cached() == 1 || get_ctty_devnr(0, NULL) < 0) /* Only try to read the command line in daemons. We assume that anything that has a * controlling tty is user stuff. For PID1 we do a special check in case it hasn't * closed the console yet. */ (void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX); - log_parse_environment_cli_realm(realm); + log_parse_environment_cli(); } -void log_parse_environment_cli_realm(LogRealm realm) { +void log_parse_environment_cli(void) { /* Do not call from library code. */ const char *e; @@ -1187,7 +1177,7 @@ void log_parse_environment_cli_realm(LogRealm realm) { log_warning("Failed to parse log target '%s'. Ignoring.", e); e = 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 = getenv("SYSTEMD_LOG_COLOR"); @@ -1211,8 +1201,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) { @@ -1347,7 +1337,7 @@ int log_syntax_internal( va_list ap; const char *unit_fmt = NULL; - if (_likely_(LOG_PRI(level) > log_max_level[LOG_REALM_SYSTEMD]) || + if (_likely_(LOG_PRI(level) > log_max_level) || log_target == LOG_TARGET_NULL) return -ERRNO_VALUE(error); @@ -1363,7 +1353,7 @@ int log_syntax_internal( if (config_file) { if (config_line > 0) return log_struct_internal( - LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level), + level, error, file, line, func, "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR, @@ -1374,7 +1364,7 @@ int log_syntax_internal( NULL); else return log_struct_internal( - LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level), + level, error, file, line, func, "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR, @@ -1384,7 +1374,7 @@ int log_syntax_internal( NULL); } else if (unit) return log_struct_internal( - LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level), + level, error, file, line, func, "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR, @@ -1393,7 +1383,7 @@ int log_syntax_internal( NULL); else return log_struct_internal( - LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level), + level, error, file, line, func, "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR, diff --git a/src/basic/log.h b/src/basic/log.h index 89e95c9aa6b..9b106c57d8a 100644 --- a/src/basic/log.h +++ b/src/basic/log.h @@ -12,16 +12,6 @@ struct iovec; struct signalfd_siginfo; -typedef enum LogRealm { - LOG_REALM_SYSTEMD, - LOG_REALM_UDEV, - _LOG_REALM_MAX, -} LogRealm; - -#ifndef LOG_REALM -# define LOG_REALM LOG_REALM_SYSTEMD -#endif - typedef enum LogTarget{ LOG_TARGET_CONSOLE, LOG_TARGET_CONSOLE_PREFIXED, @@ -37,31 +27,22 @@ typedef enum LogTarget{ } LogTarget; /* Note to readers: << and >> have lower precedence than & and | */ -#define LOG_REALM_PLUS_LEVEL(realm, level) ((realm) << 10 | (level)) -#define LOG_REALM_REMOVE_LEVEL(realm_level) ((realm_level) >> 10) #define SYNTHETIC_ERRNO(num) (1 << 30 | (num)) #define IS_SYNTHETIC_ERRNO(val) ((val) >> 30 & 1) #define ERRNO_VALUE(val) (abs(val) & 255) +const char *log_target_to_string(LogTarget target) _const_; +LogTarget log_target_from_string(const char *s) _pure_; void log_set_target(LogTarget target); +int log_set_target_from_string(const char *e); +LogTarget log_get_target(void) _pure_; -void log_set_max_level_realm(LogRealm realm, int level); - -#define log_set_max_level(level) \ - log_set_max_level_realm(LOG_REALM, (level)) - -static inline void log_set_max_level_all_realms(int level) { - for (LogRealm realm = 0; realm < _LOG_REALM_MAX; realm++) - log_set_max_level_realm(realm, level); -} +void log_set_max_level(int level); +int log_set_max_level_from_string(const char *e); +int log_get_max_level(void) _pure_; void log_set_facility(int facility); -int log_set_target_from_string(const char *e); -int log_set_max_level_from_string_realm(LogRealm realm, const char *e); -#define log_set_max_level_from_string(e) \ - log_set_max_level_from_string_realm(LOG_REALM, (e)) - void log_show_color(bool b); bool log_get_show_color(void) _pure_; void log_show_location(bool b); @@ -76,15 +57,9 @@ int log_show_location_from_string(const char *e); int log_show_time_from_string(const char *e); int log_show_tid_from_string(const char *e); -LogTarget log_get_target(void) _pure_; -int log_get_max_level_realm(LogRealm realm) _pure_; -#define log_get_max_level() \ - log_get_max_level_realm(LOG_REALM) - /* Functions below that open and close logs or configure logging based on the * environment should not be called from library code — this is always a job - * for the application itself. - */ + * for the application itself. */ assert_cc(STRLEN(__FILE__) > STRLEN(RELATIVE_SOURCE_PATH) + 1); #define PROJECT_FILE (&__FILE__[STRLEN(RELATIVE_SOURCE_PATH) + 1]) @@ -93,12 +68,8 @@ int log_open(void); void log_close(void); void log_forget_fds(void); -void log_parse_environment_realm(LogRealm realm); -void log_parse_environment_cli_realm(LogRealm realm); -#define log_parse_environment() \ - log_parse_environment_realm(LOG_REALM) -#define log_parse_environment_cli() \ - log_parse_environment_cli_realm(LOG_REALM) +void log_parse_environment(void); +void log_parse_environment_cli(void); int log_dispatch_internal( int level, @@ -112,17 +83,15 @@ int log_dispatch_internal( const char *extra_field, char *buffer); -int log_internal_realm( +int log_internal( int level, int error, const char *file, int line, const char *func, const char *format, ...) _printf_(6,7); -#define log_internal(level, ...) \ - log_internal_realm(LOG_REALM_PLUS_LEVEL(LOG_REALM, (level)), __VA_ARGS__) -int log_internalv_realm( +int log_internalv( int level, int error, const char *file, @@ -130,10 +99,7 @@ int log_internalv_realm( const char *func, const char *format, va_list ap) _printf_(6,0); -#define log_internalv(level, ...) \ - log_internalv_realm(LOG_REALM_PLUS_LEVEL(LOG_REALM, (level)), __VA_ARGS__) -/* Realm is fixed to LOG_REALM_SYSTEMD for those */ int log_object_internalv( int level, int error, @@ -201,32 +167,23 @@ int log_dump_internal( char *buffer); /* Logging for various assertions */ -_noreturn_ void log_assert_failed_realm( - LogRealm realm, +_noreturn_ void log_assert_failed( const char *text, const char *file, int line, const char *func); -#define log_assert_failed(text, ...) \ - log_assert_failed_realm(LOG_REALM, (text), __VA_ARGS__) -_noreturn_ void log_assert_failed_unreachable_realm( - LogRealm realm, +_noreturn_ void log_assert_failed_unreachable( const char *text, const char *file, int line, const char *func); -#define log_assert_failed_unreachable(text, ...) \ - log_assert_failed_unreachable_realm(LOG_REALM, (text), __VA_ARGS__) -void log_assert_failed_return_realm( - LogRealm realm, +void log_assert_failed_return( const char *text, const char *file, int line, const char *func); -#define log_assert_failed_return(text, ...) \ - log_assert_failed_return_realm(LOG_REALM, (text), __VA_ARGS__) #define log_dispatch(level, error, buffer) \ log_dispatch_internal(level, error, PROJECT_FILE, __LINE__, __func__, NULL, NULL, NULL, NULL, buffer) @@ -267,29 +224,23 @@ int log_emergency_level(void); #endif /* Structured logging */ -#define log_struct_errno(level, error, ...) \ - log_struct_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \ - error, PROJECT_FILE, __LINE__, __func__, __VA_ARGS__, NULL) +#define log_struct_errno(level, error, ...) \ + log_struct_internal(level, error, PROJECT_FILE, __LINE__, __func__, __VA_ARGS__, NULL) #define log_struct(level, ...) log_struct_errno(level, 0, __VA_ARGS__) #define log_struct_iovec_errno(level, error, iovec, n_iovec) \ - log_struct_iovec_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \ - error, PROJECT_FILE, __LINE__, __func__, iovec, n_iovec) + log_struct_iovec_internal(level, error, PROJECT_FILE, __LINE__, __func__, iovec, n_iovec) #define log_struct_iovec(level, iovec, n_iovec) log_struct_iovec_errno(level, 0, iovec, n_iovec) /* This modifies the buffer passed! */ -#define log_dump(level, buffer) \ - log_dump_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \ - 0, PROJECT_FILE, __LINE__, __func__, buffer) +#define log_dump(level, buffer) \ + log_dump_internal(level, 0, PROJECT_FILE, __LINE__, __func__, buffer) -#define log_oom() log_oom_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, LOG_ERR), PROJECT_FILE, __LINE__, __func__) -#define log_oom_debug() log_oom_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, LOG_DEBUG), PROJECT_FILE, __LINE__, __func__) +#define log_oom() log_oom_internal(LOG_ERR, PROJECT_FILE, __LINE__, __func__) +#define log_oom_debug() log_oom_internal(LOG_DEBUG, PROJECT_FILE, __LINE__, __func__) bool log_on_console(void) _pure_; -const char *log_target_to_string(LogTarget target) _const_; -LogTarget log_target_from_string(const char *s) _pure_; - /* Helper to prepare various field for structured logging */ #define LOG_MESSAGE(fmt, ...) "MESSAGE=" fmt, ##__VA_ARGS__ diff --git a/src/shared/json.c b/src/shared/json.c index d559111248e..fe322129931 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -3891,7 +3891,7 @@ int json_log_internal( if (source && source_line > 0 && source_column > 0) return log_struct_internal( - LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level), + level, error, file, line, func, "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR, @@ -3902,7 +3902,7 @@ int json_log_internal( NULL); else if (source_line > 0 && source_column > 0) return log_struct_internal( - LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level), + level, error, file, line, func, "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR, @@ -3912,7 +3912,7 @@ int json_log_internal( NULL); else return log_struct_internal( - LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level), + level, error, file, line, func, "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR, diff --git a/src/test/test-log.c b/src/test/test-log.c index a2a53730efc..861309eb3aa 100644 --- a/src/test/test-log.c +++ b/src/test/test-log.c @@ -9,15 +9,6 @@ #include "string-util.h" #include "util.h" -assert_cc(LOG_REALM_REMOVE_LEVEL(LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, LOG_FTP | LOG_DEBUG)) - == LOG_REALM_SYSTEMD); -assert_cc(LOG_REALM_REMOVE_LEVEL(LOG_REALM_PLUS_LEVEL(LOG_REALM_UDEV, LOG_LOCAL7 | LOG_DEBUG)) - == LOG_REALM_UDEV); -assert_cc((LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, LOG_LOCAL3 | LOG_DEBUG) & LOG_FACMASK) - == LOG_LOCAL3); -assert_cc((LOG_REALM_PLUS_LEVEL(LOG_REALM_UDEV, LOG_USER | LOG_INFO) & LOG_PRIMASK) - == LOG_INFO); - assert_cc(IS_SYNTHETIC_ERRNO(SYNTHETIC_ERRNO(EINVAL))); assert_cc(!IS_SYNTHETIC_ERRNO(EINVAL)); assert_cc(IS_SYNTHETIC_ERRNO(SYNTHETIC_ERRNO(0)));