1. 程式人生 > >Mina Core 12-日誌過濾器

Mina Core 12-日誌過濾器

背景

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.x

slf4j-api.jarslf4j-log4j12.jar**

Log4J 1.3.x

slf4j-api.jarslf4j-log4j13.jar

java.util.logging

slf4j-api.jarslf4j-jdk14.jar**

Commons Logging

slf4j-api.jar

slf4j-jcl.jar

 

有幾點需要注意:

1.slf4j-api.jar通常用於任何實現JAR。

2.重要事項您不應在類路徑中放置多個實現JAR檔案(例如slf4j-log4j12.jar和slf4j-jdk14.jar);它可能會導致您的應用程式出現意外行為。

3.slf4j-api.jar和slf4j-.jar的版本應該相同。

正確配置後,您可以繼續配置您選擇的實際日誌記錄框架(例如,修改log4j.properties)。

 

覆蓋Jakarta CommonsLogging

SLF4J還提供了一種方法,可以將使用Jakarta Commons Logging的現有應用程式轉換為使用SLF4J,而無需更改應用程式程式碼。只需從類路徑中刪除commons-loggong JAR檔案,然後將jcl104-over-slf4j.jar新增到類路徑中。

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的類路徑中。

雖然這向您展示瞭如何設定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的2行中添加了。通過引用LoggingFilter,您可以在此處為與IoAcceptor關聯的處理程式中的每個事件型別設定日誌記錄級別。為了指定觸發日誌記錄的IoHandler事件以及執行日誌記錄的級別,LoggingFilter中有一個名為setLogLevel(IoEventType,LogLevel)的方法。以下是此方法的選項:

Io事件型別

描述

SESSION_CREATED

在建立新會話時呼叫

SESSION_OPENED

開啟新會話時呼叫

SESSION_CLOSED

在會話關閉時呼叫

MESSAGE_RECEIVED

收到資料時呼叫

MESSAGE_SENT

在傳送訊息時呼叫

SESSION_IDLE

在達到會話空閒時間時呼叫

EXCEPTION_CAUGHT

丟擲異常時呼叫

 

以下是LogLevels的描述:

日誌級別

描述

NONE

這將導致無論配置如何都不會建立任何日誌事件

TRACE

在日誌記錄系統中建立TRACE事件

DEBUG

在日誌記錄系統中生成除錯訊息

INFO

在日誌記錄系統中生成Info訊息

WARN

在日誌記錄系統中生成警告訊息

ERROR

在日誌記錄系統中生成錯誤訊息

 

有了這些資訊,您應該能夠啟動並執行基本系統,並能夠擴充套件這個簡單的示例,以便為您的系統生成日誌資訊。