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. 彩蛋
还是没有彩蛋。