bugstac...

Netty源码分析-08 Netty的日志

2019-03-26  本文已影响0人  史圣杰

8.1 Java的日志系统

java领域存在多种日志框架,目前常用的日志框架包括Log4j,Log4j 2,Commons Logging,Slf4j,Logback,Jul。这些框架中可以分为两类,一类是日志框架,一类是日志实现。

日志框架,提供调用的接口

日志实现:具体的实现

8.2 Netty的封装

由于Java提供的日志框架较多,为了便于使用,Netty封装了一套通用的日志系统。主要思路是实现了InternalLogger和InternalLoggerFactory,讲Logger和LogFactory抽象出来,netty默认的InternalLoggerFactory会自己查找当前引入的日志框架,然后使用Factory创建Logger实例。


Log封装

InternalLogger

InternalLogger是一个接口,封装了trace、info、error、debug、warn等方法,用来提供记录日志的方法。

public interface InternalLogger {
String name();
boolean isTraceEnabled();
void trace(String msg);
void trace(String format, Object arg);
void trace(String format, Object argA, Object argB);
void trace(String format, Object... arguments);
void trace(String msg, Throwable t);
void trace(Throwable t);
 ... // 还有debug  info warn error log 
}

AbstractInternalLogger

AbstractInternalLogger是一个抽象日志类,实现了InternalLogger接口中的部分方法,内部包含name变量,主要实现了log的6个方法,其会在内部会根据InternalLogLevel来调用相应的方法,其他方法在AbstractInternalLogger的子类中实现。

public abstract class AbstractInternalLogger implements InternalLogger, Serializable {
    private final String name;
    
     public boolean isEnabled(InternalLogLevel level) {
        switch (level) {
        case TRACE:
            return isTraceEnabled();
        case DEBUG:
            return isDebugEnabled();
        case INFO:
            return isInfoEnabled();
        case WARN:
            return isWarnEnabled();
        case ERROR:
            return isErrorEnabled();
        default:
            throw new Error();
        }
    }
    
    public void log(InternalLogLevel level, String msg, Throwable cause) {
        switch (level) {
        case TRACE:
            trace(msg, cause);
            break;
        case DEBUG:
            debug(msg, cause);
            break;
        case INFO:
            info(msg, cause);
            break;
        case WARN:
            warn(msg, cause);
            break;
        case ERROR:
            error(msg, cause);
            break;
        default:
            throw new Error();
        }
    }
}

AbstractInternalLogger有5个实现类:

InternalLoggerFactory

InternalLoggerFactory是一个抽象的类,其子类有 : CommonsLoggerFactory,JdkLoggerFactory,Log4J2LoggerFactory,Log4JLoggerFactory和Slf4JLoggerFactory 。每个factory需要实现newInstance方法返回InternalLogger实例。

//获取默认的Factory
private static InternalLoggerFactory newDefaultFactory(String name) {
        InternalLoggerFactory f;
        try {
            f = new Slf4JLoggerFactory(true);
            f.newInstance(name).debug("Using SLF4J as the default logging framework");
        } catch (Throwable t1) {
            try {
                f = Log4JLoggerFactory.INSTANCE;
                f.newInstance(name).debug("Using Log4J as the default logging framework");
            } catch (Throwable t2) {
                f = JdkLoggerFactory.INSTANCE;
                f.newInstance(name).debug("Using java.util.logging as the default logging framework");
            }
        }
        return f;
    }
上一篇 下一篇

猜你喜欢

热点阅读