From 3d85f9ec12ecdc9ce9e8ba06f616276e6c0867a1 Mon Sep 17 00:00:00 2001 From: JFronny Date: Sun, 7 Jul 2024 16:16:00 +0200 Subject: [PATCH] feat(gtk): redirect GTK logs through our custom logger --- .../io/gitlab/jfronny/inceptum/gtk/GtkMain.kt | 2 ++ .../gitlab/jfronny/inceptum/gtk/util/Log.kt | 33 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/GtkMain.kt b/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/GtkMain.kt index 70e1634..5c8b7d8 100644 --- a/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/GtkMain.kt +++ b/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/GtkMain.kt @@ -2,6 +2,7 @@ package io.gitlab.jfronny.inceptum.gtk import io.gitlab.jfronny.inceptum.common.BuildMetadata import io.gitlab.jfronny.inceptum.common.MetaHolder +import io.gitlab.jfronny.inceptum.gtk.util.GtkLog import io.gitlab.jfronny.inceptum.gtk.util.Log import io.gitlab.jfronny.inceptum.gtk.window.MainWindow import io.gitlab.jfronny.inceptum.launcher.LauncherEnv @@ -19,6 +20,7 @@ object GtkMain { @Throws(IOException::class) @JvmStatic fun main(args: Array) { + GLib.logSetWriterFunc(GtkLog) LauncherEnv.initialize(GtkEnvBackend) Log.info("Launching Inceptum v" + BuildMetadata.VERSION) Log.info("Loading from " + MetaHolder.BASE_PATH) diff --git a/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/util/Log.kt b/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/util/Log.kt index e9832bf..e349de9 100644 --- a/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/util/Log.kt +++ b/launcher-gtk/src/main/kotlin/io/gitlab/jfronny/inceptum/gtk/util/Log.kt @@ -2,5 +2,36 @@ package io.gitlab.jfronny.inceptum.gtk.util import io.gitlab.jfronny.commons.logger.SystemLoggerPlus import io.gitlab.jfronny.inceptum.common.Utils +import org.gnome.glib.LogField +import org.gnome.glib.LogLevelFlags +import org.gnome.glib.LogWriterFunc +import org.gnome.glib.LogWriterOutput -object Log : SystemLoggerPlus by Utils.LOGGER \ No newline at end of file +object Log : SystemLoggerPlus by Utils.LOGGER +object GtkLog : LogWriterFunc { + // Based on https://github.com/jwharm/java-gi-examples/blob/6e08b4d2e62998c53d855b32433513308e01e82d/Logging/src/main/java/io/github/jwharm/javagi/examples/logging/SLF4JLogWriterFunc.java + // Original license: LGPL-2.1, written by Jan-Willem Harmannij + override fun run(logLevel: Set, fields: Array): LogWriterOutput { + val level = logLevel.firstOrNull()?.let { convertLevel(it) } ?: return LogWriterOutput.UNHANDLED + val domain = readStringFromKey("GLIB_DOMAIN", fields) ?: return LogWriterOutput.UNHANDLED + val message = readStringFromKey("MESSAGE", fields) ?: return LogWriterOutput.UNHANDLED + val source = readStringFromKey("CODE_FILE", fields) ?: "" + val func = readStringFromKey("CODE_FUNC", fields)?.let { "::$it" } ?: "" + val line = readStringFromKey("CODE_LINE", fields)?.let { ":$it" } ?: "" + System.getLogger(domain).log(level, "$source$func$line: $message") + return LogWriterOutput.HANDLED + } + + private fun convertLevel(flag: LogLevelFlags) = when (flag) { + LogLevelFlags.LEVEL_ERROR, LogLevelFlags.LEVEL_CRITICAL -> System.Logger.Level.ERROR + LogLevelFlags.LEVEL_WARNING -> System.Logger.Level.WARNING + LogLevelFlags.LEVEL_MESSAGE, LogLevelFlags.LEVEL_INFO -> System.Logger.Level.INFO + LogLevelFlags.LEVEL_DEBUG -> System.Logger.Level.DEBUG + else -> null + } + private fun readStringFromKey(key: String, logFields: Array) = logFields.firstOrNull { it.readKey() == key }?.readString() + private fun LogField.readString(): String { + val length = readLength() + return readValue().reinterpret(if (length == -1L) Long.MAX_VALUE else length).getString(0) + } +} \ No newline at end of file