private static final Logger log = Logger.getLogger(MyClass.class);或
private static final Logger log = Logger.getLogger("MyClass");
而在 Grails 的 controller 中則可以直接使用 impicit 物件: log主要是因為 Grails 已經幫忙做了 Dependency Injection; 而其 logger 物件已在 conf/Config.groovy 宣告
但是, service 物件怎麼辦呢?
此時的做法, 則會像一般 Java class 的方式(以 SLF4J 為例)來宣告, 如下:
private static final Logger log = LoggerFactory.getLogger(MyService.class)同時, 規劃了 log 的輸出檔案; 也就是在 conf/Config.groovy 中設計一個 appender:
log4j = {
appenders {
appender new org.apache.log4j.DailyRollingFileAppender(
name: "dailyAppender",
layout: pattern(conversionPattern: '[%d{yyyy-MM-dd HH:mm:ss}] %p %m%n'),
file: "${System.properties['java.io.tmpdir']}/my-test.log",
datePattern: "'.'yyyy-MM-dd")
}
...
info dailyAppender: 'MyService'
...
但, 相關訊息輸出的執行結果未出現在 appender 所指定的檔案之中;還好, console 仍有 service 物件的訊息輸出; 並且提示輸出的 class 名稱為:
service.MyService
於是修改 service 物件中的宣告:
private static final Logger log = LoggerFactory.getLogger('service.MyService')
但, 結果仍不是預期的; 經查明資料後發現, 在 conf/Config.groovy 中 logger 的宣告應該為:... info dailyAppender: 'grails.app.service.MyService' ...同時, 要變更 service 物件中的宣告為:
private static final Logger log = LoggerFactory.getLogger('grails.app.service.MyService')
而此時測試的結果, 才真正輸出至預期的檔案之中。ps.
原來, 我被輸出的訊息 "service.MyService" 給誆了
沒有留言:
張貼留言