Review MiraiLogger:

- Replace top-level `DefaultLogger` with
  - `MiraiLogger.create`, and
  - `MiraiLogger.setDefaultLoggerCreator`
- `MiraiLogger.Companion` is no longer `MiraiLogger`, moved to `MiraiLogger.TopLevel`
- Mark `PlatformLogger` as
an internal API

close #633
This commit is contained in:
Him188 2020-12-04 22:27:26 +08:00
parent 270109cb89
commit 8e05d97315
8 changed files with 50 additions and 41 deletions

View File

@ -76,7 +76,7 @@ internal class Handler<in E : Event> internal constructor(
?: coroutineContext[CoroutineExceptionHandler]?.handleException(subscriberContext, e)
?: kotlin.run {
@Suppress("DEPRECATION")
(if (event is BotEvent) event.bot.logger else MiraiLogger)
(if (event is BotEvent) event.bot.logger else MiraiLogger.TopLevel)
.warning(
"""Event processing: An exception occurred but no CoroutineExceptionHandler found,
either in coroutineContext from Handler job, or in subscriberContext""".trimIndent(), e

View File

@ -48,26 +48,26 @@ public open class BotConfiguration { // open for Java
/**
* 日志记录器
*
* - 默认打印到标准输出, 通过 [DefaultLogger]
* - 默认打印到标准输出, 通过 [MiraiLogger.create]
* - 忽略所有日志: [noBotLog]
* - 重定向到一个目录: `networkLoggerSupplier = { DirectoryLogger("Net ${it.id}") }`
* - 重定向到一个文件: `networkLoggerSupplier = { SingleFileLogger("Net ${it.id}") }`
*
* @see MiraiLogger
*/
public var botLoggerSupplier: ((Bot) -> MiraiLogger) = { DefaultLogger("Bot ${it.id}") }
public var botLoggerSupplier: ((Bot) -> MiraiLogger) = { MiraiLogger.create("Bot ${it.id}") }
/**
* 网络层日志构造器
*
* - 默认打印到标准输出, 通过 [DefaultLogger]
* - 默认打印到标准输出, 通过 [MiraiLogger.create]
* - 忽略所有日志: [noNetworkLog]
* - 重定向到一个目录: `networkLoggerSupplier = { DirectoryLogger("Net ${it.id}") }`
* - 重定向到一个文件: `networkLoggerSupplier = { SingleFileLogger("Net ${it.id}") }`
*
* @see MiraiLogger
*/
public var networkLoggerSupplier: ((Bot) -> MiraiLogger) = { DefaultLogger("Net ${it.id}") }
public var networkLoggerSupplier: ((Bot) -> MiraiLogger) = { MiraiLogger.create("Net ${it.id}") }
/** 父 [CoroutineContext]. [Bot] 创建后会使用 [SupervisorJob] 覆盖其 [Job], 但会将这个 [Job] 作为父 [Job] */
public var parentCoroutineContext: CoroutineContext = EmptyCoroutineContext
@ -349,8 +349,8 @@ public open class BotConfiguration { // open for Java
internal val deviceInfoStub: (Bot) -> DeviceInfo = {
@Suppress("DEPRECATION")
MiraiLogger.warning("未指定设备信息, 已使用随机设备信息. 请查看 BotConfiguration.deviceInfo 以获取更多信息.")
MiraiLogger.TopLevel.warning("未指定设备信息, 已使用随机设备信息. 请查看 BotConfiguration.deviceInfo 以获取更多信息.")
@Suppress("DEPRECATION")
MiraiLogger.warning("Device info isn't specified. Please refer to BotConfiguration.deviceInfo for more information")
MiraiLogger.TopLevel.warning("Device info isn't specified. Please refer to BotConfiguration.deviceInfo for more information")
DeviceInfo.random()
}

View File

@ -31,7 +31,15 @@ import kotlin.contracts.contract
*
* Java 调用: `Utils.getDefaultLogger().invoke(identity)`
*/
public var DefaultLogger: (identity: String?) -> MiraiLogger = { PlatformLogger(it) }
@Deprecated(
"Use MiraiLogger.create",
level = DeprecationLevel.ERROR,
replaceWith = ReplaceWith("MiraiLogger.create(identity)", "net.mamoe.mirai.utils.MiraiLogger")
)
@PlannedRemoval("2.0-M2")
public var DefaultLogger: (identity: String?) -> MiraiLogger
get() = { MiraiLogger.create(it) }
set(value) = MiraiLogger.setDefaultLoggerCreator(value)
/**
* 给这个 logger 添加一个开关, 用于控制是否记录 log
@ -56,14 +64,28 @@ public fun MiraiLogger.withSwitch(default: Boolean = true): MiraiLoggerWithSwitc
* @see MiraiLoggerPlatformBase 平台通用基础实现. Mirai 自带的日志系统无法满足需求, 请继承这个类并实现其抽象函数.
*/
public interface MiraiLogger {
/**
* 顶层日志记录器.
*
* 顶层日志会导致混乱并难以定位问题. 请自行构造 logger 实例并使用.
* 请参考使用 [DefaultLogger]
*/
@Deprecated(message = "顶层日志会导致混乱并难以定位问题. 请自行构造 logger 实例并使用.", level = DeprecationLevel.WARNING)
public companion object : MiraiLogger by DefaultLogger("Mirai")
public companion object {
/**
* 顶层日志, 仅供 Mirai 内部使用.
*/
@MiraiInternalApi
@MiraiExperimentalApi
public val TopLevel: MiraiLogger by lazy { create("Mirai") }
@Volatile
private var defaultLogger: (identity: String?) -> MiraiLogger = { PlatformLogger(it) }
@JvmStatic
public fun setDefaultLoggerCreator(creator: (identity: String?) -> MiraiLogger) {
defaultLogger = creator
}
@JvmStatic
public fun create(identity: String?): MiraiLogger {
return defaultLogger.invoke(identity)
}
}
/**
* 日志的标记. Mirai , identity 可为
@ -154,14 +176,6 @@ public interface MiraiLogger {
* @return [follower]
*/
public operator fun <T : MiraiLogger> plus(follower: T): T
/**
* 添加一个 [follower]
* [MiraiLogger.follower] 已经有值, 则会对这个值调用 [plusAssign]. 即会在日志记录器链的末尾添加这个参数 [follower]
*
* @see follower
*/
public operator fun plusAssign(follower: MiraiLogger)
}
@ -236,8 +250,9 @@ public inline fun MiraiLogger.error(message: () -> String?, e: Throwable?) {
*
* 严重程度为 V, I, W, E. 分别对应 verbose, info, warning, error
*
* @see DefaultLogger
* @see MiraiLogger.create
*/
@MiraiInternalApi
public expect open class PlatformLogger constructor(
identity: String? = "Mirai",
output: (String) -> Unit, // TODO: 2020/11/30 review logs, currently it's just for compile
@ -443,8 +458,4 @@ public abstract class MiraiLoggerPlatformBase : MiraiLogger {
this.follower = follower
return follower
}
public override fun plusAssign(follower: MiraiLogger): Unit =
if (this.follower == null) this.follower = follower
else this.follower!! += follower
}

View File

@ -84,7 +84,7 @@ internal object WindowHelperJvm {
kotlin.runCatching {
Desktop.isDesktopSupported().also { stat ->
if (stat) {
MiraiLogger.info(
MiraiLogger.TopLevel.info(
"""
Mirai 正在使用桌面环境,
如果你正在使用SSH, 或无法访问桌面等,
@ -92,7 +92,7 @@ internal object WindowHelperJvm {
然后重启 Mirai
""".trimIndent()
)
MiraiLogger.info(
MiraiLogger.TopLevel.info(
"""
Mirai using DesktopCaptcha System.
If you are running on SSH, cannot access desktop or more.
@ -104,7 +104,7 @@ internal object WindowHelperJvm {
}
}.getOrElse {
// Should not happen
MiraiLogger.warning("Exception in checking desktop support.", it)
MiraiLogger.TopLevel.warning("Exception in checking desktop support.", it)
false
}
} else {

View File

@ -38,10 +38,11 @@ import java.util.*
*
* @param isColored 是否添加 ANSI 颜色
*
* @see DefaultLogger
* @see MiraiLogger.create
* @see SingleFileLogger 使用单一文件记录日志
* @see DirectoryLogger 在一个目录中按日期存放文件记录日志, 自动清理过期日志
*/
@MiraiInternalApi
public actual open class PlatformLogger constructor(
public override val identity: String? = "Mirai",
/**

View File

@ -33,8 +33,6 @@ import net.mamoe.mirai.internal.utils.io.readString
import net.mamoe.mirai.internal.utils.io.useBytes
import net.mamoe.mirai.internal.utils.io.withUse
import net.mamoe.mirai.utils.*
import kotlin.jvm.JvmName
import kotlin.jvm.JvmOverloads
internal sealed class PacketFactory<TPacket : Packet?> {
/**
@ -122,7 +120,7 @@ internal typealias PacketConsumer<T> = suspend (packetFactory: PacketFactory<T>,
*/
@PublishedApi
internal val PacketLogger: MiraiLoggerWithSwitch by lazy {
DefaultLogger("Packet").withSwitch(false)
MiraiLogger.create("Packet").withSwitch(false)
}
internal object KnownPacketFactories {

View File

@ -12,7 +12,7 @@
package net.mamoe.mirai.internal.utils
import kotlinx.serialization.Transient
import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.debug
import java.lang.reflect.Modifier
import kotlin.reflect.KClass
@ -31,7 +31,7 @@ private fun <T> Sequence<T>.joinToStringPrefixed(prefix: String, transform: (T)
return this.joinToString(prefix = "$prefix$indent", separator = "\n$prefix$indent", transform = transform)
}
private val SoutvLogger by lazy { DefaultLogger("soutv") }
private val SoutvLogger by lazy { MiraiLogger.create("soutv") }
internal fun Any?.soutv(name: String = "unnamed") {
@Suppress("DEPRECATION")
SoutvLogger.debug { "$name = ${this._miraiContentToString()}" }

View File

@ -14,19 +14,18 @@ package test
import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.Input
import kotlinx.io.core.readAvailable
import kotlinx.io.core.use
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.internal.utils.ByteArrayPool
import net.mamoe.mirai.internal.utils.toReadPacket
import net.mamoe.mirai.internal.utils.toUHexString
import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.MiraiLoggerWithSwitch
import net.mamoe.mirai.utils.withSwitch
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
val DebugLogger: MiraiLoggerWithSwitch = DefaultLogger("Packet Debug").withSwitch(true)
val DebugLogger: MiraiLoggerWithSwitch = MiraiLogger.create("Packet Debug").withSwitch(true)
internal inline fun ByteArray.debugPrintThis(name: String): ByteArray {
DebugLogger.debug(name + "=" + this.toUHexString())