Add MiraiLogger.withSwitch

This commit is contained in:
Him188 2019-11-08 19:32:21 +08:00
parent 2b477b3be7
commit 7771856a4a
3 changed files with 53 additions and 10 deletions

View File

@ -6,6 +6,7 @@ import kotlinx.coroutines.*
import net.mamoe.mirai.event.internal.broadcastInternal
import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.withSwitch
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.jvm.JvmOverloads
@ -46,14 +47,15 @@ abstract class Event : Subscribable {
init {
if (EventDebuggingFlag) {
EventLogger.debug(this::class.simpleName + " created")
EventDebugLogger.debug(this::class.simpleName + " created")
}
}
}
internal object EventLogger : MiraiLogger by DefaultLogger("Event")
internal object EventDebugLogger : MiraiLogger by DefaultLogger("Event").withSwitch(EventDebuggingFlag)
private val EventDebuggingFlag: Boolean by lazy {
// avoid 'Condition is always true'
false
}
@ -76,14 +78,14 @@ interface Cancellable : Subscribable {
@JvmOverloads
suspend fun <E : Subscribable> E.broadcast(context: CoroutineContext = EmptyCoroutineContext): E {
if (EventDebuggingFlag) {
EventLogger.debug(this::class.simpleName + " pre broadcast")
EventDebugLogger.debug(this::class.simpleName + " pre broadcast")
}
try {
@Suppress("EXPERIMENTAL_API_USAGE")
return withContext(EventScope.newCoroutineContext(context)) { this@broadcast.broadcastInternal() }
} finally {
if (EventDebuggingFlag) {
EventLogger.debug(this::class.simpleName + " after broadcast")
EventDebugLogger.debug(this::class.simpleName + " after broadcast")
}
}
}

View File

@ -5,7 +5,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.EventLogger
import net.mamoe.mirai.event.EventDebugLogger
import net.mamoe.mirai.event.EventScope
import net.mamoe.mirai.event.ListeningStatus
import net.mamoe.mirai.event.Subscribable
@ -27,7 +27,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li
if (mainMutex.tryLock(listener)) {//能锁则代表这个事件目前没有正在广播.
try {
add(listener)//直接修改主监听者列表
EventLogger.debug("Added a listener to ${this@subscribeInternal.simpleName}")
EventDebugLogger.debug("Added a listener to ${this@subscribeInternal.simpleName}")
} finally {
mainMutex.unlock(listener)
}
@ -37,7 +37,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li
//不能锁住, 则这个事件正在广播, 那么要将新的监听者放入缓存
cacheMutex.withLock {
cache.add(listener)
EventLogger.debug("Added a listener to cache of ${this@subscribeInternal.simpleName}")
EventDebugLogger.debug("Added a listener to cache of ${this@subscribeInternal.simpleName}")
}
EventScope.launch {
@ -48,7 +48,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li
if (cache.size != 0) {
addAll(cache)
cache.clear()
EventLogger.debug("Cache of ${this@subscribeInternal.simpleName} is now transferred to main")
EventDebugLogger.debug("Cache of ${this@subscribeInternal.simpleName} is now transferred to main")
}
}
}

View File

@ -19,6 +19,11 @@ var DefaultLogger: (identity: String?) -> MiraiLogger = { PlatformLogger() }
*/
expect open class PlatformLogger @JvmOverloads internal constructor(identity: String? = "Mirai") : MiraiLoggerPlatformBase
/**
* 给这个 logger 添加一个开关, 用于控制是否记录 log
*/
@JvmOverloads
fun MiraiLogger.withSwitch(default: Boolean = true): MiraiLoggerWithSwitch = MiraiLoggerWithSwitch(this, default)
/**
* 日志记录器. 所有的输出均依赖于它.
@ -161,9 +166,45 @@ class SimpleLogger(override val identity: String?, private val logger: (String?,
}
/**
* 平台基类.
* 带有开关的 Logger. 仅能通过 [MiraiLogger.withSwitch] 构造
*
* @see enable 开启
* @see disable 关闭
*/
@Suppress("MemberVisibilityCanBePrivate")
class MiraiLoggerWithSwitch internal constructor(private val delegate: MiraiLogger, default: Boolean) : MiraiLoggerPlatformBase() {
override val identity: String? get() = delegate.identity
private var switch: Boolean = default
fun enable() {
switch = true
}
fun disable() {
switch = false
}
override fun verbose0(any: Any?) = delegate.verbose(any)
override fun verbose0(message: String?, e: Throwable?) = delegate.verbose(message, e)
override fun debug0(any: Any?) = delegate.debug(any)
override fun debug0(message: String?, e: Throwable?) = delegate.debug(message, e)
override fun info0(any: Any?) = delegate.info(any)
override fun info0(message: String?, e: Throwable?) = delegate.info(message, e)
override fun warning0(any: Any?) = delegate.warning(any)
override fun warning0(message: String?, e: Throwable?) = delegate.warning(message, e)
override fun error0(any: Any?) = delegate.error(any)
override fun error0(message: String?, e: Throwable?) = delegate.error(message, e)
}
/**
* 平台日志基类.
* 实现了 [follower] 的调用传递.
* 若要自行实现日志记录, 请优先考虑继承 [PlatformLogger]
*
* 若要自行实现日志记录, 请优先考虑继承 [PlatformLogger].
*
* 它不应该被用作变量的类型定义. 只应被继承
*/
abstract class MiraiLoggerPlatformBase : MiraiLogger {
final override var follower: MiraiLogger? = null