package com.lill.test.utils;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
public class LogUtils {
private static int originStackIndex = 2;
/**
* 獲取當前文件名稱
* @return
*/
public static String getFileName() {
return Thread.currentThread().getStackTrace()[originStackIndex].getFileName();
}
/**
* 獲取當前類名稱
* @return
*/
public static String getClassName() {
return Thread.currentThread().getStackTrace()[originStackIndex].getClassName();
}
/**
* 獲取當前方法名稱
* @return
*/
public static String getMethodName() {
return Thread.currentThread().getStackTrace()[originStackIndex].getMethodName();
}
/**
* 獲取當前代碼行號
* @return
*/
public static int getLineNumber() {
return Thread.currentThread().getStackTrace()[originStackIndex].getLineNumber();
}
/**
* 打印文本信息
* @param logger
* @param message
* @param remark
*/
public static void writeLogger(Logger logger, String message, String remark){
StackTraceElement ste = Thread.currentThread().getStackTrace()[originStackIndex];
writeLogger(logger, ste.getLineNumber(), ste.getMethodName(), remark, message);
}
/**
* 打印實體信息
* @param logger
* @param obj
* @param remark
*/
public static void writeLogger(Logger logger, Object obj, String remark){
String message = JSON.toJSONString(obj);
StackTraceElement ste = Thread.currentThread().getStackTrace()[originStackIndex];
writeLogger(logger, ste.getLineNumber(), ste.getMethodName(), remark, message);
}
/**
* 打印異常信息
* @param logger
* @param remark
* @param e
*/
public static void writeException(Logger logger, String remark, Throwable e){
StackTraceElement ste = Thread.currentThread().getStackTrace()[originStackIndex];
writeException(logger, ste.getLineNumber(), ste.getMethodName(), remark, e);
}
/**
* 打印文本信息
* @param logger
* @param message
* @param remark
*/
public static void writeErrorLogger(Logger logger, String message, String remark){
StackTraceElement ste = Thread.currentThread().getStackTrace()[originStackIndex];
writeErrorLogger(logger, ste.getLineNumber(), ste.getMethodName(), remark, message);
}
/**
* 打印實體信息
* @param logger
* @param obj
* @param remark
*/
public static void writeErrorLogger(Logger logger, Object obj, String remark){
String message = JSON.toJSONString(obj);
StackTraceElement ste = Thread.currentThread().getStackTrace()[originStackIndex];
writeErrorLogger(logger, ste.getLineNumber(), ste.getMethodName(), remark, message);
}
/**
* 打印異常信息
* @param logger
* @param remark
* @param e
*/
public static void writeErrorException(Logger logger, String remark, Throwable e){
StackTraceElement ste = Thread.currentThread().getStackTrace()[originStackIndex];
writeErrorException(logger, ste.getLineNumber(), ste.getMethodName(), remark, e);
}
private static void writeLogger(Logger logger, int number, String methodName, String remark, String message){
logger.info(message(number, methodName, remark) + message);
}
private static void writeErrorLogger(Logger logger, int number, String methodName, String remark, String message){
logger.error(message(number, methodName, remark) + message);
}
private static void writeWarnLogger(Logger logger, int number, String methodName, String remark, String message){
logger.warn(message(number, methodName, remark) + message);
}
private static void writeDebugLogger(Logger logger, int number, String methodName, String remark, String message){
logger.debug(message(number, methodName, remark) + message);
}
private static void writeException(Logger logger, int number, String methodName, String remark, Throwable e){
logger.info(message(number, methodName, remark), e);
}
private static void writeErrorException(Logger logger, int number, String methodName, String remark, Throwable e){
logger.error(message(number, methodName, remark), e);
}
private static void writeWarnException(Logger logger, int number, String methodName, String remark, Throwable e){
logger.warn(message(number, methodName, remark), e);
}
private static void writeDebugException(Logger logger, int number, String methodName, String remark, Throwable e){
logger.debug(message(number, methodName, remark), e);
}
private static String message(int number, String methodName, String remark){
return "【第"+ number +"行】【"+ methodName +"】【"+ remark+"】";
}
}
實際運用
package com.lill.test.filter;
import com.lill.test.LogUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
/**
* 全局異常處理中心
*/
@ControllerAdvice
public class GlobalDefaultExceptionHandler{
private Logger logger = LoggerFactory.getLogger(GlobalDefaultExceptionHandler.class);
@ExceptionHandler(Exception.class)
@ResponseBody
public JsonResult exceptionHandler(HttpServletRequest request, Exception e){
LogUtils.writeErrorLogger(logger, e.getStackTrace(), e.getLocalizedMessage());
}
}
日誌輸入
2019-08-13 14:37:37.475 [http-nio-8181-exec-1] ERROR com.lill.test.filter.GlobalDefaultExceptionHandler - 【第26行】【exceptionHandler】【Request method 'GET' not supported】[{……}]
代碼封裝的比較簡單,也很初級,不過還是希望對大家有所幫助,我在實際開發項目中,用它定位異常信息、打印關鍵節點日誌還是非常便利的