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

[console] Change convention of createLoggerFactory()

This commit is contained in:
Karlatemp 2022-08-27 22:51:58 +08:00
parent e967b888a3
commit 969c77f146
No known key found for this signature in database
GPG Key ID: BA173CA2B9956C59
5 changed files with 54 additions and 20 deletions
mirai-console
mirai-core-api/src/jvmBaseMain/kotlin/utils

View File

@ -23,10 +23,10 @@ import net.mamoe.mirai.console.data.PluginData
import net.mamoe.mirai.console.data.PluginDataStorage
import net.mamoe.mirai.console.extension.ComponentStorage
import net.mamoe.mirai.console.fontend.DefaultLoggingProcessProgress
import net.mamoe.mirai.console.fontend.ProcessProgress
import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge
import net.mamoe.mirai.console.internal.command.CommandManagerImpl
import net.mamoe.mirai.console.internal.data.builtins.ConsoleDataScopeImpl
import net.mamoe.mirai.console.fontend.ProcessProgress
import net.mamoe.mirai.console.internal.logging.LoggerControllerImpl
import net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl
import net.mamoe.mirai.console.internal.pluginManagerImpl
@ -228,15 +228,6 @@ public interface MiraiConsoleImplementation : CoroutineScope {
return DefaultLoggingProcessProgress()
}
/**
* 创建一个 [MiraiLogger.Factory]. 在返回的实例中必须调用 [platformImplementation] 来适配平台日志实现.
*
* @param platformImplementation 平台的日志实现, 这可能是使用 SLF4J 等日志框架转接的实例.
*
* @since 2.13
*/
public fun createLoggerFactory(platformImplementation: MiraiLogger.Factory): MiraiLogger.Factory
/**
* 该前端是否支持使用 Ansi 输出彩色信息
@ -390,6 +381,36 @@ public interface MiraiConsoleImplementation : CoroutineScope {
get() = backendAccessInstance
///////////////////////////////////////////////////////////////////////////
// Logging
///////////////////////////////////////////////////////////////////////////
/**
* 创建一个 [MiraiLogger.Factory].
*
* @since 2.13
*/
public fun createLoggerFactory(context: FrontendLoggingInitContext): MiraiLogger.Factory
/**
* 前端 [MiraiLogger.Factory] 加载的上下文
*
* 全局的日志工厂的初始化可以分为如下几步
*
* 1. 接管 stdout ( [System.setOut]), stdout 重定向至屏幕.
* 之后平台日志实现会将日志通过被接管的 stdout 输出至屏幕
* 2. 前端返回 [platformImplementation][acquirePlatformImplementation] 或者返回适配的 [MiraiLogger.Factory]
*/
@ConsoleFrontEndImplementation
public interface FrontendLoggingInitContext {
/**
* 平台的日志实现, 这可能是使用 SLF4J 等日志框架转接的实例.
*
* 调用此函数会立即初始化平台日志实现. 在未完成准备工作前切勿使用此方法
*/
public fun acquirePlatformImplementation(): MiraiLogger.Factory
}
///////////////////////////////////////////////////////////////////////////
// ConsoleLaunchOptions
///////////////////////////////////////////////////////////////////////////

View File

@ -117,6 +117,10 @@ internal class MiraiConsoleImplementationBridge(
}
}
override fun createLoggerFactory(context: MiraiConsoleImplementation.FrontendLoggingInitContext): MiraiLogger.Factory {
error("Duplicated logger factory initalization is not allowed. Use MiraiLogger.Factory instead.")
}
init {
// When writing a log:
// 1. ControlledLoggerFactory checks if that log level is enabled
@ -124,12 +128,20 @@ internal class MiraiConsoleImplementationBridge(
// ... if not, return
// 3. [externalImplementation] decides how to log the message
// 4. [externalImplementation] outputs by using [platform]
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
MiraiLoggerFactoryImplementationBridge.wrapCurrent { platform ->
ControlledLoggerFactory(externalImplementation.createLoggerFactory(platform))
val context = object : MiraiConsoleImplementation.FrontendLoggingInitContext {
override fun acquirePlatformImplementation(): MiraiLogger.Factory {
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
return MiraiLoggerFactoryImplementationBridge.instance
}
}
val response = externalImplementation.createLoggerFactory(context)
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
MiraiLoggerFactoryImplementationBridge.setInstance(ControlledLoggerFactory(response))
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
MiraiLoggerFactoryImplementationBridge.freeze() // forbid any further overrides
}

View File

@ -85,7 +85,7 @@ open class MockConsoleImplementation : MiraiConsoleImplementation {
return PlatformLogger(identity)
}
override fun createLoggerFactory(platformImplementation: MiraiLogger.Factory): MiraiLogger.Factory {
override fun createLoggerFactory(context: MiraiConsoleImplementation.FrontendLoggingInitContext): MiraiLogger.Factory {
return object : MiraiLogger.Factory {
override fun create(requester: Class<*>, identity: String?): MiraiLogger {
return PlatformLogger(identity)

View File

@ -117,7 +117,7 @@ open class MiraiConsoleImplementationTerminal
// })
}
override fun createLoggerFactory(platformImplementation: MiraiLogger.Factory): MiraiLogger.Factory {
override fun createLoggerFactory(context: MiraiConsoleImplementation.FrontendLoggingInitContext): MiraiLogger.Factory {
// platformImplementation is not used by Terminal
return object : MiraiLogger.Factory {

View File

@ -265,9 +265,10 @@ public actual interface MiraiLogger {
* @since 2.13
*/
internal object MiraiLoggerFactoryImplementationBridge : MiraiLogger.Factory {
@Volatile
var instance: MiraiLogger.Factory = createPlatformInstance()
private set
@Suppress("ObjectPropertyName")
private var _instance by lateinitMutableProperty { createPlatformInstance() }
internal val instance get() = _instance
fun createPlatformInstance() = loadService(MiraiLogger.Factory::class) { DefaultFactory() }
@ -280,7 +281,7 @@ internal object MiraiLoggerFactoryImplementationBridge : MiraiLogger.Factory {
@TestOnly
fun reinit() {
frozen.loop { value ->
instance = createPlatformInstance()
_instance = createPlatformInstance()
if (frozen.compareAndSet(value, false)) return
}
}
@ -297,7 +298,7 @@ internal object MiraiLoggerFactoryImplementationBridge : MiraiLogger.Factory {
"Check if you actually did use mirai-console somewhere, or please file an issue on https://github.com/mamoe/mirai/issues/new/choose"
)
}
this.instance = instance
this._instance = instance
}
inline fun wrapCurrent(mapper: (current: MiraiLogger.Factory) -> MiraiLogger.Factory) {