获取 Logger 的惯用 Kotlin 方法是什么?
What is an idiomatic Kotlin way to aquire a Logger?
我想更换
private static final Logger log = Logger.getLogger(MyClass.class);
然后使用一些不那么冗长和更惯用的东西
class MyClass {
companion object {
val log = LoggerFactory.getLogger(MyClass::class.java)
}
fun usage() {
log.debug("Success")
}
}
不必在每个 class.
中删除它的奖励积分
我试过了:
interface HasLogger {
val log: Logger
get() = LoggerFactory.getLogger(this.javaClass)
}
但这会导致每次使用时都会调用 getLogger()(不可接受),还会 returns 子类型(不是声明它的那个)的记录器。
您可以创建一个实用方法,例如
inline fun <reified T:Any> loggerFor() = LoggerFactory.getLogger(T::class.java)
并且像
一样简单地使用它
class MyClass {
companion object {
val log = loggerFor<MyClass>()
}
fun usage() {
log.debug("Success")
}
}
或者,您可以使用文件级别的私有记录器,它可以节省您的一些输入,这似乎只是当您没有多个 类 每个文件都定义了自己的记录器时,这似乎是一个很好的解决方案:
private val log = loggerFor<MyClass>()
class MyClass {
fun usage() {
log.debug("Success")
}
}
首先,您可以添加用于创建记录器的扩展函数。
inline fun <reified T : Any> getLogger() = LoggerFactory.getLogger(T::class.java)
fun <T : Any> T.getLogger() = LoggerFactory.getLogger(javaClass)
然后您就可以使用以下代码创建记录器了。
private val logger1 = getLogger<SomeClass>()
private val logger2 = getLogger()
其次,您可以定义一个提供记录器及其混合实现的接口。
interface LoggerAware {
val logger: Logger
}
class LoggerAwareMixin(containerClass: Class<*>) : LoggerAware {
override val logger: Logger = LoggerFactory.getLogger(containerClass)
}
inline fun <reified T : Any> loggerAware() = LoggerAwareMixin(T::class.java)
该接口可以通过以下方式使用
class SomeClass : LoggerAware by loggerAware<SomeClass>() {
// Now you can use a logger here.
}
我想更换
private static final Logger log = Logger.getLogger(MyClass.class);
然后使用一些不那么冗长和更惯用的东西
class MyClass {
companion object {
val log = LoggerFactory.getLogger(MyClass::class.java)
}
fun usage() {
log.debug("Success")
}
}
不必在每个 class.
中删除它的奖励积分我试过了:
interface HasLogger {
val log: Logger
get() = LoggerFactory.getLogger(this.javaClass)
}
但这会导致每次使用时都会调用 getLogger()(不可接受),还会 returns 子类型(不是声明它的那个)的记录器。
您可以创建一个实用方法,例如
inline fun <reified T:Any> loggerFor() = LoggerFactory.getLogger(T::class.java)
并且像
一样简单地使用它class MyClass {
companion object {
val log = loggerFor<MyClass>()
}
fun usage() {
log.debug("Success")
}
}
或者,您可以使用文件级别的私有记录器,它可以节省您的一些输入,这似乎只是当您没有多个 类 每个文件都定义了自己的记录器时,这似乎是一个很好的解决方案:
private val log = loggerFor<MyClass>()
class MyClass {
fun usage() {
log.debug("Success")
}
}
首先,您可以添加用于创建记录器的扩展函数。
inline fun <reified T : Any> getLogger() = LoggerFactory.getLogger(T::class.java)
fun <T : Any> T.getLogger() = LoggerFactory.getLogger(javaClass)
然后您就可以使用以下代码创建记录器了。
private val logger1 = getLogger<SomeClass>()
private val logger2 = getLogger()
其次,您可以定义一个提供记录器及其混合实现的接口。
interface LoggerAware {
val logger: Logger
}
class LoggerAwareMixin(containerClass: Class<*>) : LoggerAware {
override val logger: Logger = LoggerFactory.getLogger(containerClass)
}
inline fun <reified T : Any> loggerAware() = LoggerAwareMixin(T::class.java)
该接口可以通过以下方式使用
class SomeClass : LoggerAware by loggerAware<SomeClass>() {
// Now you can use a logger here.
}