1. 程式人生 > >《Apache MINA 2.0 使用者指南》第十二章:日誌過濾器

《Apache MINA 2.0 使用者指南》第十二章:日誌過濾器

        背景
Apache MINA 體系允許基於 MINA 的應用的開發者使用他們自己的日誌系統。
SLF4J
MINA 使用了簡單日誌門面 (Simple Logging Facade for Java,SLF4J)。你可以在這裡找到 SLF4J 的資訊。這個日誌工具允許任意數量的日誌系統的實現。你可以使用 log4j、java.util.logging 或者其他日誌系統。這個的精彩之處在於如果你在以後的開發處理中將 java.util.logging 改為 log4j,你完全不需要修改你的原始碼。
選擇合適的 jar 包

SLF4J 使用靜態繫結。這意味著每個支援的日誌框架都有自己的一個 jar 檔案。你可以通過選擇呼叫了你靜態選擇的日誌框架的 jar 檔案使用你喜愛的日誌框架。以下是使用特定日誌框架所需 jar 包的列表:

日誌框架需要的 jar 包
Log4J 1.2.xslf4j-api.jar, slf4j-log4j12.jar**
Log4J 1.3.xslf4j-api.jar, slf4j-log4j13.jar
java.util.loggingslf4j-api.jar, slf4j-jdk14.jar**
Commons Loggingslf4j-api.jar, slf4j-jcl.jar


        有幾件事要記住:
  • slf4j-api.jar 是任何實現 jar 包裡都必須的
  • 重要 你不可以把多個實現 jar 包放在 class path (比如 slf4j-log4j12.jar 和 slf4j-jdk14.jar 一起);這樣可能會導致你的應用出現意想不到的行為。
  • slf4j-api.jar 和 slf4j-.jar 的版本應該一致。
        配置正確之後,你就可以繼續去配置你具體選擇的日誌框架了 (比如,修改 log4j.properties)。
        覆蓋 Jakarta Commons Logging
        SLF4J 也提供了一種辦法在不修改原始碼的情況下將使用 Jakarta Commons Logging 的應用轉換為使用 SLF4J。只需要將 commons-loggong jar 檔案從 class path 中移除,然後新增 jcl104-over-slf4j.jar 到 class path。
        log4j 例子

        本示例我們將使用 log4j 日誌系統。建立一個專案,然後講以下程式碼片段放進一個叫做 log4j.properties 的檔案:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n

        這個檔案將被放在我們專案的 src 目錄。如果你使用的是 IDE,在你測試你的程式碼的時候你需要將此配置檔案放在 JVM 的 classpath 下。
        儘管這裡演示瞭如何建立一個使用日誌的 IoAcceptor,記住 SLF4J API 可能會在你的程式中的任何地方被使用,以生成適用於你的需求的恰當的日誌資訊。
        接下來我們建立一個簡單的示例伺服器以生成一些日誌。這裡我們採用的是 EchoServer 示例專案並新增日誌到類中:
public static void main(String[] args) throws Exception {
    IoAcceptor acceptor = new SocketAcceptor();
    DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

LoggingFilter loggingFilter = new LoggingFilter();
    chain.addLast("logging", loggingFilter);

    acceptor.setLocalAddress(new InetSocketAddress(PORT));
    acceptor.setHandler(new EchoProtocolHandler());
    acceptor.bind();

    System.out.println("Listening on port " + PORT);
}

        正如你所看到的,我們移除了 addLogger 方法並在 EchoServer 示例中添加了兩行。通過 LoggingFilter 的引用,你可以為你的處理器中 IoAcceptor 關聯到的每個事件型別設定日誌級別。為了定義觸發日誌的 IoHandler 事件並指定所執行的日誌級別,LoggingFilter 定義了一個叫做 setLogLevel(IoEventType, LogLevel) 方法。以下是為這一方法的選項:

IO 事件型別描述
SESSION_CREATED在新會話被建立時呼叫
SESSION_OPENED在新會話被開啟時呼叫
SESSION_CLOSED在會話被關閉時呼叫
MESSAGE_RECEIVED接收到資料時呼叫
MESSAGE_SENT訊息被髮送時呼叫
SESSION_IDLE到達會話空閒時間時呼叫
EXCEPTION_CAUGHT有異常丟擲時呼叫


        以下是為日誌級別的描述:

日誌級別描述
NONE這個將導致無視配置的存在而沒有任何日誌事件被建立
TRACE在日誌系統中建立一個 TRACE 事件
DEBUG產生日誌系統中的 debug 日誌
INFO產生日誌系統中的資訊訊息日誌
WARN產生日誌系統中的警告訊息日誌
ERROR產生日誌系統中的錯誤訊息日誌


        使用這些資訊,你足以建立一個基本的日誌系統了,並可以在此示例基礎上進行擴充套件以為你自己的系統產生日誌資訊。
原文連結:http://mina.apache.org/mina-project/userguide/ch12-logging-filter/ch12-logging-filter.html