feat(gtk): redirect GTK logs through our custom logger
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/push/docs Pipeline was successful

This commit is contained in:
Johannes Frohnmeyer 2024-07-07 16:16:00 +02:00
parent fb58da96c8
commit 3d85f9ec12
Signed by: Johannes
GPG Key ID: E76429612C2929F4
2 changed files with 34 additions and 1 deletions

View File

@ -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<String>) {
GLib.logSetWriterFunc(GtkLog)
LauncherEnv.initialize(GtkEnvBackend)
Log.info("Launching Inceptum v" + BuildMetadata.VERSION)
Log.info("Loading from " + MetaHolder.BASE_PATH)

View File

@ -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
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<LogLevelFlags>, fields: Array<LogField>): 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) ?: "<unknown>"
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<LogField>) = 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)
}
}