Module: Mesa Branch: main Commit: 7d8d64426b1e378ff9f667f5933789f06294da1f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7d8d64426b1e378ff9f667f5933789f06294da1f
Author: Chia-I Wu <[email protected]> Date: Fri Feb 17 16:15:21 2023 -0800 util/log: add logger_syslog This is useful when the app is a daemon. Reviewed-by: Emma Anholt <[email protected]> Reviewed-by: Jesse Natalie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21454> --- src/util/log.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/util/log.c b/src/util/log.c index fa1c58cc970..d45bb51e61e 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -31,6 +31,11 @@ #include "util/ralloc.h" #include "util/u_debug.h" +#if DETECT_OS_UNIX +#include <syslog.h> +#include "util/u_process.h" +#endif + #if DETECT_OS_ANDROID #include <android/log.h> #endif @@ -38,7 +43,8 @@ enum mesa_log_control { MESA_LOG_CONTROL_NULL = 1 << 0, MESA_LOG_CONTROL_FILE = 1 << 1, - MESA_LOG_CONTROL_ANDROID = 1 << 2, + MESA_LOG_CONTROL_SYSLOG = 1 << 2, + MESA_LOG_CONTROL_ANDROID = 1 << 3, MESA_LOG_CONTROL_LOGGER_MASK = 0xff, MESA_LOG_CONTROL_WAIT = 1 << 8, @@ -48,6 +54,7 @@ static const struct debug_control mesa_log_control_options[] = { /* loggers */ { "null", MESA_LOG_CONTROL_NULL }, { "file", MESA_LOG_CONTROL_FILE }, + { "syslog", MESA_LOG_CONTROL_SYSLOG }, { "android", MESA_LOG_CONTROL_ANDROID }, /* flags */ { "wait", MESA_LOG_CONTROL_WAIT }, @@ -70,6 +77,11 @@ mesa_log_init_once(void) mesa_log_control |= MESA_LOG_CONTROL_FILE; #endif } + +#if DETECT_OS_UNIX + if (mesa_log_control & MESA_LOG_CONTROL_SYSLOG) + openlog(util_get_process_name(), LOG_NDELAY | LOG_PID, LOG_USER); +#endif } static void @@ -186,6 +198,39 @@ logger_file(enum mesa_log_level level, free(msg); } +#if DETECT_OS_UNIX + +static inline int +level_to_syslog(enum mesa_log_level l) +{ + switch (l) { + case MESA_LOG_ERROR: return LOG_ERR; + case MESA_LOG_WARN: return LOG_WARNING; + case MESA_LOG_INFO: return LOG_INFO; + case MESA_LOG_DEBUG: return LOG_DEBUG; + } + + unreachable("bad mesa_log_level"); +} + +static void +logger_syslog(enum mesa_log_level level, + const char *tag, + const char *format, + va_list va) +{ + char local_msg[1024]; + char *msg = logger_vasnprintf(local_msg, sizeof(local_msg), + LOGGER_VASNPRINTF_AFFIX_TAG, level, tag, format, va); + + syslog(level_to_syslog(level), "%s", msg); + + if (msg != local_msg) + free(msg); +} + +#endif /* DETECT_OS_UNIX */ + #if DETECT_OS_ANDROID static inline android_LogPriority @@ -252,6 +297,9 @@ mesa_log_v(enum mesa_log_level level, const char *tag, const char *format, va_list va); } loggers[] = { { MESA_LOG_CONTROL_FILE, logger_file }, +#if DETECT_OS_UNIX + { MESA_LOG_CONTROL_SYSLOG, logger_syslog }, +#endif #if DETECT_OS_ANDROID { MESA_LOG_CONTROL_ANDROID, logger_android }, #endif
