From ecbcabdc0517412b3e9508039d7e39c798699431 Mon Sep 17 00:00:00 2001 From: George Kiagiadakis <george.kiagiadakis@collabora.com> Date: Tue, 14 Apr 2020 14:59:55 +0300 Subject: [PATCH] debug: add support for redirecting pipewire's log to the glib one --- lib/wp/debug.c | 88 +++++++++++++++++++++++++++++++++++++++++++++----- lib/wp/debug.h | 3 ++ 2 files changed, 83 insertions(+), 8 deletions(-) diff --git a/lib/wp/debug.c b/lib/wp/debug.c index e12a86fe..4d7579b7 100644 --- a/lib/wp/debug.c +++ b/lib/wp/debug.c @@ -8,6 +8,7 @@ #include "debug.h" #include <pipewire/pipewire.h> +#include <spa/support/log.h> static gsize initialized = 0; static gboolean use_color = FALSE; @@ -55,18 +56,19 @@ struct common_fields */ static const struct { GLogLevelFlags log_level; + enum spa_log_level spa_level; gchar name[6]; gchar priority[2]; gchar color[8]; } log_level_info[] = { - { 0, "UNK ", "5", COLOR_BRIGHT_RED }, - { G_LOG_LEVEL_ERROR, "ERROR", "3", COLOR_RED }, - { G_LOG_LEVEL_CRITICAL, "CRIT ", "4", COLOR_BRIGHT_MAGENTA }, - { G_LOG_LEVEL_WARNING, "WARN ", "4", COLOR_BRIGHT_YELLOW }, - { G_LOG_LEVEL_MESSAGE, "MSG ", "5", COLOR_BRIGHT_GREEN }, - { G_LOG_LEVEL_INFO, "INFO ", "6", COLOR_GREEN }, - { G_LOG_LEVEL_DEBUG, "DEBUG", "7", COLOR_CYAN }, - { WP_LOG_LEVEL_TRACE, "TRACE", "7", COLOR_YELLOW }, + { 0, 0, "UNK ", "5", COLOR_BRIGHT_RED }, + { G_LOG_LEVEL_ERROR, SPA_LOG_LEVEL_ERROR,"ERROR", "3", COLOR_RED }, + { G_LOG_LEVEL_CRITICAL,0, "CRIT ", "4", COLOR_BRIGHT_MAGENTA }, + { G_LOG_LEVEL_WARNING, SPA_LOG_LEVEL_WARN, "WARN ", "4", COLOR_BRIGHT_YELLOW }, + { G_LOG_LEVEL_MESSAGE, 0, "MSG ", "5", COLOR_BRIGHT_GREEN }, + { G_LOG_LEVEL_INFO, SPA_LOG_LEVEL_INFO, "INFO ", "6", COLOR_GREEN }, + { G_LOG_LEVEL_DEBUG, SPA_LOG_LEVEL_DEBUG,"DEBUG", "7", COLOR_CYAN }, + { WP_LOG_LEVEL_TRACE, SPA_LOG_LEVEL_TRACE,"TRACE", "7", COLOR_YELLOW }, }; /* map glib's log levels, which are flags in the range (1<<2) to (1<<8), @@ -81,6 +83,15 @@ log_level_index (GLogLevelFlags log_level) return (logarithm >= 2 && logarithm <= 8) ? (logarithm - 1) : 0; } +static inline gint +spa_log_level_index (enum spa_log_level lvl) +{ + for (gint i = 1; i < SPA_N_ELEMENTS (log_level_info); i++) + if (lvl == log_level_info[i].spa_level) + return i; + return 0; +} + static void wp_debug_initialize (void) { @@ -319,3 +330,64 @@ wp_log_structured_standard ( g_log_structured_array (log_level, fields, n_fields); } + +static void +wp_spa_log_logv (void *object, + enum spa_log_level level, + const char *file, + int line, + const char *func, + const char *fmt, + va_list args) +{ + g_autofree gchar *message = NULL; + gchar line_str[11]; + GLogField fields[] = { + { "PRIORITY", NULL, -1 }, + { "CODE_FILE", file, -1 }, + { "CODE_LINE", line_str, -1 }, + { "CODE_FUNC", func, -1 }, + { "MESSAGE", NULL, -1 }, + { "GLIB_DOMAIN", "pw-lib", -1 }, + }; + + gint log_level_idx = spa_log_level_index (level); + GLogLevelFlags log_level = log_level_info[log_level_idx].log_level; + fields[0].value = log_level_info[log_level_idx].priority; + + sprintf (line_str, "%d", line); + fields[4].value = message = g_strdup_vprintf (fmt, args); + + g_log_structured_array (log_level, fields, SPA_N_ELEMENTS (fields)); +} + +static void +wp_spa_log_log (void *object, + enum spa_log_level level, + const char *file, + int line, + const char *func, + const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + wp_spa_log_logv (object, level, file, line, func, fmt, args); + va_end (args); +} + +static const struct spa_log_methods wp_spa_log_methods = { + SPA_VERSION_LOG_METHODS, + .log = wp_spa_log_log, + .logv = wp_spa_log_logv, +}; + +static struct spa_log wp_spa_log = { + .iface = { SPA_TYPE_INTERFACE_Log, SPA_VERSION_LOG, { &wp_spa_log_methods, NULL } }, + .level = SPA_LOG_LEVEL_INFO, +}; + +void +wp_install_glib_pw_log (void) +{ + pw_log_set (&wp_spa_log); +} diff --git a/lib/wp/debug.h b/lib/wp/debug.h index 9bfe366e..c74f81b4 100644 --- a/lib/wp/debug.h +++ b/lib/wp/debug.h @@ -72,6 +72,9 @@ void wp_log_structured_standard (const gchar *log_domain, #define wp_trace_boxed(type, object, ...) \ wp_log (WP_LOG_LEVEL_TRACE, type, object, __VA_ARGS__) +WP_API +void wp_install_glib_pw_log (void); + G_END_DECLS #endif -- GitLab