正如nutz官方所说,nutz并没有实现了日志功能,而只是适配日志。那么,本篇就来看看nutz是如何来适配日志的。
先来看下nutz log的整体结构
主要包括三部分内容:
- Logs工具类
- 核心接口Log:封装是封装了所有日志输出方法
- 核心接口LogAdapter:是日志适配器接口,只有一个方法:getLogger ,用来获取对应的日志输出器
Logs工具类
Logs类是用于获取Log, 最常用的两个方法Logs.get(Class klass)和Logs.get()都在这里实现了。
Logs获取类之前有个静态初始化块:init() init方法按照优先级依次检查日志的可用性,返回一个可用的日志适配器 日志适配器实现两个接口LogAdapter(实现getLog方法)和Plugin(实现canWork方法)
优先级顺序为:
- 自定义日志适配器
- Slf4j日志适配器
- Log4j日志适配器
- System日志适配器
判断插件的可用性,通过实现Plugin的canWork来判断,如果返回true,则说明插件可用:
for (Plugin plugin : list)
if (plugin.canWork())
return (T) plugin;
Log接口及其实现
LogAdapter 有三个实现:
之前说过日志适配器都事项两个接口LogAdapter 和Plugin.
- SystemLogAdapter
- 通过new SystemLog实现LogAdapter的getLogger接口
- 针对Plugin的canWork接口实现为:永远返回true
- 使用System.out和System.err来输出日志
- Log4jLogAdapter
- 通过new Log4JLogger 实现getLogger接口。
-
通过判断“org.apache.log4j.Logger”是否存在来判断该日志适配器是否可用
try { Class.forName("org.apache.log4j.Logger", false, Log4jLogAdapter.class.getClassLoader()); return true; } catch (Throwable e) {} return false;
- 针对日志的输出直接调用apache log4j输出日志
- NopLog ,这个什么都不做,ps:兽总为什么要弄这一出??