日志转调

简介

当我们应用配置了slf4j&&logback的组合,但是我们引用的jar包里面用的却用了Log4j来执行日志输出,那么怎么统一控制,让jar包里面的的日志也能按照我们工程配置的日志输出格式输出呢?日志转调这个时候就可以大显身手了

解析

以log4j转调为例,依赖转调包log4j-over-slf4j.jar,这个jar包创建了大部分log4j.jar里面的类(类名包名都保持一致,但是实现不一样),关键是对Logger类和其父类Category 的重新创建.
重写过后的Category类增加了对org.slf4j.Logger的引用,并且在创建Logger的时候同时创建对应的org.slf4j.Logger

    public class Category {

        public void info(Object message) {
          differentiatedLog(null,CATEGORY_FQCN,LocationAwareLogger.INFO_INT,
          message, null);
        }
        
        void differentiatedLog(Marker marker, String fqcn, int level, 
        Object message, Throwable t) {

            String m = convertToString(message);
                if (locationAwareLogger != null) {
                    locationAwareLogger.log(marker, fqcn, level, m, null, t);
                } else {
                    switch (level) {
                    case LocationAwareLogger.TRACE_INT:
                        slf4jLogger.trace(marker, m);
                        break;
                    case LocationAwareLogger.DEBUG_INT:
                        slf4jLogger.debug(marker, m);
                        break;
                    case LocationAwareLogger.INFO_INT:
                        slf4jLogger.info(marker, m);
                        break;
                    case LocationAwareLogger.WARN_INT:
                        slf4jLogger.warn(marker, m);
                        break;
                    case LocationAwareLogger.ERROR_INT:
                        slf4jLogger.error(marker, m);
                        break;
                    }
              }
          }
      }

当调用logger.info的时候再内部实际调用的是slf4jLogger.info();

小结

log4j-over-slf4j是通过重新创建log4j.jar里面的类来实现转调


iMouseWu
1.6k 声望53 粉丝

Conding with Java