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


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

    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

  • 相关阅读:
    轻松实现WCF服务的构造函数依赖注入
    终于找到在Visual Studio 2010中进行“项目重命名”的有效工具
    让Entity Framework不再私闯sys.databases
    AutoMapper使用笔记
    遭遇IE8下的JavaScript兼容问题
    WCF异步调用中客户端关闭带来的性能问题
    Chrome “False Start” 引起的 Error 7 (net::ERR_TIMED_OUT): The operation timed out
    实战ASP.NET访问共享文件夹(含详细操作步骤)
    Entity Framework 理清关系 基于外键关联的单向一对一关系
    在Firefox中通过JavaScript复制到剪贴板(Copy to Clipboard)
  • 原文地址:https://www.cnblogs.com/softidea/p/4483209.html
Copyright © 2020-2023  润新知