16 October 2016

正如nutz官方所说,nutz并没有实现了日志功能,而只是适配日志。那么,本篇就来看看nutz是如何来适配日志的。

先来看下nutz log的整体结构

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:兽总为什么要弄这一出??




Fork me on GitHub