在没有类的包级别创建记录器
我有一个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协助这个和更多。