execute: Drop log level to unit log level in exec_spawn()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 31 Jul 2024 11:11:51 +0000 (13:11 +0200)
committerLuca Boccassi <bluca@debian.org>
Thu, 15 Aug 2024 13:04:41 +0000 (14:04 +0100)
All messages logged from exec_spawn() are attributed to the unit
and as such we should set the log level to the unit's max log level
for the duration of the function.

(cherry picked from commit 7881f485c9f57b1c7de4308eeab54458890c5c19)

src/basic/log.c
src/basic/log.h
src/core/execute.c

index 13ad19a051ffc0f548418b386b2e3cd9ce0ae3ad..48663dacb145b16a63b1bec0efb2f99ad4d0a972 100644 (file)
@@ -395,9 +395,10 @@ void log_forget_fds(void) {
         console_fd_is_tty = -1;
 }
 
-void log_set_max_level(int level) {
+int log_set_max_level(int level) {
         assert(level == LOG_NULL || LOG_PRI(level) == level);
 
+        int old = log_max_level;
         log_max_level = level;
 
         /* Also propagate max log level to libc's syslog(), just in case some other component loaded into our
@@ -410,6 +411,8 @@ void log_set_max_level(int level) {
 
         /* Ensure that our own LOG_NULL define maps sanely to the log mask */
         assert_cc(LOG_UPTO(LOG_NULL) == 0);
+
+        return old;
 }
 
 void log_set_facility(int facility) {
index ba2383f3fe5e2f33acaa5c242c9afc58bd6d2061..4543556fcbaf754d663d375e99dc46cb229c75fe 100644 (file)
@@ -56,7 +56,7 @@ int log_set_target_from_string(const char *e);
 LogTarget log_get_target(void) _pure_;
 void log_settle_target(void);
 
-void log_set_max_level(int level);
+int log_set_max_level(int level);
 int log_set_max_level_from_string(const char *e);
 int log_get_max_level(void) _pure_;
 int log_max_levels_to_string(int level, char **ret);
@@ -491,6 +491,15 @@ size_t log_context_num_contexts(void);
 /* Returns the number of fields in all attached log contexts. */
 size_t log_context_num_fields(void);
 
+static inline void _reset_log_level(int *saved_log_level) {
+        assert(saved_log_level);
+
+        log_set_max_level(*saved_log_level);
+}
+
+#define LOG_CONTEXT_SET_LOG_LEVEL(level) \
+        _cleanup_(_reset_log_level) _unused_ int _saved_log_level_ = log_set_max_level(level);
+
 #define LOG_CONTEXT_PUSH(...) \
         LOG_CONTEXT_PUSH_STRV(STRV_MAKE(__VA_ARGS__))
 
index 513e95e09d7195c7569564b8880689942fec1511..f74665fcd7b9a3667a439f2c0cec2c3c6a627572 100644 (file)
@@ -379,6 +379,7 @@ int exec_spawn(
         assert(ret);
 
         LOG_CONTEXT_PUSH_UNIT(unit);
+        LOG_CONTEXT_SET_LOG_LEVEL(context->log_level_max >= 0 ? context->log_level_max : log_get_max_level());
 
         r = exec_context_load_environment(unit, context, &params->files_env);
         if (r < 0)