在没有类的包级别创建记录器



我有一个 kotlin 文件,其中包含几个包级函数,没有任何类。我想将日志记录添加到此类中,但很难找到一种优雅的方式来为记录器提供标识符。

这是一个例子

package com.example.myproject.my_package
import org.slf4j.LoggerFactory

private val log = LoggerFactory.getLogger("com.example.myproject.my_package")
fun bla(term: String) {
log.info("invoked with $term")
}

有非常好的最佳实践来使用类来查找一个好的标识符:链接 1 链接 2。如果没有类,有什么方法?

我想避免手动编写标识符并在包名称更改时进行调整。有没有办法在 kotlin 中获取包名?

这一行应该可以完成这项工作:

private val log = LoggerFactory.getLogger(object{}::class.java.`package`.name)

该对象什么都不做,但 kotlin 将创建一个类来保存代码。然后,您可以访问类、包、包名称。

请注意反引号的用法,因为package是一个保留关键字。在java中这不是问题,因为真正的方法是getPackage()。kotlin 的较短语法通过直接访问名称现在与保留关键字冲突的属性来转换此方法调用。

您可以为生成的类创建一个顶级记录器,如下所示:

private val logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())

或者对于这样的包:

private val logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass().`package`.name)

这样做的好处是不需要创建额外的类文件,但它至少需要 Java 7。我创建了一个库,可以在 https://github.com/kxtra/kxtra-slf4j 上提供帮助。

最新更新