我有一个带有几个包级函数的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")
}
使用类查找好的标识符有很好的最佳做法:link 1 link 2。如果没有课程,方法是什么?
我想避免手工编写标识符,并在包名称更改时进行调整。有没有办法在kotlin中获取包名?
答案 0 :(得分:4)
这一行应该可以胜任:
private val log = LoggerFactory.getLogger(object{}::class.java.`package`.name)
该对象什么都不做,但kotlin会创建一个类来保存代码。然后,您可以访问类,包,包名称。
注意反引号的使用,因为package
是保留关键字。在java中它不是问题,因为真正的方法是getPackage()
。 kotlin的较短语法通过直接访问名称现在与保留关键字冲突的属性来转换此方法调用。
答案 1 :(得分:1)
您可以为生成的类创建一个顶级记录器,如下所示:
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处为此提供更多帮助。