Commit 7771856a authored by Him188's avatar Him188

Add MiraiLogger.withSwitch

parent 2b477b3b
...@@ -6,6 +6,7 @@ import kotlinx.coroutines.* ...@@ -6,6 +6,7 @@ import kotlinx.coroutines.*
import net.mamoe.mirai.event.internal.broadcastInternal import net.mamoe.mirai.event.internal.broadcastInternal
import net.mamoe.mirai.utils.DefaultLogger import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.withSwitch
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.EmptyCoroutineContext
import kotlin.jvm.JvmOverloads import kotlin.jvm.JvmOverloads
...@@ -46,14 +47,15 @@ abstract class Event : Subscribable { ...@@ -46,14 +47,15 @@ abstract class Event : Subscribable {
init { init {
if (EventDebuggingFlag) { 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 { private val EventDebuggingFlag: Boolean by lazy {
// avoid 'Condition is always true'
false false
} }
...@@ -76,14 +78,14 @@ interface Cancellable : Subscribable { ...@@ -76,14 +78,14 @@ interface Cancellable : Subscribable {
@JvmOverloads @JvmOverloads
suspend fun <E : Subscribable> E.broadcast(context: CoroutineContext = EmptyCoroutineContext): E { suspend fun <E : Subscribable> E.broadcast(context: CoroutineContext = EmptyCoroutineContext): E {
if (EventDebuggingFlag) { if (EventDebuggingFlag) {
EventLogger.debug(this::class.simpleName + " pre broadcast") EventDebugLogger.debug(this::class.simpleName + " pre broadcast")
} }
try { try {
@Suppress("EXPERIMENTAL_API_USAGE") @Suppress("EXPERIMENTAL_API_USAGE")
return withContext(EventScope.newCoroutineContext(context)) { this@broadcast.broadcastInternal() } return withContext(EventScope.newCoroutineContext(context)) { this@broadcast.broadcastInternal() }
} finally { } finally {
if (EventDebuggingFlag) { if (EventDebuggingFlag) {
EventLogger.debug(this::class.simpleName + " after broadcast") EventDebugLogger.debug(this::class.simpleName + " after broadcast")
} }
} }
} }
......
...@@ -5,7 +5,7 @@ import kotlinx.coroutines.launch ...@@ -5,7 +5,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import net.mamoe.mirai.Bot 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.EventScope
import net.mamoe.mirai.event.ListeningStatus import net.mamoe.mirai.event.ListeningStatus
import net.mamoe.mirai.event.Subscribable import net.mamoe.mirai.event.Subscribable
...@@ -27,7 +27,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li ...@@ -27,7 +27,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li
if (mainMutex.tryLock(listener)) {//能锁则代表这个事件目前没有正在广播. if (mainMutex.tryLock(listener)) {//能锁则代表这个事件目前没有正在广播.
try { try {
add(listener)//直接修改主监听者列表 add(listener)//直接修改主监听者列表
EventLogger.debug("Added a listener to ${this@subscribeInternal.simpleName}") EventDebugLogger.debug("Added a listener to ${this@subscribeInternal.simpleName}")
} finally { } finally {
mainMutex.unlock(listener) mainMutex.unlock(listener)
} }
...@@ -37,7 +37,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li ...@@ -37,7 +37,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li
//不能锁住, 则这个事件正在广播, 那么要将新的监听者放入缓存 //不能锁住, 则这个事件正在广播, 那么要将新的监听者放入缓存
cacheMutex.withLock { cacheMutex.withLock {
cache.add(listener) 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 { EventScope.launch {
...@@ -48,7 +48,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li ...@@ -48,7 +48,7 @@ internal suspend fun <E : Subscribable> KClass<E>.subscribeInternal(listener: Li
if (cache.size != 0) { if (cache.size != 0) {
addAll(cache) addAll(cache)
cache.clear() 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")
} }
} }
} }
......
...@@ -19,6 +19,11 @@ var DefaultLogger: (identity: String?) -> MiraiLogger = { PlatformLogger() } ...@@ -19,6 +19,11 @@ var DefaultLogger: (identity: String?) -> MiraiLogger = { PlatformLogger() }
*/ */
expect open class PlatformLogger @JvmOverloads internal constructor(identity: String? = "Mirai") : MiraiLoggerPlatformBase 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?, ...@@ -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] 的调用传递. * 实现了 [follower] 的调用传递.
* 若要自行实现日志记录, 请优先考虑继承 [PlatformLogger] *
* 若要自行实现日志记录, 请优先考虑继承 [PlatformLogger].
*
* 它不应该被用作变量的类型定义. 只应被继承
*/ */
abstract class MiraiLoggerPlatformBase : MiraiLogger { abstract class MiraiLoggerPlatformBase : MiraiLogger {
final override var follower: MiraiLogger? = null final override var follower: MiraiLogger? = null
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment