log4j+slf4j+HandlerExceptionResolver 日誌系統

1、log4j + slf4j
(1)引入jar包,maven

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.0</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency> 

(2)配置log4j.properties,並引用。截取部分配置
如果改文件處理src目錄下,則無需單獨引用;如果不是,可以再web.xml進行引用
請參考https://github.com/GraduationTeam/log2/blob/master/src/main/resources/log4j.properties

log4j.logger.errorList = DEBUG,errorList
log4j.appender.errorList = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorList.Threshold = DEBUG
log4j.appender.errorList.File =  ${catalina.home}/logs_dygk/gkweb/errorList.log
log4j.appender.errorList.Append = true
log4j.appender.errorList.layout=org.apache.log4j.PatternLayout
log4j.appender.errorList.layout.ConversionPattern=[ %p ] - %-d{yyyy-MM-dd HH:mm:ss}  %m%n
log4j.appender.errorList.encoding=UTF-8
log4j.additivity.errorList = false

(3)日誌工具類,截取部分代碼
【思想:錯誤日誌分成列表+詳情】
可以參考https://github.com/GraduationTeam/log2/blob/master/src/main/java/com/util/LogUtils.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogUtils {

    public static Logger getErrorListLogger(){
        return LoggerFactory.getLogger("errorList");
    }

    public static Logger getErrorDetailLogger(){
        return LoggerFactory.getLogger("errorDetail");
    }

    public static void printLog(Exception ex, HttpServletRequest request){
        printLog_logType_(ex, request, "info", getLocalInfo());
    }

    private static void printLog_logType_(Exception ex, HttpServletRequest request, String logType, String localInfo){
        String uuid = UUID.randomUUID().toString().replace("-", "");//通過uuid使得errorList和errorDetail進行關聯
        getErrorListInfo_(ex, request, null, uuid, logType, localInfo);
        getErrorDetailInfo_(ex, request, uuid, logType, localInfo);
   }

    private static void getErrorListInfo_(Exception ex, HttpServletRequest request, String message, String uuid, String logType, String localInfo){
        message = getMessage(ex, message);
        if(StringUtils.isNotBlank(logType)){
            logType = logType.toLowerCase();
            switch(logType){
                case "debug":
                    getErrorList_DebugType(ex, request, message, localInfo, uuid);
                    break;
                case "info":
                    getErrorList_InfoType(ex, request, message, localInfo, uuid);
                    break;
                case "warn":
                    getErrorList_WarnType(ex, request, message, localInfo, uuid);
                    break;
                case "error":
                    getErrorList_ErrorType(ex, request, message, localInfo, uuid);
                    break;
                default:
                    getErrorList_InfoType(ex, request, message, localInfo, uuid);
                    break;
            }
        }else if(isErrorTypePrint(request)){
            getErrorList_ErrorType(ex, request, message, localInfo, uuid);
        }else{
            getErrorList_InfoType(ex, request, message, localInfo, uuid);
        }
    }

    private static void getErrorList_InfoType(Exception ex, HttpServletRequest request, String message, String localInfo, String uuid){
        LogUtils.getErrorListLogger().info("[ {} ] -- [uuid:{}] url:{} ; params:{}; error: {}: {}", localInfo, uuid, request.getRequestURI(), getParamsByRequest(request), ex.getClass(), message);
    }

    public static String getLocalInfo(Integer statckTrace){
        Date beforDate = new Date();
        StackTraceElement ste = Thread.currentThread().getStackTrace()[statckTrace];  
        String className = ste.getClassName();  
        String methodName = ste.getMethodName();  
        int lineNumber = ste.getLineNumber();  
        return  StringUtil.spliceStr(className, ".", methodName, "(", lineNumber, "); ", "consumTimes:", new Date().getTime() - beforDate.getTime(), "ms");  
    }
}

(4)打印日誌,在try-catch中引用等

2、捕捉拋出的異常
 實現 HandlerExceptionResolver 接口,重寫resolveException 進行異常處理
代碼塊如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

/**
 * 捕捉拋出的異常
 *
 * @author Administrator
 */
public class CustomHandlerExceptionResolver implements HandlerExceptionResolver{


    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        LogUtils.printLog(ex, request);
        return new ModelAndView("404");
    }

}
發佈了31 篇原創文章 · 獲贊 18 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章