Netty日誌怎麼用

pridefc發表於2016-12-17

    經常會有人問,為什麼我沒有收到包。為什麼半天才收到包。各種問題,卻沒粘任何程式碼和日誌,讓別人無法幫助他分析問題,自己也陷入迷茫。

    其實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. @Override
  6. public ChannelPipeline getPipeline() throws Exception {
  7. ChannelPipeline p = Channels.pipeline();
  8. p.addLast("logging", new LoggingHandler(InternalLogLevel.INFO));
  9. p.addLast("decoder", new Decoder());
  10. p.addLast("handler", new Netty3Handler());
  11. return p;
  12. }
  13. });
  14.  
  15. server.bind(new InetSocketAddress("127.0.0.1", 9999));


列印的日誌如下

3333333.png



netty4的程式碼如下



  1. ServerBootstrap server = new ServerBootstrap();
  2. EventLoopGroup parentGroup = new NioEventLoopGroup();
  3. EventLoopGroup childGroup = new NioEventLoopGroup();
  4. server.group(parentGroup, childGroup);
  5. server.channel(NioServerSocketChannel.class);
  6. server.childHandler(new ChannelInitializer<SocketChannel>() {
  7. @Override
  8. protected void initChannel(SocketChannel ch) throws Exception {
  9. ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO));
  10. ch.pipeline().addLast(new Decoder());
  11. ch.pipeline().addLast(new Netty4Handler());
  12. }
  13. });
  14. server.childOption(ChannelOption.SO_KEEPALIVE, true);
  15. 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一樣

相關文章