2010年6月18日

為 Grails service 物件宣告 logger

一般來說, Java class 中使用 logger(以 Log4j 為例), 會使用兩個方式:
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" 給誆了

沒有留言: