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.jar, slf4j-log4j12.jar** |
Log4J 1.3.x |
slf4j-api.jar, slf4j-log4j13.jar |
java.util.logging |
slf4j-api.jar, slf4j-jdk14.jar** |
Commons Logging |
slf4j-api.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 |
在日誌記錄系統中生成錯誤訊息 |
有了這些資訊,您應該能夠啟動並執行基本系統,並能夠擴充套件這個簡單的示例,以便為您的系統生成日誌資訊。