2014-09-19 142 views
2

我使用下面的方法來從班一個Grails應用程序訪問一個記錄器實例:添加記錄器中的Grails類

在Grails的假象(控制器,服務,域類等)我只是使用logger即由Grails添加,例如

class MyController { 
    def someAction() { 
    log.debug "something" 
    } 
} 

對於類src/groovy下我註釋它們與@groovy.util.logging.Slf4j,例如

@Slf4j 
class Foo { 

    Foo() { 
    log.debug "log it" 
    } 
} 

的記錄似乎在這兩種情況下循規蹈矩,但稍微困擾我的是,類伐木工人的不同。當我使用註釋時,記錄器的類是org.slf4j.impl.GrailsLog4jLoggerAdapter,但是當我使用自動添加到Grails文物的記錄器時,類是org.apache.commons.logging.impl.SLF4JLog

是否有建議(或更好)的方法來添加記錄器到Grails類?

回答

2

我沒有看到你所描述的任何問題。 SLF4J不是一個日誌框架,它是一個日誌框架包裝器。但除了Grails類中的某些Grails特定的鉤子外,它們都實現了相同的接口並最終委託給相同的記錄器/ appenders /等。在真正的實現庫中,通常是Log4j。

我相當確定的是不同的,雖然是日誌類別/名稱,因爲您需要根據記錄器名稱的變化來配置基礎庫。通過註釋,記錄器名稱與包的完整類名相同。有一個Grails補充說,有一個基於工件類型的額外前綴。我總是忘記命名約定,但知道記錄器名稱的快速方法是記錄它;在您的課堂,它會在運行時訪問補充一點:

println log.name 

它會打印出完整的記錄器名稱(使用println代替log方法避免了潛在的錯誤配置問題,可以保持信息被記錄

我喜歡讓事情變得簡單,一致的和應當知道所用,所以我跳過包裝庫和直接使用Log4j。訪問記錄器是容易的。導入類

import org.apache.log4j.Logger 

然後將其添加爲類字段:

Logger log = Logger.getLogger(getClass().name) 

這可以複製/粘貼到其它類,因爲沒有硬編碼名稱。它不會在靜態的範圍內工作,所以,我想補充

static Logger LOG = Logger.getLogger(this.name) 

也使用了「這個」靜態範圍指的是類Groovy的支持,避免硬編碼。