• 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter(2)——LoggingFilter


    项目Logo
    欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

    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源码

    欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

  • 相关阅读:
    总结一下HtmlAgilityPack
    sql server中获得刚刚插入的记录的主键ID
    关于存储过程的一点总结
    asp.net 中System.Web.UI.Page子类的成员变量的生存周期
    sql server存储过程模板
    第三方库HtmlAgilityPack的一个Bug
    如何在存储过程内部调用另一个存储过程 EXEC
    C#中的哈希表和字典的区别
    Android Intent的几种用法全面总结
    个人练习:ListView绑定数据和显示的几种方式
  • 原文地址:https://www.cnblogs.com/xiaozefeng/p/mina_wechat_Java_3.html
Copyright © 2020-2023  润新知