diff --git a/composeApp/src/commonMain/kotlin/com/crosspaste/config/AppConfig.kt b/composeApp/src/commonMain/kotlin/com/crosspaste/config/AppConfig.kt index 779b4f06..25c837f3 100644 --- a/composeApp/src/commonMain/kotlin/com/crosspaste/config/AppConfig.kt +++ b/composeApp/src/commonMain/kotlin/com/crosspaste/config/AppConfig.kt @@ -8,6 +8,7 @@ data class AppConfig( val appInstanceId: String, val language: String = getLocaleUtils().getCurrentLocale(), val enableAutoStartUp: Boolean = true, + val enableDebugMode: Boolean = false, val isFollowSystemTheme: Boolean = true, val isDarkTheme: Boolean = false, val port: Int = 13129, @@ -40,6 +41,7 @@ data class AppConfig( appInstanceId = appInstanceId, language = if (key == "language") value as String else language, enableAutoStartUp = if (key == "enableAutoStartUp") value as Boolean else enableAutoStartUp, + enableDebugMode = if (key == "enableDebugMode") value as Boolean else enableDebugMode, isFollowSystemTheme = if (key == "isFollowSystemTheme") value as Boolean else isFollowSystemTheme, isDarkTheme = if (key == "isDarkTheme") value as Boolean else isDarkTheme, port = if (key == "port") value as Int else port, diff --git a/composeApp/src/commonMain/kotlin/com/crosspaste/log/CrossPasteLogger.kt b/composeApp/src/commonMain/kotlin/com/crosspaste/log/CrossPasteLogger.kt index f8ad9019..95ff48aa 100644 --- a/composeApp/src/commonMain/kotlin/com/crosspaste/log/CrossPasteLogger.kt +++ b/composeApp/src/commonMain/kotlin/com/crosspaste/log/CrossPasteLogger.kt @@ -1,9 +1,9 @@ package com.crosspaste.log -expect fun initLogger(logPath: String): CrossPasteLogger - interface CrossPasteLogger { val logLevel: String val logPath: String val loggerDebugPackages: String? + + fun updateRootLogLevel(logLevel: String) } diff --git a/composeApp/src/commonMain/kotlin/com/crosspaste/ui/base/BaseIcon.kt b/composeApp/src/commonMain/kotlin/com/crosspaste/ui/base/BaseIcon.kt index b684cca5..53da242b 100644 --- a/composeApp/src/commonMain/kotlin/com/crosspaste/ui/base/BaseIcon.kt +++ b/composeApp/src/commonMain/kotlin/com/crosspaste/ui/base/BaseIcon.kt @@ -33,6 +33,9 @@ expect fun close(): Painter @Composable expect fun database(): Painter +@Composable +expect fun debug(): Painter + @Composable expect fun descSort(): Painter diff --git a/composeApp/src/commonMain/kotlin/com/crosspaste/ui/settings/SettingsContentView.kt b/composeApp/src/commonMain/kotlin/com/crosspaste/ui/settings/SettingsContentView.kt index da23837d..66517f05 100644 --- a/composeApp/src/commonMain/kotlin/com/crosspaste/ui/settings/SettingsContentView.kt +++ b/composeApp/src/commonMain/kotlin/com/crosspaste/ui/settings/SettingsContentView.kt @@ -59,6 +59,7 @@ import androidx.compose.ui.unit.toSize import androidx.compose.ui.window.Popup import com.crosspaste.config.ConfigManager import com.crosspaste.i18n.GlobalCopywriter +import com.crosspaste.log.CrossPasteLogger import com.crosspaste.paste.PasteboardService import com.crosspaste.ui.base.CustomSwitch import com.crosspaste.ui.base.ExpandView @@ -69,6 +70,7 @@ import com.crosspaste.ui.base.arrowRight import com.crosspaste.ui.base.arrowUp import com.crosspaste.ui.base.bolt import com.crosspaste.ui.base.clipboard +import com.crosspaste.ui.base.debug import com.crosspaste.ui.base.getMenWidth import com.crosspaste.ui.base.language import com.crosspaste.ui.base.palette @@ -95,6 +97,7 @@ fun SettingsTextStyle() = fun SettingsContentView() { val configManager = koinInject() val copywriter = koinInject() + val crossPasteLogger = koinInject() val pasteboardService = koinInject() var hasBeenClicked by remember { mutableStateOf(false) } var showMoreLanguage by remember { mutableStateOf(false) } @@ -320,6 +323,29 @@ fun SettingsContentView() { }, ) } + + HorizontalDivider(modifier = Modifier.padding(start = 35.dp)) + + SettingItemView( + painter = debug(), + text = "debug_mode", + tint = Color(0xFFFCCD2A), + ) { + var enableDebugMode by remember { mutableStateOf(configManager.config.enableDebugMode) } + + CustomSwitch( + modifier = + Modifier.width(32.dp) + .height(20.dp), + checked = enableDebugMode, + onCheckedChange = { changeEnableDebugMode -> + crossPasteLogger.updateRootLogLevel( + if (changeEnableDebugMode) "debug" else "info", + ) + enableDebugMode = configManager.config.enableDebugMode + }, + ) + } } Spacer(modifier = Modifier.height(10.dp)) diff --git a/composeApp/src/desktopMain/kotlin/com/crosspaste/CrossPaste.kt b/composeApp/src/desktopMain/kotlin/com/crosspaste/CrossPaste.kt index 65e57f13..75043ca6 100644 --- a/composeApp/src/desktopMain/kotlin/com/crosspaste/CrossPaste.kt +++ b/composeApp/src/desktopMain/kotlin/com/crosspaste/CrossPaste.kt @@ -66,7 +66,7 @@ import com.crosspaste.listener.ShortcutKeys import com.crosspaste.listener.ShortcutKeysAction import com.crosspaste.listener.ShortcutKeysListener import com.crosspaste.log.CrossPasteLogger -import com.crosspaste.log.initLogger +import com.crosspaste.log.DesktopCrossPasteLogger import com.crosspaste.net.DesktopPasteBonjourService import com.crosspaste.net.DesktopServerFactory import com.crosspaste.net.DesktopServerModule @@ -220,8 +220,9 @@ class CrossPaste { ) private val crossPasteLogger = - initLogger( + DesktopCrossPasteLogger( appPathProvider.resolve("crosspaste.log", AppFileType.LOG).toString(), + configManager, ) private val logger: KLogger = KotlinLogging.logger {} diff --git a/composeApp/src/desktopMain/kotlin/com/crosspaste/log/CrossPasteLogger.desktop.kt b/composeApp/src/desktopMain/kotlin/com/crosspaste/log/CrossPasteLogger.desktop.kt deleted file mode 100644 index 183ca150..00000000 --- a/composeApp/src/desktopMain/kotlin/com/crosspaste/log/CrossPasteLogger.desktop.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.crosspaste.log - -import ch.qos.logback.classic.Level -import ch.qos.logback.classic.LoggerContext -import ch.qos.logback.classic.encoder.PatternLayoutEncoder -import ch.qos.logback.classic.spi.ILoggingEvent -import ch.qos.logback.core.rolling.RollingFileAppender -import ch.qos.logback.core.rolling.TimeBasedRollingPolicy -import com.crosspaste.utils.getSystemProperty -import org.slf4j.Logger -import org.slf4j.LoggerFactory - -actual fun initLogger(logPath: String): CrossPasteLogger { - val systemProperty = getSystemProperty() - val logLevel = systemProperty.getOption("loggerLevel") ?: "info" - - val context = LoggerFactory.getILoggerFactory() as LoggerContext - - val encoder = PatternLayoutEncoder() - encoder.context = context - encoder.pattern = "%date %level [%thread] %logger{10} [%file:%line] %msg%n" - encoder.start() - - val rollingFileAppender = RollingFileAppender() - rollingFileAppender.context = context - rollingFileAppender.file = logPath - rollingFileAppender.encoder = encoder - - val rollingPolicy = TimeBasedRollingPolicy() - rollingPolicy.context = context - rollingPolicy.setParent(rollingFileAppender) - rollingPolicy.fileNamePattern = "$logPath.%d{yyyy-MM-dd}.log" - rollingPolicy.maxHistory = 30 - rollingPolicy.start() - - rollingFileAppender.rollingPolicy = rollingPolicy - rollingFileAppender.start() - - val rootLogger = context.getLogger(Logger.ROOT_LOGGER_NAME) as ch.qos.logback.classic.Logger - rootLogger.level = getLevel(logLevel) - rootLogger.addAppender(rollingFileAppender) - - val jThemeLogger = context.getLogger("com.jthemedetecor") as ch.qos.logback.classic.Logger - jThemeLogger.level = Level.OFF - - val loggerDebugPackages = systemProperty.getOption("loggerDebugPackages") - - loggerDebugPackages?.let { debugPackages -> - for (packageName in debugPackages.split(",")) { - val logger = context.getLogger(packageName) as ch.qos.logback.classic.Logger - logger.level = Level.DEBUG - } - } - - return object : CrossPasteLogger { - override val logLevel: String = logLevel - override val logPath: String = logPath - override val loggerDebugPackages: String? = loggerDebugPackages - } -} - -fun getLevel(logLevel: String): Level { - return when (logLevel) { - "trace" -> Level.TRACE - "debug" -> Level.DEBUG - "info" -> Level.INFO - "warn" -> Level.WARN - "error" -> Level.ERROR - else -> Level.INFO - } -} diff --git a/composeApp/src/desktopMain/kotlin/com/crosspaste/log/DesktopCrossPasteLogger.kt b/composeApp/src/desktopMain/kotlin/com/crosspaste/log/DesktopCrossPasteLogger.kt new file mode 100644 index 00000000..d90b9e94 --- /dev/null +++ b/composeApp/src/desktopMain/kotlin/com/crosspaste/log/DesktopCrossPasteLogger.kt @@ -0,0 +1,101 @@ +package com.crosspaste.log + +import ch.qos.logback.classic.Level +import ch.qos.logback.classic.LoggerContext +import ch.qos.logback.classic.encoder.PatternLayoutEncoder +import ch.qos.logback.classic.spi.ILoggingEvent +import ch.qos.logback.core.rolling.RollingFileAppender +import ch.qos.logback.core.rolling.TimeBasedRollingPolicy +import com.crosspaste.config.ConfigManager +import com.crosspaste.utils.getSystemProperty +import org.slf4j.Logger +import org.slf4j.LoggerFactory + +class DesktopCrossPasteLogger( + override val logPath: String, + private val configManager: ConfigManager, +) : CrossPasteLogger { + + override lateinit var logLevel: String + override val loggerDebugPackages: String? + + init { + val systemProperty = getSystemProperty() + systemProperty.getOption("loggerLevel")?.let { + logLevel = it + if (logLevel == "debug" && !configManager.config.enableDebugMode) { + configManager.updateConfig("enableDebugMode", true) + } else if (logLevel != "debug" && configManager.config.enableDebugMode) { + configManager.updateConfig("enableDebugMode", false) + } + } ?: run { + logLevel = + if (configManager.config.enableDebugMode) { + "debug" + } else { + "info" + } + } + + val context = LoggerFactory.getILoggerFactory() as LoggerContext + + val encoder = PatternLayoutEncoder() + encoder.context = context + encoder.pattern = "%date %level [%thread] %logger{10} [%file:%line] %msg%n" + encoder.start() + + val rollingFileAppender = RollingFileAppender() + rollingFileAppender.context = context + rollingFileAppender.file = logPath + rollingFileAppender.encoder = encoder + + val rollingPolicy = TimeBasedRollingPolicy() + rollingPolicy.context = context + rollingPolicy.setParent(rollingFileAppender) + rollingPolicy.fileNamePattern = "$logPath.%d{yyyy-MM-dd}.log" + rollingPolicy.maxHistory = 30 + rollingPolicy.start() + + rollingFileAppender.rollingPolicy = rollingPolicy + rollingFileAppender.start() + + val rootLogger = context.getLogger(Logger.ROOT_LOGGER_NAME) as ch.qos.logback.classic.Logger + rootLogger.level = getLevel(logLevel) + rootLogger.addAppender(rollingFileAppender) + + val jThemeLogger = context.getLogger("com.jthemedetecor") as ch.qos.logback.classic.Logger + jThemeLogger.level = Level.OFF + + loggerDebugPackages = systemProperty.getOption("loggerDebugPackages") + + loggerDebugPackages?.let { debugPackages -> + for (packageName in debugPackages.split(",")) { + val logger = context.getLogger(packageName) as ch.qos.logback.classic.Logger + logger.level = Level.DEBUG + } + } + } + + override fun updateRootLogLevel(logLevel: String) { + val context = LoggerFactory.getILoggerFactory() as LoggerContext + val rootLogger = context.getLogger(Logger.ROOT_LOGGER_NAME) as ch.qos.logback.classic.Logger + val level = getLevel(logLevel) + if (level == Level.DEBUG) { + configManager.updateConfig("enableDebugMode", true) + } else { + configManager.updateConfig("enableDebugMode", false) + } + rootLogger.level = getLevel(logLevel) + } + + private fun getLevel(logLevel: String): Level { + return when (logLevel) { + "trace" -> Level.TRACE + "debug" -> Level.DEBUG + "info" -> Level.INFO + "warn" -> Level.WARN + "error" -> Level.ERROR + else -> Level.INFO + } + } +} diff --git a/composeApp/src/desktopMain/kotlin/com/crosspaste/ui/base/BaseIcon.desktop.kt b/composeApp/src/desktopMain/kotlin/com/crosspaste/ui/base/BaseIcon.desktop.kt index 7a57c4ee..a9254667 100644 --- a/composeApp/src/desktopMain/kotlin/com/crosspaste/ui/base/BaseIcon.desktop.kt +++ b/composeApp/src/desktopMain/kotlin/com/crosspaste/ui/base/BaseIcon.desktop.kt @@ -54,6 +54,11 @@ actual fun database(): Painter { return painterResource("icon/base/database.svg") } +@Composable +actual fun debug(): Painter { + return painterResource("icon/base/debug.svg") +} + @Composable actual fun descSort(): Painter { return painterResource("icon/base/sort-desc.svg") diff --git a/composeApp/src/desktopMain/resources/i18n/en.properties b/composeApp/src/desktopMain/resources/i18n/en.properties index 322e34cd..3ee4b6be 100644 --- a/composeApp/src/desktopMain/resources/i18n/en.properties +++ b/composeApp/src/desktopMain/resources/i18n/en.properties @@ -43,6 +43,7 @@ current_software_version=Current software version dark=Dark date=Date debug=Debug +debug_mode=Debug Mode delete=Delete delete_favorite=Delete Favorite determining_the_new_storage_path=Determining the new storage path diff --git a/composeApp/src/desktopMain/resources/i18n/es.properties b/composeApp/src/desktopMain/resources/i18n/es.properties index 60c331ab..54067c51 100644 --- a/composeApp/src/desktopMain/resources/i18n/es.properties +++ b/composeApp/src/desktopMain/resources/i18n/es.properties @@ -43,6 +43,7 @@ current_software_version=Versión actual del software dark=Oscuro date=Fecha debug=Depurar +debug_mode=Modo de depuración delete=Eliminar delete_favorite=Eliminar favorito determining_the_new_storage_path=Determinando la nueva ruta de almacenamiento diff --git a/composeApp/src/desktopMain/resources/i18n/jp.properties b/composeApp/src/desktopMain/resources/i18n/jp.properties index 8676fb9f..6999e0bf 100644 --- a/composeApp/src/desktopMain/resources/i18n/jp.properties +++ b/composeApp/src/desktopMain/resources/i18n/jp.properties @@ -43,6 +43,7 @@ current_software_version=現在のソフトウェアバージョン dark=暗い date=日付 debug=デバッグ +debug_mode=デバッグモード delete=削除 delete_favorite=お気に入りを削除 determining_the_new_storage_path=新しいストレージパスを決定中 diff --git a/composeApp/src/desktopMain/resources/i18n/zh.properties b/composeApp/src/desktopMain/resources/i18n/zh.properties index 08373bda..03dd3314 100644 --- a/composeApp/src/desktopMain/resources/i18n/zh.properties +++ b/composeApp/src/desktopMain/resources/i18n/zh.properties @@ -43,6 +43,7 @@ current_software_version=当前软件版本 dark=深色 date=日期 debug=调试 +debug_mode=调试模式 delete=删除 delete_favorite=取消收藏 determining_the_new_storage_path=确定新的存储路径 diff --git a/composeApp/src/desktopMain/resources/icon/base/debug.svg b/composeApp/src/desktopMain/resources/icon/base/debug.svg new file mode 100644 index 00000000..9734cf73 --- /dev/null +++ b/composeApp/src/desktopMain/resources/icon/base/debug.svg @@ -0,0 +1 @@ + \ No newline at end of file