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

我有一个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协助这个和更多。