假设我有一个日志记录函数:
fun log(message: String)
遗憾的是,此函数将从协程和协程外部调用。对于协程,我想记录来自协程上下文的其他信息(例如,协程的名称(。
我怎样才能做到这一点?
这些是我的想法,但我没有解决方案:
- 以某种方式弄清楚
log
内部是否在协程内并得到coroutineContext
.这可能吗? - 我可以有两个版本的
log
例如log
和logSuspend
.但是我如何确保正确的人被调用?如果我在suspend
里面,没有什么能阻止我意外地打电话给log
。此外,我可能有一个常规的助手功能。它应该叫哪一个? - 也许是
ThreadLocal
的东西,例如,我可以在某个时候coroutineContext
ThreadLocal
内,但我如何确保它保持最新状态?
以某种方式在日志中找出它是否在协程内并得到 协程上下文。这可能吗?
我认为没有一个好的解决方案。
我将创建两个log
函数,第一个用于通用,第二个 - CoroutineScope
上的扩展函数用于协程:
fun log(message: String) {...}
fun CoroutineScope.log(message: String) {
//here you can access coroutineContext
}
如果你像这样从协程中调用log
函数:
GlobalScope.launch {
log("CoroutineScope.log")
}
扩展函数将被调用,您将可以访问协程上下文。
注意:不建议使用GlobalScope,它仅用于演示目的。