From 05b9ad205aced4cb89227f129b85acd98450c3c4 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Fri, 1 Sep 2023 00:32:27 +0200 Subject: [PATCH 1/4] Set graphql logs to error level Set log level for loggers with names - ExecutionStrategy (spams logs with "... completing field ...") - notprivacysafe (logs every received request up to 4 times (received, parse, validate, execute)) --- .../Config/src/main/java/xyz/nulldev/ts/config/Logging.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt index 19bfc6ba3b..eaa1555c7a 100644 --- a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt +++ b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt @@ -63,6 +63,11 @@ fun initLoggerConfig(appRootPath: String) { // set "kotlin exposed" log level context.getLogger("Exposed").level = Level.ERROR + + // gql "ExecutionStrategy" spams logs with "... completing field ..." + // gql "notprivacysafe" logs every received request multiple times (received, parsing, validating, executing) + context.getLogger("graphql").level = Level.ERROR + context.getLogger("notprivacysafe").level = Level.ERROR } fun setLogLevel(level: Level) { From bd06904796356bcd4a0f0c7e814bb5e47813f52a Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Fri, 1 Sep 2023 00:41:49 +0200 Subject: [PATCH 2/4] Extract logic to get logger for name into function --- .../src/main/java/xyz/nulldev/ts/config/Logging.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt index eaa1555c7a..fde6a9e5c2 100644 --- a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt +++ b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt @@ -55,6 +55,11 @@ private fun getBaseLogger(): ch.qos.logback.classic.Logger { return (KotlinLogging.logger(Logger.ROOT_LOGGER_NAME).underlyingLogger as ch.qos.logback.classic.Logger) } +private fun getLogger(name: String): ch.qos.logback.classic.Logger { + val context = LoggerFactory.getILoggerFactory() as LoggerContext + return context.getLogger(name) +} + fun initLoggerConfig(appRootPath: String) { val context = LoggerFactory.getILoggerFactory() as LoggerContext val logger = getBaseLogger() @@ -62,12 +67,12 @@ fun initLoggerConfig(appRootPath: String) { logger.addAppender(createRollingFileAppender(context, "$appRootPath/logs")) // set "kotlin exposed" log level - context.getLogger("Exposed").level = Level.ERROR + getLogger("Exposed").level = Level.ERROR // gql "ExecutionStrategy" spams logs with "... completing field ..." // gql "notprivacysafe" logs every received request multiple times (received, parsing, validating, executing) - context.getLogger("graphql").level = Level.ERROR - context.getLogger("notprivacysafe").level = Level.ERROR + getLogger("graphql").level = Level.ERROR + getLogger("notprivacysafe").level = Level.ERROR } fun setLogLevel(level: Level) { From bab5e13572b8d242894cb6b415a5a34a63d7f332 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Fri, 1 Sep 2023 00:41:27 +0200 Subject: [PATCH 3/4] Add function to set log level for a logger --- .../xyz/nulldev/ts/config/ConfigManager.kt | 2 +- .../main/java/xyz/nulldev/ts/config/Logging.kt | 18 +++++++++++++----- .../suwayomi/tachidesk/server/ServerSetup.kt | 7 ++++--- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/ConfigManager.kt b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/ConfigManager.kt index 2446d579a0..e3823517f4 100644 --- a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/ConfigManager.kt +++ b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/ConfigManager.kt @@ -79,7 +79,7 @@ open class ConfigManager { // set log level early if (debugLogsEnabled(config)) { - setLogLevel(Level.DEBUG) + setLogLevelFor(BASE_LOGGER_NAME, Level.DEBUG) } return config diff --git a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt index fde6a9e5c2..8a1ffb1a90 100644 --- a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt +++ b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt @@ -67,16 +67,24 @@ fun initLoggerConfig(appRootPath: String) { logger.addAppender(createRollingFileAppender(context, "$appRootPath/logs")) // set "kotlin exposed" log level - getLogger("Exposed").level = Level.ERROR + setLogLevelFor("Exposed", Level.ERROR) // gql "ExecutionStrategy" spams logs with "... completing field ..." // gql "notprivacysafe" logs every received request multiple times (received, parsing, validating, executing) - getLogger("graphql").level = Level.ERROR - getLogger("notprivacysafe").level = Level.ERROR + setLogLevelFor("graphql", Level.ERROR) + setLogLevelFor("notprivacysafe", Level.ERROR) } -fun setLogLevel(level: Level) { - getBaseLogger().level = level +const val BASE_LOGGER_NAME = "_BaseLogger" + +fun setLogLevelFor(name: String, level: Level) { + val logger = if (name == BASE_LOGGER_NAME) { + getBaseLogger() + } else { + getLogger(name) + } + + logger.level = level } fun debugLogsEnabled(config: Config) = diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/ServerSetup.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/ServerSetup.kt index dad9d68d3c..4e1fbff0fb 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/ServerSetup.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/ServerSetup.kt @@ -32,10 +32,11 @@ import suwayomi.tachidesk.server.util.SystemTray import xyz.nulldev.androidcompat.AndroidCompat import xyz.nulldev.androidcompat.AndroidCompatInitializer import xyz.nulldev.ts.config.ApplicationRootDir +import xyz.nulldev.ts.config.BASE_LOGGER_NAME import xyz.nulldev.ts.config.ConfigKodeinModule import xyz.nulldev.ts.config.GlobalConfigManager import xyz.nulldev.ts.config.initLoggerConfig -import xyz.nulldev.ts.config.setLogLevel +import xyz.nulldev.ts.config.setLogLevelFor import java.io.File import java.security.Security import java.util.Locale @@ -75,9 +76,9 @@ fun applicationSetup() { serverConfig.subscribeTo(serverConfig.debugLogsEnabled, { debugLogsEnabled -> if (debugLogsEnabled) { - setLogLevel(Level.DEBUG) + setLogLevelFor(BASE_LOGGER_NAME, Level.DEBUG) } else { - setLogLevel(Level.INFO) + setLogLevelFor(BASE_LOGGER_NAME, Level.INFO) } }, ignoreInitialValue = false) From 40e44152b6addef0a9cf9ba2e31028ac077ead8a Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Fri, 1 Sep 2023 01:01:37 +0200 Subject: [PATCH 4/4] Add settings to enable graphql debug logging --- .../java/xyz/nulldev/ts/config/Logging.kt | 5 ---- .../suwayomi/tachidesk/server/ServerConfig.kt | 1 + .../suwayomi/tachidesk/server/ServerSetup.kt | 24 ++++++++++++------- .../src/main/resources/server-reference.conf | 1 + .../src/test/resources/server-reference.conf | 1 + 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt index 8a1ffb1a90..883bce0cf7 100644 --- a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt +++ b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/Logging.kt @@ -68,11 +68,6 @@ fun initLoggerConfig(appRootPath: String) { // set "kotlin exposed" log level setLogLevelFor("Exposed", Level.ERROR) - - // gql "ExecutionStrategy" spams logs with "... completing field ..." - // gql "notprivacysafe" logs every received request multiple times (received, parsing, validating, executing) - setLogLevelFor("graphql", Level.ERROR) - setLogLevelFor("notprivacysafe", Level.ERROR) } const val BASE_LOGGER_NAME = "_BaseLogger" diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/ServerConfig.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/ServerConfig.kt index fe94b6f59f..f0e574f2a5 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/ServerConfig.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/ServerConfig.kt @@ -90,6 +90,7 @@ class ServerConfig(getConfig: () -> Config, val moduleName: String = SERVER_CONF // misc val debugLogsEnabled: MutableStateFlow by OverrideConfigValue(BooleanConfigAdapter) + val gqlDebugLogsEnabled: MutableStateFlow by OverrideConfigValue(BooleanConfigAdapter) val systemTrayEnabled: MutableStateFlow by OverrideConfigValue(BooleanConfigAdapter) // backup diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/ServerSetup.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/ServerSetup.kt index 4e1fbff0fb..c0ea6863d6 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/ServerSetup.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/ServerSetup.kt @@ -13,6 +13,7 @@ import eu.kanade.tachiyomi.App import eu.kanade.tachiyomi.source.local.LocalSource import io.javalin.plugin.json.JavalinJackson import io.javalin.plugin.json.JsonMapper +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.serialization.json.Json import mu.KotlinLogging @@ -74,19 +75,26 @@ fun applicationSetup() { ServerConfig.register { GlobalConfigManager.config } ) - serverConfig.subscribeTo(serverConfig.debugLogsEnabled, { debugLogsEnabled -> - if (debugLogsEnabled) { - setLogLevelFor(BASE_LOGGER_NAME, Level.DEBUG) - } else { - setLogLevelFor(BASE_LOGGER_NAME, Level.INFO) - } - }, ignoreInitialValue = false) - // Application dirs val applicationDirs = ApplicationDirs() initLoggerConfig(applicationDirs.dataRoot) + val setupLogLevelUpdating = { configFlow: MutableStateFlow, loggerNames: List -> + serverConfig.subscribeTo(configFlow, { debugLogsEnabled -> + if (debugLogsEnabled) { + loggerNames.forEach { loggerName -> setLogLevelFor(loggerName, Level.DEBUG) } + } else { + loggerNames.forEach { loggerName -> setLogLevelFor(loggerName, Level.ERROR) } + } + }, ignoreInitialValue = false) + } + + setupLogLevelUpdating(serverConfig.debugLogsEnabled, listOf(BASE_LOGGER_NAME)) + // gql "ExecutionStrategy" spams logs with "... completing field ..." + // gql "notprivacysafe" logs every received request multiple times (received, parsing, validating, executing) + setupLogLevelUpdating(serverConfig.gqlDebugLogsEnabled, listOf("graphql", "notprivacysafe")) + logger.info("Running Tachidesk ${BuildConfig.VERSION} revision ${BuildConfig.REVISION}") logger.debug { diff --git a/server/src/main/resources/server-reference.conf b/server/src/main/resources/server-reference.conf index db38de1529..7671f3ccce 100644 --- a/server/src/main/resources/server-reference.conf +++ b/server/src/main/resources/server-reference.conf @@ -37,6 +37,7 @@ server.basicAuthPassword = "" # misc server.debugLogsEnabled = false +server.gqlDebugLogsEnabled = false # this includes logs with non privacy safe information server.systemTrayEnabled = true # backup diff --git a/server/src/test/resources/server-reference.conf b/server/src/test/resources/server-reference.conf index 9d5dc26f02..179ce32044 100644 --- a/server/src/test/resources/server-reference.conf +++ b/server/src/test/resources/server-reference.conf @@ -22,6 +22,7 @@ server.globalUpdateInterval = 12 # misc server.debugLogsEnabled = true +server.gqlDebugLogsEnabled = false server.systemTrayEnabled = false # webUI