From e1672f97625a3db6844f8054c9e45109eadc5cc6 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 10 Sep 2021 08:51:52 +1000 Subject: [PATCH] pipewire: allow for log level names in PIPEWIRE_DEBUG Allow one of "XEWIDT" to refer to none, errors, warnings, info, debug and trace, respectively because they're immediately recognizable. Well, except maybe the X. PIPEWIRE_DEBUG="I" is equivalent to PIPEWIRE_DEBUG="3" for example. --- INSTALL.md | 2 +- README.md | 4 +++- doc/pipewire-daemon.dox | 12 +++++------ src/pipewire/pipewire.c | 13 ++++++++++-- test/test-logger.c | 46 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 10 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 45beba17d..1295213ee 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -76,7 +76,7 @@ variable like so: ``` cd builddir/ -PIPEWIRE_DEBUG=4 make run +PIPEWIRE_DEBUG="D" make run ``` You might have to stop the pipewire service/socket that might have been diff --git a/README.md b/README.md index ff0a45394..bf91478b2 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,9 @@ or with the provided scripts shown below. PipeWire can use environment variables to control the behaviour of applications: -* `PIPEWIRE_DEBUG=` to increase the debug level +* `PIPEWIRE_DEBUG=` to increase the debug level (or use one of + `XEWIDT` for none, error, warnings, info, + debug, or trace, respectively). * `PIPEWIRE_LOG=` to redirect log to filename * `PIPEWIRE_LOG_SYSTEMD=false` to disable logging to systemd journal * `PIPEWIRE_LATENCY=` to configure latency as a fraction. 10/1000 diff --git a/doc/pipewire-daemon.dox b/doc/pipewire-daemon.dox index 4276ffcdd..75995bd66 100644 --- a/doc/pipewire-daemon.dox +++ b/doc/pipewire-daemon.dox @@ -132,12 +132,12 @@ more debugging. The format is: `[,,...]` - `` specifies the log level: - + `0`: no logging is enabled - + `1`: Error logging is enabled - + `2`: Warnings are enabled - + `3`: Informational messages are enabled - + `4`: Debug messages are enabled - + `5`: Trace messages are enabled. These messages can be logged + + `X` or `0`: no logging is enabled + + `E` or `1`: Error logging is enabled + + `W` or `2`: Warnings are enabled + + `I` or `3`: Informational messages are enabled + + `D` or `4`: Debug messages are enabled + + `T` or `5`: Trace messages are enabled. These messages can be logged from the realtime threads. - ``: Specifies a string category to enable. Many categories diff --git a/src/pipewire/pipewire.c b/src/pipewire/pipewire.c index e2bfa8f79..64d45ede0 100644 --- a/src/pipewire/pipewire.c +++ b/src/pipewire/pipewire.c @@ -215,8 +215,17 @@ static void configure_debug(struct support *support, const char *str) int n_tokens; level = pw_split_strv(str, ":", INT_MAX, &n_tokens); - if (n_tokens > 0) - pw_log_set_level(atoi(level[0])); + if (n_tokens > 0) { + switch (level[0][0]) { + case 'X': pw_log_set_level(SPA_LOG_LEVEL_NONE); break; + case 'E': pw_log_set_level(SPA_LOG_LEVEL_ERROR); break; + case 'W': pw_log_set_level(SPA_LOG_LEVEL_WARN); break; + case 'I': pw_log_set_level(SPA_LOG_LEVEL_INFO); break; + case 'D': pw_log_set_level(SPA_LOG_LEVEL_DEBUG); break; + case 'T': pw_log_set_level(SPA_LOG_LEVEL_TRACE); break; + default: pw_log_set_level(atoi(level[0])); break; + } + } if (n_tokens > 1) support->categories = pw_split_strv(level[1], ",", INT_MAX, &n_tokens); diff --git a/test/test-logger.c b/test/test-logger.c index 4af9801db..ffa6dcdfb 100644 --- a/test/test-logger.c +++ b/test/test-logger.c @@ -243,6 +243,49 @@ PWTEST(logger_debug_env) return PWTEST_PASS; } +PWTEST(logger_debug_env_alpha) +{ + enum spa_log_level level = pwtest_get_iteration(current_test); + enum spa_log_level default_level = pw_log_level; + struct spa_log *default_logger = pw_log_get(); + char *lvl; + char *oldenv = getenv("PIPEWIRE_DEBUG"); + + if (oldenv) + oldenv = strdup(oldenv); + + switch(level) { + case SPA_LOG_LEVEL_NONE: lvl = "X"; break; + case SPA_LOG_LEVEL_ERROR: lvl = "E"; break; + case SPA_LOG_LEVEL_WARN: lvl = "W"; break; + case SPA_LOG_LEVEL_INFO: lvl = "I"; break; + case SPA_LOG_LEVEL_DEBUG: lvl = "D"; break; + case SPA_LOG_LEVEL_TRACE: lvl = "T"; break; + default: + pwtest_fail_if_reached(); + break; + } + setenv("PIPEWIRE_DEBUG", lvl, 1); + + /* Disable logging, let PIPEWIRE_DEBUG set the level */ + pw_log_set_level(SPA_LOG_LEVEL_NONE); + + test_log_levels(level); + + if (oldenv) { + setenv("PIPEWIRE_DEBUG", oldenv, 1); + free(oldenv); + } else { + unsetenv("PIPEWIRE_DEBUG"); + } + + pw_log_set(default_logger); + pw_log_set_level(default_level); + pw_deinit(); + + return PWTEST_PASS; +} + PWTEST_SUITE(logger) { pwtest_add(logger_truncate_long_lines, PWTEST_NOARG); @@ -253,6 +296,9 @@ PWTEST_SUITE(logger) pwtest_add(logger_debug_env, PWTEST_ARG_RANGE, SPA_LOG_LEVEL_NONE, SPA_LOG_LEVEL_TRACE + 1, PWTEST_NOARG); + pwtest_add(logger_debug_env_alpha, + PWTEST_ARG_RANGE, SPA_LOG_LEVEL_NONE, SPA_LOG_LEVEL_TRACE + 1, + PWTEST_NOARG); return PWTEST_PASS; }