netty日志LoggingHandler怎么用

经常会有人问,为什么我没有收到包。为什么半天才收到包。各种问题,却没粘任何代码和日志,让别人无法帮助他分析问题,自己也陷入迷茫。

其实netty自带一个日志记录的Handler,叫LoggingHandler,这个Handler使用netty的日志框架打印日志,而netty默认的日志是java的日志框架java logger,而java的日志框架默认级别是INFO级别,所以需要我们在pipeline中加入此Handler,则可以打印netty的运行日志。

netty3代码如下:

 

 
  1. Executor workerExecutor = Executors.newCachedThreadPool();
  2. Executor bossExecutor = Executors.newCachedThreadPool();
  3. ServerBootstrap server = new ServerBootstrap(new NioServerSocketChannelFactory(bossExecutor, workerExecutor));
  4. server.setPipelineFactory(new ChannelPipelineFactory() {
  5.  
  6. @Override
  7. public ChannelPipeline getPipeline() throws Exception {
  8. ChannelPipeline p = Channels.pipeline();
  9. p.addLast("logging", new LoggingHandler(InternalLogLevel.INFO));
  10. p.addLast("decoder", new Decoder());
  11. p.addLast("handler", new Netty3Handler());
  12. return p;
  13. }
  14. });
  15.  
  16. server.bind(new InetSocketAddress("127.0.0.1", 9999));

 

打印的日志如下

3333333.png

 

 

netty4的代码如下

 

 

 
  1. ServerBootstrap server = new ServerBootstrap();
  2.  
  3. EventLoopGroup parentGroup = new NioEventLoopGroup();
  4. EventLoopGroup childGroup = new NioEventLoopGroup();
  5. server.group(parentGroup, childGroup);
  6. server.channel(NioServerSocketChannel.class);
  7. server.childHandler(new ChannelInitializer<SocketChannel>() {
  8. @Override
  9. protected void initChannel(SocketChannel ch) throws Exception {
  10. ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO));
  11. ch.pipeline().addLast(new Decoder());
  12. ch.pipeline().addLast(new Netty4Handler());
  13. }
  14. });
  15. server.childOption(ChannelOption.SO_KEEPALIVE, true);
  16. server.bind(new InetSocketAddress("127.0.0.1", 9999)).sync().channel().closeFuture().sync();

 

netty4服务端打印的日志

44444444.png

(图片中黑色打印是我自己的打印,红色才是netty的打印)

客户端发送的数据均为模拟断包粘包,所以第一个收到的包只有2个字节,而第二个收到的包有10个字节通过粘包处理,最终收到的消息分别为10和20.

这样的日志清楚明了,知道netty什么时候收到了包,什么时候发送了包,更方便自己和他人分析问题的原因。

 

当然,netty也不是完全使用java 的logger,我们可以设置netty的loggerFactory来使用不同的日志框架。

只需要在netty代码之前执行:

 

 
  1. InternalLoggerFactory.setDefaultFactory(new Log4JLoggerFactory());

 

 

 

即可。netty3和netty4一样

 

 

netty 一个很棒的博客 http://www.itstack.org/?post=40

http://www.itstack.org/

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值