slf4j+logback实现日志管理

使用日志框架的好处:   

    定制输出目标
     定制输出格式
     携带上下文信息
     运行时选择性输出
     灵活配置
     优异的性能

实现分为两部分 日志门面 和 日志实现,各个版本如下

   slf4j+logback实现日志管理_第1张图片

筛选过程:

  去掉jul,太过简陋

  jboss不是服务大众

  作者升级log4j到logback

  log4j2适应性不强

  slf4j和logback为同一作者

使用:

  一、导入jar  slf4j-api-1.7.5.jar  logback-classic-1.0.13.jar  logback-core-1.0.13.jar

  二、配置logback.xml 放置src目录下

         xml 由3部分组成 appender   logger root 以下为模板 




     
    
    
    
    
    
    
        
            [%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            
        
    
    
    
        
            [%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            
        
        
            ERROR
            ACCEPT
            DENY
        
        
            ${ROOT}%d/error.%i.log
            ${MAXHISTORY}
            
                ${FILESIZE}
            
        
    
    
    
    
        
            [%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            
        
        
            WARN
            ACCEPT
            DENY
        
        
            ${ROOT}%d/warn.%i.log
            ${MAXHISTORY}
            
                ${FILESIZE}
            
        
    
    
    
    
        
            [%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            
        
        
            INFO
            ACCEPT
            DENY
        
        
            ${ROOT}%d/info.%i.log
            ${MAXHISTORY}
            
                ${FILESIZE}
            
        
    
    
    
        
            [%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            
        
        
            DEBUG
            ACCEPT
            DENY
        
        
            ${ROOT}%d/debug.%i.log
            ${MAXHISTORY}
            
                ${FILESIZE}
            
        
    
    
    
        
            [%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            
        
        
            TRACE
            ACCEPT
            DENY
        
        
            ${ROOT}%d/trace.%i.log
            ${MAXHISTORY}
            
                ${FILESIZE}
            
        
    
    
    
    
    
    
    
    
    
        
          
        
        
         
        
    

   三、具体使用

private final Logger logger = LoggerFactory.getLogger(this.getClass());

logger.debug("This is a debug message.");
        logger.info("This is an info message.");
        logger.warn("This is a warn message.");
        logger.error("This is an error message.");

四、每个类都要创建logger,比较麻烦,创建工具类

public class LogUtil {
	 
    /**
     * 获取最原始被调用的堆栈信息
     * @return
     */
    private static StackTraceElement findCaller() {
        // 获取堆栈信息
        StackTraceElement[] callStack = Thread.currentThread().getStackTrace();
        if(null == callStack){
        	return null;
        }
        // 最原始被调用的堆栈信息
        StackTraceElement caller = null;
        // 日志类名称
        String logClassName = LogUtil.class.getName();
        // 循环遍历到日志类标识
        boolean isEachLogClass = false;
 
        // 遍历堆栈信息,获取出最原始被调用的方法信息
        for (StackTraceElement strackTraceEle : callStack) {
            // 遍历到日志类
            if(logClassName.equals(strackTraceEle.getClassName())) {
                isEachLogClass = true;
            }
            // 下一个非日志类的堆栈,就是最原始被调用的方法
            if(isEachLogClass) {
                if(!logClassName.equals(strackTraceEle.getClassName())) {
                    isEachLogClass = false;
                    caller = strackTraceEle;
                    break;
                }
            }
        }
        return caller;
    }
 
    /**
     * 自动匹配请求类名,生成logger对象,此处 logger name 值为 [className].[methodName]() Line: [fileLine]
     * @return    
     * @author yzChen
     * @date 2016年10月13日 下午11:50:59 
     */
    private static Logger logger() {
        StackTraceElement caller = findCaller();//最原始被调用的堆栈对象
        if(caller == null){
        	return LoggerFactory.getLogger(LogUtil.class);
        
        }else{
        	return LoggerFactory.getLogger(SessionContext.get().getName() + "" +caller.getClassName() + "." + caller.getMethodName() + "() Line: " + caller.getLineNumber());
        }
    }
    
    public static void trace(String msg) {
    	trace(msg, null);
    }
    public static void trace(String msg, Throwable e) {
    	logger().trace(msg, e);
    }
    public static void debug(String msg) {
    	debug(msg, null);
    }
    public static void debug(String msg, Throwable e) {
    	logger().debug(msg, e);
    }
    public static void info(String msg) {
    	info(msg, null);
    }
    public static void info(String msg, Throwable e) {
    	logger().info(msg, e);
    }
    public static void warn(String msg) {
    	warn(msg, null);
    }
    public static void warn(String msg, Throwable e) {
    	logger().warn(msg, e);
    }
    public static void error(String msg) {
    	error(msg, null);
    }
    public static void error(String msg, Throwable e) {
    	logger().error(msg, e);
    }
}




你可能感兴趣的:(Java)