From 1ce26c393c128c8de4ad0c369a303d4d10a3eed9 Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 24 Feb 2021 09:55:33 +0800 Subject: [PATCH] Implement SingleFileLogger separately for different platforms, ensure binary compatibility --- .../api/binary-compatibility-validator.api | 2 +- .../kotlin/utils/SingleFileLogger.android.kt | 33 ++++++++++++++++ .../src/commonMain/kotlin/utils/FileLogger.kt | 32 ++++------------ .../kotlin/utils/SingleFileLogger.kt | 28 ++++++++++++++ .../kotlin/utils/PlatformLogger.jvm.kt | 8 +++- .../kotlin/utils/SingleFileLogger.jvm.kt | 38 +++++++++++++++++++ 6 files changed, 113 insertions(+), 28 deletions(-) create mode 100644 mirai-core-api/src/androidMain/kotlin/utils/SingleFileLogger.android.kt create mode 100644 mirai-core-api/src/commonMain/kotlin/utils/SingleFileLogger.kt create mode 100644 mirai-core-api/src/jvmMain/kotlin/utils/SingleFileLogger.jvm.kt diff --git a/binary-compatibility-validator/api/binary-compatibility-validator.api b/binary-compatibility-validator/api/binary-compatibility-validator.api index b4fa01302..04dafbfc4 100644 --- a/binary-compatibility-validator/api/binary-compatibility-validator.api +++ b/binary-compatibility-validator/api/binary-compatibility-validator.api @@ -5902,7 +5902,7 @@ public final class net/mamoe/mirai/utils/SimpleLogger$LogPriority : java/lang/En public static fun values ()[Lnet/mamoe/mirai/utils/SimpleLogger$LogPriority; } -public final class net/mamoe/mirai/utils/SingleFileLogger : net/mamoe/mirai/utils/PlatformLogger { +public final class net/mamoe/mirai/utils/SingleFileLogger : net/mamoe/mirai/utils/PlatformLogger, net/mamoe/mirai/utils/MiraiLogger { public fun (Ljava/lang/String;)V public fun (Ljava/lang/String;Ljava/io/File;)V public synthetic fun (Ljava/lang/String;Ljava/io/File;ILkotlin/jvm/internal/DefaultConstructorMarker;)V diff --git a/mirai-core-api/src/androidMain/kotlin/utils/SingleFileLogger.android.kt b/mirai-core-api/src/androidMain/kotlin/utils/SingleFileLogger.android.kt new file mode 100644 index 000000000..510bd8bd1 --- /dev/null +++ b/mirai-core-api/src/androidMain/kotlin/utils/SingleFileLogger.android.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2019-2021 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + + +package net.mamoe.mirai.utils + +import net.mamoe.mirai.internal.utils.StdoutLogger +import java.io.File + + +/** + * 将日志写入('append')到特定文件. + * + * @see PlatformLogger 查看格式信息 + */ +public actual class SingleFileLogger actual constructor( + identity: String, + file: File +) : MiraiLogger by StdoutLogger(identity, { file.appendText(it + "\n") }) { + public actual constructor(identity: String) : this(identity, File("$identity-${getCurrentDate()}.log")) + + init { + file.createNewFile() + require(file.isFile) { "Log file must be a file: $file" } + require(file.canWrite()) { "Log file must be write: $file" } + } +} diff --git a/mirai-core-api/src/commonMain/kotlin/utils/FileLogger.kt b/mirai-core-api/src/commonMain/kotlin/utils/FileLogger.kt index 2c96d2fb1..8cabc6cee 100644 --- a/mirai-core-api/src/commonMain/kotlin/utils/FileLogger.kt +++ b/mirai-core-api/src/commonMain/kotlin/utils/FileLogger.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019-2020 Mamoe Technologies and contributors. + * Copyright 2019-2021 Mamoe Technologies and contributors. * * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. @@ -9,30 +9,12 @@ package net.mamoe.mirai.utils -import net.mamoe.mirai.internal.utils.StdoutLogger import java.io.File import java.text.SimpleDateFormat import java.util.* -private val currentDay get() = Calendar.getInstance()[Calendar.DAY_OF_MONTH] -private val currentDate get() = SimpleDateFormat("yyyy-MM-dd").format(Date()) - -/** - * 将日志写入('append')到特定文件. - * - * @see PlatformLogger 查看格式信息 - */ -public class SingleFileLogger @JvmOverloads constructor( - identity: String, - file: File = File("$identity-$currentDate.log") -) : MiraiLogger by StdoutLogger(identity, { file.appendText(it + "\n") }) { - - init { - file.createNewFile() - require(file.isFile) { "Log file must be a file: $file" } - require(file.canWrite()) { "Log file must be write: $file" } - } -} +internal fun getCurrentDay() = Calendar.getInstance()[Calendar.DAY_OF_MONTH] +internal fun getCurrentDate() = SimpleDateFormat("yyyy-MM-dd").format(Date()) private val STUB: (priority: SimpleLogger.LogPriority, message: String?, e: Throwable?) -> Unit = { _: SimpleLogger.LogPriority, _: String?, _: Throwable? -> error("stub") } @@ -61,15 +43,15 @@ public class DirectoryLogger @JvmOverloads constructor( } } - private var day = currentDay + private var day = getCurrentDay() - private var delegate: SingleFileLogger = SingleFileLogger(identity, File(directory, "$currentDate.log")) + private var delegate: SingleFileLogger = SingleFileLogger(identity, File(directory, "${getCurrentDate()}.log")) get() { - val currentDay = currentDay + val currentDay = getCurrentDay() if (day != currentDay) { day = currentDay checkOutdated() - field = SingleFileLogger(identity!!, File(directory, "$currentDate.log")) + field = SingleFileLogger(identity!!, File(directory, "${getCurrentDate()}.log")) } return field } diff --git a/mirai-core-api/src/commonMain/kotlin/utils/SingleFileLogger.kt b/mirai-core-api/src/commonMain/kotlin/utils/SingleFileLogger.kt new file mode 100644 index 000000000..aa179d3f6 --- /dev/null +++ b/mirai-core-api/src/commonMain/kotlin/utils/SingleFileLogger.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2019-2021 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +@file:JvmName("FileLoggerKt") // bin-comp + +package net.mamoe.mirai.utils + +import java.io.File + +/** + * 将日志写入('append')到特定文件. + * + * @see PlatformLogger 查看格式信息 + */ +public expect class SingleFileLogger : MiraiLogger { + public constructor(identity: String) + public constructor(identity: String, file: File = File("$identity-${getCurrentDate()}.log")) + + // Implementation notes v2.5.0: + // default argument `file` to produce synthetic constructor with `DefaultConstructorMarker` for binary compatibility + // dedicated constructor with single parameter `identity` for the same reason. +} \ No newline at end of file diff --git a/mirai-core-api/src/jvmMain/kotlin/utils/PlatformLogger.jvm.kt b/mirai-core-api/src/jvmMain/kotlin/utils/PlatformLogger.jvm.kt index 4d4eaf423..a5c00c549 100644 --- a/mirai-core-api/src/jvmMain/kotlin/utils/PlatformLogger.jvm.kt +++ b/mirai-core-api/src/jvmMain/kotlin/utils/PlatformLogger.jvm.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019-2020 Mamoe Technologies and contributors. + * Copyright 2019-2021 Mamoe Technologies and contributors. * * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. @@ -49,8 +49,11 @@ public actual open class PlatformLogger constructor( // same as StdoutLogger bu public open val output: (String) -> Unit, public val isColored: Boolean = true ) : MiraiLoggerPlatformBase() { + + // PlatformLogger("") resolves to this one. public actual constructor(identity: String?) : this(identity, ::println) - public constructor(identity: String?, output: (String) -> Unit) : this(identity, output, true) + + public constructor(identity: String?, output: (String) -> Unit = ::println) : this(identity, output, true) /** * 输出一条日志. [message] 末尾可能不带换行符. @@ -102,6 +105,7 @@ public actual open class PlatformLogger constructor( // same as StdoutLogger bu if (e != null) debug((message ?: e.toString()) + "\n${e.stackTraceToString()}") else debug(message.toString()) } + protected open val timeFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.SIMPLIFIED_CHINESE) private val currentTimeFormatted get() = timeFormat.format(Date()) diff --git a/mirai-core-api/src/jvmMain/kotlin/utils/SingleFileLogger.jvm.kt b/mirai-core-api/src/jvmMain/kotlin/utils/SingleFileLogger.jvm.kt new file mode 100644 index 000000000..f978f905e --- /dev/null +++ b/mirai-core-api/src/jvmMain/kotlin/utils/SingleFileLogger.jvm.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2019-2021 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + + +@file:Suppress("unused") + +package net.mamoe.mirai.utils + +import java.io.File + + +/** + * 将日志写入('append')到特定文件. + * + * @see PlatformLogger 查看格式信息 + */ +public actual class SingleFileLogger actual constructor( + identity: String, + file: File +) : MiraiLogger, PlatformLogger(identity, { file.appendText(it + "\n") }) { + // Implementation notes v2.5.0: + // Extending `PlatformLogger` for binary compatibility for JVM target only. + // See actual declaration in androidMain for a better impl (implements `MiraiLogger` only) + + public actual constructor(identity: String) : this(identity, File("$identity-${getCurrentDate()}.log")) + + init { + file.createNewFile() + require(file.isFile) { "Log file must be a file: $file" } + require(file.canWrite()) { "Log file must be write: $file" } + } +}