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 e349de9..4750d2f 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 @@ -12,24 +12,36 @@ 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") + val level = logLevel.asSequence() + .map { when (it) { + 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 + } } + .filterNotNull() + .maxByOrNull(System.Logger.Level::ordinal) + ?: return LogWriterOutput.UNHANDLED + var domain: String? = null + var file: String? = null + var func: String? = null + var line: String? = null + var message: String? = null + for (field in fields) { + when (field.readKey()) { + "GLIB_DOMAIN" -> domain = field.readString() + "CODE_FILE" -> file = field.readString() + "CODE_FUNC" -> func = "::${field.readString()}" + "CODE_LINE" -> line = ":${field.readString()}" + "MESSAGE" -> message = field.readString() + } + } + if (domain == null || message == null) return LogWriterOutput.UNHANDLED + System.getLogger(domain).log(level, "{0}{1}{2}: {3}", file ?: "", line ?: "", func ?: "", 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)