1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-04-25 21:12:40 +08:00

Make MiraiLogger multiplatform

This commit is contained in:
Him188 2022-05-17 10:21:08 +01:00
parent 267ba3b58c
commit da06a19881
No known key found for this signature in database
GPG Key ID: BA439CDDCF652375
6 changed files with 662 additions and 68 deletions
mirai-core-api/src
commonMain/kotlin/utils
jvmBaseMain/kotlin
nativeMain/kotlin

View File

@ -7,13 +7,15 @@
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
@file:Suppress("unused")
@file:JvmMultifileClass
@file:JvmName("Utils")
package net.mamoe.mirai.utils
import java.util.*
import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName
import kotlin.jvm.JvmOverloads
import kotlin.jvm.JvmStatic
import kotlin.reflect.KClass
/**
@ -46,7 +48,7 @@ public fun MiraiLogger.withSwitch(default: Boolean = true): MiraiLoggerWithSwitc
*
* @see MiraiLoggerPlatformBase 平台通用基础实现. Mirai 自带的日志系统无法满足需求, 请继承这个类并实现其抽象函数.
*/
public interface MiraiLogger {
public expect interface MiraiLogger {
/**
* 可以 service 实现的方式覆盖.
@ -60,32 +62,16 @@ public interface MiraiLogger {
* @param requester 请求创建 [MiraiLogger] 的对象的 class
* @param identity 对象标记 (备注)
*/
public fun create(requester: KClass<*>, identity: String? = null): MiraiLogger =
this.create(requester.java, identity)
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象的 class
* @param identity 对象标记 (备注)
*/
public fun create(requester: Class<*>, identity: String? = null): MiraiLogger
public open fun create(requester: KClass<*>, identity: String? = null): MiraiLogger
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象
*/
public fun create(requester: KClass<*>): MiraiLogger = create(requester, null)
public open fun create(requester: KClass<*>): MiraiLogger
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象
*/
public fun create(requester: Class<*>): MiraiLogger = create(requester, null)
public companion object INSTANCE : Factory by loadService(Factory::class, { DefaultFactory() })
public companion object INSTANCE : Factory
}
public companion object {
@ -96,7 +82,7 @@ public interface MiraiLogger {
@MiraiExperimentalApi
@Deprecated("Deprecated.", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public val TopLevel: MiraiLogger by lazy { Factory.create(MiraiLogger::class, "Mirai") }
public val TopLevel: MiraiLogger
/**
* 已弃用, 请实现 service [net.mamoe.mirai.utils.MiraiLogger.Factory] 并以 [ServiceLoader] 支持的方式提供.
@ -108,9 +94,8 @@ public interface MiraiLogger {
) // deprecated since 2.7
@JvmStatic
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10") // left ERROR intentionally, for internal uses.
public fun setDefaultLoggerCreator(creator: (identity: String?) -> MiraiLogger) {
DefaultFactoryOverrides.override { _, identity -> creator(identity) }
}
public fun setDefaultLoggerCreator(creator: (identity: String?) -> MiraiLogger)
/**
* 旧版本用于创建 [MiraiLogger]. 已弃用. 请使用 [MiraiLogger.Factory.INSTANCE.create].
@ -125,7 +110,7 @@ public interface MiraiLogger {
) // deprecated since 2.7
@JvmStatic
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public fun create(identity: String?): MiraiLogger = Factory.create(MiraiLogger::class, identity)
public fun create(identity: String?): MiraiLogger
}
/**
@ -154,7 +139,7 @@ public interface MiraiLogger {
*
* @since 2.7
*/
public val isVerboseEnabled: Boolean get() = isEnabled
public open val isVerboseEnabled: Boolean
/**
* DEBUG 级别的日志启用时返回 `true`
@ -165,7 +150,7 @@ public interface MiraiLogger {
*
* @since 2.7
*/
public val isDebugEnabled: Boolean get() = isEnabled
public open val isDebugEnabled: Boolean
/**
* INFO 级别的日志启用时返回 `true`
@ -176,7 +161,7 @@ public interface MiraiLogger {
*
* @since 2.7
*/
public val isInfoEnabled: Boolean get() = isEnabled
public open val isInfoEnabled: Boolean
/**
* WARNING 级别的日志启用时返回 `true`
@ -187,7 +172,7 @@ public interface MiraiLogger {
*
* @since 2.7
*/
public val isWarningEnabled: Boolean get() = isEnabled
public open val isWarningEnabled: Boolean
/**
* ERROR 级别的日志启用时返回 `true`
@ -198,7 +183,7 @@ public interface MiraiLogger {
*
* @since 2.7
*/
public val isErrorEnabled: Boolean get() = isEnabled
public open val isErrorEnabled: Boolean
/**
* 随从. this 中调用所有方法后都应继续往 [follower] 传递调用.
@ -213,9 +198,7 @@ public interface MiraiLogger {
@Suppress("UNUSED_PARAMETER")
@Deprecated("follower 设计不佳, 请避免使用", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public var follower: MiraiLogger?
get() = null
set(value) {}
public open var follower: MiraiLogger?
/**
* 记录一个 `verbose` 级别的日志.
@ -223,7 +206,7 @@ public interface MiraiLogger {
*/
public fun verbose(message: String?)
public fun verbose(e: Throwable?): Unit = verbose(null, e)
public open fun verbose(e: Throwable?): Unit
public fun verbose(message: String?, e: Throwable?)
/**
@ -231,7 +214,7 @@ public interface MiraiLogger {
*/
public fun debug(message: String?)
public fun debug(e: Throwable?): Unit = debug(null, e)
public open fun debug(e: Throwable?): Unit
public fun debug(message: String?, e: Throwable?)
@ -240,7 +223,7 @@ public interface MiraiLogger {
*/
public fun info(message: String?)
public fun info(e: Throwable?): Unit = info(null, e)
public open fun info(e: Throwable?): Unit
public fun info(message: String?, e: Throwable?)
@ -249,7 +232,7 @@ public interface MiraiLogger {
*/
public fun warning(message: String?)
public fun warning(e: Throwable?): Unit = warning(null, e)
public open fun warning(e: Throwable?): Unit
public fun warning(message: String?, e: Throwable?)
@ -258,12 +241,11 @@ public interface MiraiLogger {
*/
public fun error(message: String?)
public fun error(e: Throwable?): Unit = error(null, e)
public open fun error(e: Throwable?): Unit
public fun error(message: String?, e: Throwable?)
/** 根据优先级调用对应函数 */
public fun call(priority: SimpleLogger.LogPriority, message: String? = null, e: Throwable? = null): Unit =
priority.correspondingFunction(this, message, e)
public open fun call(priority: SimpleLogger.LogPriority, message: String? = null, e: Throwable? = null): Unit
/**
* 添加一个 [follower], 返回 [follower]
@ -280,7 +262,7 @@ public interface MiraiLogger {
@Suppress("DeprecatedCallableAddReplaceWith")
@Deprecated("plus 设计不佳, 请避免使用.", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public operator fun <T : MiraiLogger> plus(follower: T): T = follower
public open operator fun <T : MiraiLogger> plus(follower: T): T
}
@ -558,28 +540,4 @@ public abstract class MiraiLoggerPlatformBase : MiraiLogger {
public override operator fun <T : MiraiLogger> plus(follower: T): T {
return follower
}
}
internal object DefaultFactoryOverrides {
var override: ((requester: Class<*>, identity: String?) -> MiraiLogger)? =
null // 支持 LoggerAdapters 以及兼容旧版本
@JvmStatic
fun override(lambda: (requester: Class<*>, identity: String?) -> MiraiLogger) {
override = lambda
}
@JvmStatic
fun clearOverride() {
override = null
}
}
internal class DefaultFactory : MiraiLogger.Factory {
override fun create(requester: Class<*>, identity: String?): MiraiLogger {
val override = DefaultFactoryOverrides.override
return if (override != null) override(requester, identity) else PlatformLogger(
identity ?: requester.kotlin.simpleName ?: requester.simpleName
)
}
}
}

View File

@ -0,0 +1,10 @@
/*
* Copyright 2019-2022 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/dev/LICENSE
*/
package net.mamoe.mirai

View File

@ -0,0 +1,302 @@
/*
* Copyright 2019-2022 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/dev/LICENSE
*/
@file:JvmMultifileClass
@file:JvmName("Utils")
package net.mamoe.mirai.utils
import net.mamoe.mirai.utils.*
import kotlin.reflect.KClass
/**
* 日志记录器.
*
* ## Mirai 日志系统
*
* Mirai 内建简单的日志系统, [MiraiLogger]. [MiraiLogger] 的实现有 [SimpleLogger], [PlatformLogger], [SilentLogger].
*
* [MiraiLogger] 仅能处理简单的日志任务, 通常推荐使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 等日志库.
*
* ## 使用第三方日志库接管 Mirai 日志系统
*
* 使用 [LoggerAdapters], 将第三方日志 `Logger` 转为 [MiraiLogger]. 然后通过 [MiraiLogger.setDefaultLoggerCreator] 全局覆盖日志.
*
* ## 实现或使用 [MiraiLogger]
*
* 不建议实现或使用 [MiraiLogger]. 请优先考虑使用上述第三方框架. [MiraiLogger] 仅应用于兼容旧版本代码.
*
* @see SimpleLogger 简易 logger, 它将所有的日志记录操作都转移给 lambda `(String?, Throwable?) -> Unit`
* @see PlatformLogger 各个平台下的默认日志记录实现.
* @see SilentLogger 忽略任何日志记录操作的 logger 实例.
* @see LoggerAdapters
*
* @see MiraiLoggerPlatformBase 平台通用基础实现. Mirai 自带的日志系统无法满足需求, 请继承这个类并实现其抽象函数.
*/
public actual interface MiraiLogger {
/**
* 可以 service 实现的方式覆盖.
*
* @since 2.7
*/
public actual interface Factory {
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象的 class
* @param identity 对象标记 (备注)
*/
public actual fun create(requester: KClass<*>, identity: String?): MiraiLogger =
this.create(requester.java, identity)
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象的 class
* @param identity 对象标记 (备注)
*/
public fun create(requester: Class<*>, identity: String? = null): MiraiLogger
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象
*/
public actual fun create(requester: KClass<*>): MiraiLogger = create(requester, null)
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象
*/
public fun create(requester: Class<*>): MiraiLogger = create(requester, null)
public actual companion object INSTANCE : Factory by loadService(Factory::class, { DefaultFactory() })
}
public actual companion object {
/**
* 顶层日志, 仅供 Mirai 内部使用.
*/
@MiraiInternalApi
@MiraiExperimentalApi
@Deprecated("Deprecated.", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public actual val TopLevel: MiraiLogger by lazy { Factory.create(MiraiLogger::class, "Mirai") }
/**
* 已弃用, 请实现 service [net.mamoe.mirai.utils.MiraiLogger.Factory] 并以 [ServiceLoader] 支持的方式提供.
*/
@Suppress("DeprecatedCallableAddReplaceWith")
@Deprecated(
"Please set factory by providing an service of type net.mamoe.mirai.utils.MiraiLogger.Factory",
level = DeprecationLevel.ERROR
) // deprecated since 2.7
@JvmStatic
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10") // left ERROR intentionally, for internal uses.
public actual fun setDefaultLoggerCreator(creator: (identity: String?) -> MiraiLogger) {
DefaultFactoryOverrides.override { _, identity -> creator(identity) }
}
/**
* 旧版本用于创建 [MiraiLogger]. 已弃用. 请使用 [MiraiLogger.Factory.INSTANCE.create].
*
* @see setDefaultLoggerCreator
*/
@Deprecated(
"Please use MiraiLogger.Factory.create", ReplaceWith(
"MiraiLogger.Factory.create(YourClass::class, identity)",
"net.mamoe.mirai.utils.MiraiLogger"
), level = DeprecationLevel.HIDDEN
) // deprecated since 2.7
@JvmStatic
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public actual fun create(identity: String?): MiraiLogger = Factory.create(MiraiLogger::class, identity)
}
/**
* 日志的标记. Mirai , identity 可为
* - "Bot"
* - "BotNetworkHandler"
* .
*
* 它只用于帮助调试或统计. 十分建议清晰定义 identity
*/
public actual val identity: String?
/**
* 获取 [MiraiLogger] 是否已开启
*
* [MiraiLoggerWithSwitch] 可控制开关外, 其他的所有 [MiraiLogger] 均一直开启.
*/
public actual val isEnabled: Boolean
/**
* VERBOSE 级别的日志启用时返回 `true`.
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isVerboseEnabled: Boolean get() = isEnabled
/**
* DEBUG 级别的日志启用时返回 `true`
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isDebugEnabled: Boolean get() = isEnabled
/**
* INFO 级别的日志启用时返回 `true`
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isInfoEnabled: Boolean get() = isEnabled
/**
* WARNING 级别的日志启用时返回 `true`
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isWarningEnabled: Boolean get() = isEnabled
/**
* ERROR 级别的日志启用时返回 `true`
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isErrorEnabled: Boolean get() = isEnabled
/**
* 随从. this 中调用所有方法后都应继续往 [follower] 传递调用.
* [follower] 的存在可以让一次日志被多个日志记录器记录.
*
* 一般不建议直接修改这个属性. 请通过 [plus] 来连接两个日志记录器.
* : `val logger = bot.logger + MyLogger()`
* 当调用 `logger.info()` , `bot.logger` 会首先记录, `MyLogger` 会随后记录.
*
* 当然, 多个 logger 也可以加在一起: `val logger = bot.logger + MynLogger() + MyLogger2()`
*/
@Suppress("UNUSED_PARAMETER")
@Deprecated("follower 设计不佳, 请避免使用", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public actual var follower: MiraiLogger?
get() = null
set(value) {}
/**
* 记录一个 `verbose` 级别的日志.
* 无关紧要的, 经常大量输出的日志应使用它.
*/
public actual fun verbose(message: String?)
public actual fun verbose(e: Throwable?): Unit = verbose(null, e)
public actual fun verbose(message: String?, e: Throwable?)
/**
* 记录一个 _调试_ 级别的日志.
*/
public actual fun debug(message: String?)
public actual fun debug(e: Throwable?): Unit = debug(null, e)
public actual fun debug(message: String?, e: Throwable?)
/**
* 记录一个 _信息_ 级别的日志.
*/
public actual fun info(message: String?)
public actual fun info(e: Throwable?): Unit = info(null, e)
public actual fun info(message: String?, e: Throwable?)
/**
* 记录一个 _警告_ 级别的日志.
*/
public actual fun warning(message: String?)
public actual fun warning(e: Throwable?): Unit = warning(null, e)
public actual fun warning(message: String?, e: Throwable?)
/**
* 记录一个 _错误_ 级别的日志.
*/
public actual fun error(message: String?)
public actual fun error(e: Throwable?): Unit = error(null, e)
public actual fun error(message: String?, e: Throwable?)
/** 根据优先级调用对应函数 */
public actual fun call(priority: SimpleLogger.LogPriority, message: String?, e: Throwable?): Unit =
priority.correspondingFunction(this, message, e)
/**
* 添加一个 [follower], 返回 [follower]
* 它只会把 `this` 的属性 [MiraiLogger.follower] 修改为这个函数的参数 [follower], 然后返回这个参数.
* [MiraiLogger.follower] 已经有值, 则会替换掉这个值.
* ```
* +------+ +----------+ +----------+ +----------+
* | base | <-- | follower | <-- | follower | <-- | follower |
* +------+ +----------+ +----------+ +----------+
* ```
*
* @return [follower]
*/
@Suppress("DeprecatedCallableAddReplaceWith")
@Deprecated("plus 设计不佳, 请避免使用.", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public actual operator fun <T : MiraiLogger> plus(follower: T): T = follower
}
internal object DefaultFactoryOverrides {
var override: ((requester: Class<*>, identity: String?) -> MiraiLogger)? =
null // 支持 LoggerAdapters 以及兼容旧版本
@JvmStatic
fun override(lambda: (requester: Class<*>, identity: String?) -> MiraiLogger) {
override = lambda
}
@JvmStatic
fun clearOverride() {
override = null
}
}
internal class DefaultFactory : MiraiLogger.Factory {
override fun create(requester: Class<*>, identity: String?): MiraiLogger {
val override = DefaultFactoryOverrides.override
return if (override != null) override(requester, identity) else PlatformLogger(
identity ?: requester.kotlin.simpleName ?: requester.simpleName
)
}
}

View File

@ -0,0 +1,10 @@
/*
* Copyright 2019-2022 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/dev/LICENSE
*/
package net.mamoe.mirai

View File

@ -0,0 +1,254 @@
/*
* Copyright 2019-2022 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/dev/LICENSE
*/
package net.mamoe.mirai.utils
import kotlin.reflect.KClass
/**
* 日志记录器.
*
* ## Mirai 日志系统
*
* Mirai 内建简单的日志系统, [MiraiLogger]. [MiraiLogger] 的实现有 [SimpleLogger], [PlatformLogger], [SilentLogger].
*
* [MiraiLogger] 仅能处理简单的日志任务, 通常推荐使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] 等日志库.
*
* ## 使用第三方日志库接管 Mirai 日志系统
*
* 使用 [LoggerAdapters], 将第三方日志 `Logger` 转为 [MiraiLogger]. 然后通过 [MiraiLogger.setDefaultLoggerCreator] 全局覆盖日志.
*
* ## 实现或使用 [MiraiLogger]
*
* 不建议实现或使用 [MiraiLogger]. 请优先考虑使用上述第三方框架. [MiraiLogger] 仅应用于兼容旧版本代码.
*
* @see SimpleLogger 简易 logger, 它将所有的日志记录操作都转移给 lambda `(String?, Throwable?) -> Unit`
* @see PlatformLogger 各个平台下的默认日志记录实现.
* @see SilentLogger 忽略任何日志记录操作的 logger 实例.
* @see LoggerAdapters
*
* @see MiraiLoggerPlatformBase 平台通用基础实现. Mirai 自带的日志系统无法满足需求, 请继承这个类并实现其抽象函数.
*/
public actual interface MiraiLogger {
/**
* 可以 service 实现的方式覆盖.
*
* @since 2.7
*/
public actual interface Factory {
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象的 class
* @param identity 对象标记 (备注)
*/
public actual fun create(requester: KClass<*>, identity: String?): MiraiLogger = TODO("native")
/**
* 创建 [MiraiLogger] 实例.
*
* @param requester 请求创建 [MiraiLogger] 的对象
*/
public actual fun create(requester: KClass<*>): MiraiLogger = TODO("native")
public actual companion object INSTANCE : Factory by TODO("native")
}
public actual companion object {
/**
* 顶层日志, 仅供 Mirai 内部使用.
*/
@MiraiInternalApi
@MiraiExperimentalApi
@Deprecated("Deprecated.", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public actual val TopLevel: MiraiLogger by lazy { Factory.create(MiraiLogger::class, "Mirai") }
/**
* 已弃用, 请实现 service [net.mamoe.mirai.utils.MiraiLogger.Factory] 并以 [ServiceLoader] 支持的方式提供.
*/
@Suppress("DeprecatedCallableAddReplaceWith")
@Deprecated(
"Please set factory by providing an service of type net.mamoe.mirai.utils.MiraiLogger.Factory",
level = DeprecationLevel.ERROR
) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10") // left ERROR intentionally, for internal uses.
public actual fun setDefaultLoggerCreator(creator: (identity: String?) -> MiraiLogger) {
throw UnsupportedOperationException()
}
/**
* 旧版本用于创建 [MiraiLogger]. 已弃用. 请使用 [MiraiLogger.Factory.INSTANCE.create].
*
* @see setDefaultLoggerCreator
*/
@Deprecated(
"Please use MiraiLogger.Factory.create", ReplaceWith(
"MiraiLogger.Factory.create(YourClass::class, identity)",
"net.mamoe.mirai.utils.MiraiLogger"
), level = DeprecationLevel.HIDDEN
) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public actual fun create(identity: String?): MiraiLogger = Factory.create(MiraiLogger::class, identity)
}
/**
* 日志的标记. Mirai , identity 可为
* - "Bot"
* - "BotNetworkHandler"
* .
*
* 它只用于帮助调试或统计. 十分建议清晰定义 identity
*/
public actual val identity: String?
/**
* 获取 [MiraiLogger] 是否已开启
*
* [MiraiLoggerWithSwitch] 可控制开关外, 其他的所有 [MiraiLogger] 均一直开启.
*/
public actual val isEnabled: Boolean
/**
* VERBOSE 级别的日志启用时返回 `true`.
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isVerboseEnabled: Boolean get() = isEnabled
/**
* DEBUG 级别的日志启用时返回 `true`
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isDebugEnabled: Boolean get() = isEnabled
/**
* INFO 级别的日志启用时返回 `true`
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isInfoEnabled: Boolean get() = isEnabled
/**
* WARNING 级别的日志启用时返回 `true`
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isWarningEnabled: Boolean get() = isEnabled
/**
* ERROR 级别的日志启用时返回 `true`
*
* [isEnabled] `false`, 返回 `false`.
* 在使用 [SLF4J][org.slf4j.Logger], [LOG4J][org.apache.logging.log4j.Logger] [JUL][java.util.logging.Logger] 时返回真实配置值.
* 其他情况下返回 [isEnabled] 的值.
*
* @since 2.7
*/
public actual val isErrorEnabled: Boolean get() = isEnabled
/**
* 随从. this 中调用所有方法后都应继续往 [follower] 传递调用.
* [follower] 的存在可以让一次日志被多个日志记录器记录.
*
* 一般不建议直接修改这个属性. 请通过 [plus] 来连接两个日志记录器.
* : `val logger = bot.logger + MyLogger()`
* 当调用 `logger.info()` , `bot.logger` 会首先记录, `MyLogger` 会随后记录.
*
* 当然, 多个 logger 也可以加在一起: `val logger = bot.logger + MynLogger() + MyLogger2()`
*/
@Suppress("UNUSED_PARAMETER")
@Deprecated("follower 设计不佳, 请避免使用", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public actual var follower: MiraiLogger?
get() = null
set(value) {}
/**
* 记录一个 `verbose` 级别的日志.
* 无关紧要的, 经常大量输出的日志应使用它.
*/
public actual fun verbose(message: String?)
public actual fun verbose(e: Throwable?): Unit = verbose(null, e)
public actual fun verbose(message: String?, e: Throwable?)
/**
* 记录一个 _调试_ 级别的日志.
*/
public actual fun debug(message: String?)
public actual fun debug(e: Throwable?): Unit = debug(null, e)
public actual fun debug(message: String?, e: Throwable?)
/**
* 记录一个 _信息_ 级别的日志.
*/
public actual fun info(message: String?)
public actual fun info(e: Throwable?): Unit = info(null, e)
public actual fun info(message: String?, e: Throwable?)
/**
* 记录一个 _警告_ 级别的日志.
*/
public actual fun warning(message: String?)
public actual fun warning(e: Throwable?): Unit = warning(null, e)
public actual fun warning(message: String?, e: Throwable?)
/**
* 记录一个 _错误_ 级别的日志.
*/
public actual fun error(message: String?)
public actual fun error(e: Throwable?): Unit = error(null, e)
public actual fun error(message: String?, e: Throwable?)
/** 根据优先级调用对应函数 */
public actual fun call(priority: SimpleLogger.LogPriority, message: String?, e: Throwable?): Unit =
priority.correspondingFunction(this, message, e)
/**
* 添加一个 [follower], 返回 [follower]
* 它只会把 `this` 的属性 [MiraiLogger.follower] 修改为这个函数的参数 [follower], 然后返回这个参数.
* [MiraiLogger.follower] 已经有值, 则会替换掉这个值.
* ```
* +------+ +----------+ +----------+ +----------+
* | base | <-- | follower | <-- | follower | <-- | follower |
* +------+ +----------+ +----------+ +----------+
* ```
*
* @return [follower]
*/
@Suppress("DeprecatedCallableAddReplaceWith")
@Deprecated("plus 设计不佳, 请避免使用.", level = DeprecationLevel.HIDDEN) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public actual operator fun <T : MiraiLogger> plus(follower: T): T = follower
}

View File

@ -0,0 +1,60 @@
/*
* Copyright 2019-2022 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/dev/LICENSE
*/
package net.mamoe.mirai.utils
/**
* 当前平台的默认的日志记录器.
* - _JVM 控制台_ 端的实现为 [println]
* - _Android_ 端的实现为 `android.util.Log`
*
*
* 单条日志格式 (正则) :
* ```regex
* ^([\w-]*\s[\w:]*)\s(\w)\/(.*?):\s(.+)$
* ```
* 其中 group 分别为: 日期与时间, 严重程度, [identity], 消息内容.
*
* 示例:
* ```log
* 2020-05-21 19:51:09 V/Bot 123456789: Send: OidbSvc.0x88d_7
* ```
*
* 日期时间格式为 `yyyy-MM-dd HH:mm:ss`,
*
* 严重程度为 V, I, W, E. 分别对应 verbose, info, warning, error
*
* @see MiraiLogger.create
*/
@MiraiInternalApi
public actual open class PlatformLogger actual constructor(identity: String?) :
MiraiLoggerPlatformBase() {
override val identity: String?
get() = TODO("Not yet implemented")
override fun verbose0(message: String?, e: Throwable?) {
TODO("Not yet implemented")
}
override fun debug0(message: String?, e: Throwable?) {
TODO("Not yet implemented")
}
override fun info0(message: String?, e: Throwable?) {
TODO("Not yet implemented")
}
override fun warning0(message: String?, e: Throwable?) {
TODO("Not yet implemented")
}
override fun error0(message: String?, e: Throwable?) {
TODO("Not yet implemented")
}
}