2017-07-27 28 views
0

我有一個包含幾個包級函數但沒有任何類的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 1link 2。如果沒有課程,你最喜歡的方法是什麼?

我想避免手動編寫標識符,並在包名稱更改時進行調整。有沒有辦法在kotlin中獲取包名?

+0

頂級功能在效用函數時很好。但邏輯應該位於'class'(或'object')中。 –

+1

這是爲什麼?面向對象的編程只是開發你的代碼的一種方式,還有其他的範例是kotlin完美適合的。 – linqu

+2

你有沒有試過https://github.com/MicroUtils/kotlin-logging? –

回答

2

此行應該做的工作:

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

的對象是什麼都不做,但仍然科特林將創建一個類來保存代碼。然後您可以訪問類,包,包名。

注意反引用的用法,因爲package是保留關鍵字。在java中它不是問題,因爲真正的方法是getPackage()。 kotlin的較短語法通過直接訪問屬性來調用此方法,該屬性現在與保留關鍵字衝突。

+0

很好的答案,謝謝。最後,我採用了弗蘭克評論的解決方案。如果你對這種額外的依賴性很好,他的解決方案更加優雅。 – linqu

+1

當然,我更專注於您的確切問題「是否有方法在kotlin中獲取包名?」比我會做我自己。 – GaetanZ

0

您可以生成的類像這樣創建一個頂級記錄:

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