]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
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)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 31 Jul 2024 11:12:55 +0000 (13:12 +0200)
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.

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

index a8056d2635b288a578fa05fbce3b87636914b073..09500f9cb05201f986d12e3f153dabae8e61ccfa 100644 (file)
@@ -396,9 +396,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
@@ -411,6 +412,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 2da6d5767d67d1884cef74ed131dc8fa0f8ef393..0412e8a8715024177ba189458af3e2631c32abdf 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 cdc12779564e1aba6c48323fc67c9a10efef3e01..26b2c0fb4afd18a4b0065e69394cb9f74760e078 100644 (file)
@@ -396,6 +396,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)