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源码
http://www.cnblogs.com/xiaozefeng/p/mina_wechat_Java_3.html