經常會有人問,爲什麼我沒有收到包。爲什麼半天才收到包。各種問題,卻沒粘任何代碼和日誌,讓別人無法幫助他分析問題,自己也陷入迷茫。
其實netty自帶一個日誌記錄的Handler,叫LoggingHandler,這個Handler使用netty的日誌框架打印日誌,而netty默認的日誌是Java的日誌框架java logger,而java的日誌框架默認級別是INFO級別,所以需要我們在pipeline中加入此Handler,則可以打印netty的運行日誌。
netty3代碼如下:
- Executor workerExecutor = Executors.newCachedThreadPool();
- Executor bossExecutor = Executors.newCachedThreadPool();
- ServerBootstrap server = new ServerBootstrap(new NioServerSocketChannelFactory(bossExecutor, workerExecutor));
- server.setPipelineFactory(new ChannelPipelineFactory() {
- @Override
- public ChannelPipeline getPipeline() throws Exception {
- ChannelPipeline p = Channels.pipeline();
- p.addLast("logging", new LoggingHandler(InternalLogLevel.INFO));
- p.addLast("decoder", new Decoder());
- p.addLast("handler", new Netty3Handler());
- return p;
- }
- });
- server.bind(new InetSocketAddress("127.0.0.1", 9999));
打印的日誌如下
netty4的代碼如下
- ServerBootstrap server = new ServerBootstrap();
- EventLoopGroup parentGroup = new NioEventLoopGroup();
- EventLoopGroup childGroup = new NioEventLoopGroup();
- server.group(parentGroup, childGroup);
- server.channel(NioServerSocketChannel.class);
- server.childHandler(new ChannelInitializer<SocketChannel>() {
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO));
- ch.pipeline().addLast(new Decoder());
- ch.pipeline().addLast(new Netty4Handler());
- }
- });
- server.childOption(ChannelOption.SO_KEEPALIVE, true);
- server.bind(new InetSocketAddress("127.0.0.1", 9999)).sync().channel().closeFuture().sync();
netty4服務端打印的日誌
(圖片中黑色打印是我自己的打印,紅色纔是netty的打印)
客戶端發送的數據均爲模擬斷包粘包,所以第一個收到的包只有2個字節,而第二個收到的包有10個字節通過粘包處理,最終收到的消息分別爲10和20.
這樣的日誌清楚明瞭,知道netty什麼時候收到了包,什麼時候發送了包,更方便自己和他人分析問題的原因。
當然,netty也不是完全使用java 的logger,我們可以設置netty的loggerFactory來使用不同的日誌框架。
只需要在netty代碼之前執行:
- InternalLoggerFactory.setDefaultFactory(new Log4JLoggerFactory());
即可。netty3和netty4一樣