1. 概述
在 netty-handler
模块中,提供了多种 ChannelHandler 的实现类。如下图所示:`netty-handler`
- 每个
package
包,对应一个功能特性的 ChannelHandler 实现。
本文,我们来分享 logger
包下 logging
包的 LoggerHandler 。
2. LogLevel
io.netty.handler.logging.LogLevel
,日志级别枚举类。代码如下:
/** |
- Netty 提供了一套日志框架,方便接入 slf4j、log4j、jdk logger 等等日志框架。感兴趣的胖友,可以看看 《Netty4.x Internal Logger机制》 。😈 现在,不看也不影响对本文的理解。
- LogLevel 实现对
io.netty.util.internal.logging.InternalLogLevel
的一一映射。笔者暂时看不出有什么神奇的用途,难道是为了可以灵活的修改映射关系?!有了解的胖友,可以深刻教育下我噢。
3. LoggingHandler
io.netty.handler.logging.LoggingHandler
,继承 ChannelDuplexHandler 类,日志处理器,对 Inbound/Outbound 事件进行日志的记录。一般情况下,用于开发测试时的调试之用。
3.1 构造方法
|
- 通过
@Sharable
注解,支持共享。 level
属性,配置的 LogLevel 级别。DEFAULT_LEVEL
静态属性,默认的level
级别。构造方法如果未传递LogLevel level
方法参数,则使用默认值。internalLevel
属性,Netty 内部 LogLevel 级别。通过LogLevel#toInternalLevel()
方法,将level
转化成internalLevel
。
logger
属性,Netty 内部 Logger 对象。通过Class<?> clazz
或String name
方法参数,进行获得。
3.2 具体实现
|
里面的每个方法,都是使用 logger
打印日志,并继续传播事件到下一个节点。
而打印的日志的格式,通过 #format(...)
方法,进行拼接。
3.3 format
#format(...)
方法,根据参数的不同,分成三种。
① #format(ChannelHandlerContext ctx, String eventName)
方法,代码如下:
/** |
② #format(ChannelHandlerContext ctx, String eventName, Object arg)
方法,代码如下:
/** |
- 根据参数不同,会调用不同的 format 方法。
③ #format(ChannelHandlerContext ctx, String eventName, Object firstArg, Object secondArg)
方法,代码如下:
/** |
3.3.1 formatByteBuf
#formatByteBuf(ChannelHandlerContext ctx, String eventName, ByteBuf msg)
方法,代码如下:
/** |
<1>
处的appendPrettyHexDump(buf, msg)
,实际调用的是ByteBufUtil#appendPrettyHexDump(StringBuilder dump, ByteBuf buf)
方法。
如下是一个打印的示例:
3.3.2 formatByteBufHolder
#formatByteBufHolder(ChannelHandlerContext ctx, String eventName, ByteBufHolder msg)
方法,代码如下:
/** |
- 和
#formatByteBuf(ChannelHandlerContext ctx, String eventName, ByteBuf msg)
方法,实际打印的效果,非常相似。
3.3.3 formatSimple
#formatSimple(ChannelHandlerContext ctx, String eventName, Object msg)
方法,代码如下:
/** |
666. 彩蛋
还是没有彩蛋。