LoggingFilter
接下來,使我們對Filter介紹的最后一個——LoggingFilter。
與ProtocolCodecFilter一樣,LoggingFilter也是加在網絡層之間,而博主的項目中,將LoggingFilter加在ProtocolCodecFilter之后,也就是說,在服務器發送數據包時,將先經過MinaEncoder進行編碼為byte數組,接着到達LoggingFilter。
使用原因
在一個不小的項目中,將程序的一些狀態如:成功連接、開始處理,完成處理,處理異常,發送數據等記錄在一個獨立的文件中,是非常重要的,因為當程序發生異常時,可以很清晰的追蹤到異常的發生地點;也可以用來統計服務器的訪問密度,和分部;甚至於,在服務器被攻擊時,可以根據log文件查清對方的IP,和操作(當然,博主自己的項目還沒有防黑客那么牛逼的功能。)
Log4j
log4j,可以理解為Log for Java,很明顯,這是一個針對Java的Log工具,博主在自己的項目《迷你微信》服務器中,使用了大量的Log,就是用的Log4j實現的,它可以在Log的時候顯示時間戳,設置輸出等級(如debug、Info、Error等),這是要顯示的輸出等級(即設置為Info等級時,debug等級的輸出將被無視,Info和Error等級將被輸出),很好的應對了不同的需求,在尋找要錯誤時減少干擾輸出。在這里,博主簡單的介紹一下Log4j的代碼使用,配置方法就不贅敘了: (代碼來自開源項目《迷你微信》服務器)
public class Test {
private Logger logger = Logger.getLogger(this.getClass());
public Test(){
logger.Info("This is a log!");
}
}
開始使用LoggingFilter
(代碼來自開源項目《迷你微信》服務器
// 自己寫的,負責處理網絡層回調的類
MinaServerHandle minaServerHandle = new MinaServerHandle
// 建立一個NIO(非阻塞)的連接
acceptor = new NioSocketAcceptor();
// 添加 ProtocolCodecFilter
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MinaEncoder(), new MinaDecoder()));
// 添加Log的Filter
MyLogger myLogger = new MyLogger();
acceptor.getFilterChain().addLast("Logger", myLogger);
acceptor.setHandler(minaServerHandle);
這是在Mina連接代碼上加了一個LoggingFilter而已,再看看博主對MyLogger的實現:
public class MyLogger extends LoggingFilter {
private Logger logger = Logger.getLogger(this.getClass());
@Override
public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
super.messageSent(nextFilter, session, writeRequest);
logger.Info("在此輸出要輸出的內容:" + writeRequest.toString());
}
MyLogger 類繼承於LoggingFilter 類,覆蓋父類的messageSent方法,messageSent方法將在每次向IO寫時自動調用,在這里,我們輸出了幾個無意義的log,大家可以按照自己的需求,將每次服務器網客戶端傳輸的包的詳細內容(如:IP,請求內容)Log出來,方便於將來的查找。
想看看博主如何使用這個模塊,請參考GitHub源碼