2015年10月5日 星期一

在 Jetty 9 上使用 Logger

從 Tomcat 改用 Jetty 以後,第一個遇到的問題就是,以前用的 Log4j 好像沒有反應了。
查了一下,Jetty 好像預設使用 slf4j(如果 classpath 中存在 slf4j 的話)[1]
所以似乎比較建議使用 slf4j 作為 Logger。

實際作法蠻簡單的~在專案的 pom.xml 中加入 slf4j 與 log4j 的相關設定
這裡因為我目前還是想用 log4j 來輸出,因此除了 slf4j-api 外,還放了 slf4j-log4j12 的套件
以讓 slf4j 的 log 得以往 log4j 輸出。
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.12</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.12</version>
</dependency>

然後在專案中加入 log4j 的輸出設定 log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

     <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
         <layout class="org.apache.log4j.PatternLayout">
              <!-- param name="ConversionPattern" value='%d{yyyy.MM.dd HH:mm:ss.SSS} %5p (%c.%M) - %m%n' /> -->
              <param name="ConversionPattern" value='%d{yyyy-MM-dd HH:mm:ss.SSS} | %p | %c > %m%n' />
         </layout>
     </appender>
     <root>
         <level value="DEBUG" />
         <appender-ref ref="ConsoleAppender" />
     </root>
</log4j:configuration>

最後在程式碼中,使用 slf4j 來寫 log。
這裡因為我實驗的是以 Jersey 為入口,因此直接用 Jersey 的範本程式碼:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("/")
public class MyResource {
 private static Logger log = LoggerFactory.getLogger("Test");

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
     log.info("Test got it for info");
     log.debug("Test got it for deubg");
        return "Got it!";
    }
}

最後呼叫該函式(用瀏覽器存取該函式對應的 RESTful 網址)時,在 Jetty 上反應出來的 stderrout.log 如下:
2015-10-05 15:59:43.278:INFO:oejs.ServerConnector:main: Started ServerConnector@68c4d1f1{HTTP/1.1,[http/1.1]}{0.0.0.0:9200}
2015-10-05 15:59:43.280:INFO:oejs.ServerConnector:main: Started ServerConnector@42444104{HTTP/1.1,[http/1.1]}{0.0.0.0:9300}
2015-10-05 15:59:43.281:INFO:oejs.Server:main: Started @5379ms
2015-10-05 16:00:06.878 | INFO | Test > Test got it for info
2015-10-05 16:00:06.878 | DEBUG | Test > Test got it for deubg

參考資料:
  1. How to enable logging in jetty?
  2. 如何配置SLF4J不同的日志实现

沒有留言: