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");
}
}