依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--AOP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
参考返回Bean类
package cn.ucmed.merger.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@Slf4j
public class ResultBean<T> implements Serializable {
@ApiModelProperty("状态码")
private Integer ret_code;
@ApiModelProperty("返回信息")
private String ret_info;
@ApiModelProperty("返回的实体类")
private T ret_data;
public ResultBean(T ret_data){
super();
this.ret_data = ret_data;
}
public ResultBean(Integer ret_code, String ret_info){
super();
this.ret_code=ret_code;
this.ret_info=ret_info;
}
public ResultBean(Integer ret_code, String ret_info, T ret_data){
super();
this.ret_code=ret_code;
this.ret_info=ret_info;
this.ret_data=ret_data;
}
public static ResultBean error(String ret_info){
ResultBean resultBean = new ResultBean(RetCodeEnumeration.ERROR,ret_info,null);
return resultBean;
}
public static ResultBean error(String ret_info, Object ret_data){
ResultBean resultBean = new ResultBean(
RetCodeEnumeration.ERROR, ret_info, ret_data
);
return resultBean;
}
public static ResultBean success(Object ret_data) {
ResultBean resultBean = new ResultBean(
RetCodeEnumeration.SUCCESS, "成功", ret_data
);
return resultBean;
}
public static ResultBean successInfo(String ret_info) {
ResultBean resultBean = new ResultBean(
RetCodeEnumeration.SUCCESS, ret_info, null
);
return resultBean;
}
public static ResultBean responseTokenInvalid(){
ResultBean resultBean = new ResultBean(
RetCodeEnumeration.TOKEN_ERROR, "登录过期,请重新登录", null
);
return resultBean;
}
public static ResultBean success(){
ResultBean resultBean = new ResultBean(
RetCodeEnumeration.SUCCESS, "成功"
);
return resultBean;
}
public enum RetCodeEnumeration {
;
public static final int SUCCESS = 0;
public static final int ERROR = 1;
public static final int TOKEN_ERROR = 2;
}
}
日志类所在目录
日志打印类
package cn.ucmed.merger.aop;
import cn.ucmed.merger.model.ResultBean;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 日志打印
*
* @author HJH
* @since 2017-08-09
**/
@Order(1)
@Aspect
@Component
@Slf4j
public class LogPrintClass {
@Around("execution(* cn.ucmed.merger.api..*(..))")
public Object interceptor(ProceedingJoinPoint joinPoint) {
Object res = null;
JSONObject pms = new JSONObject();
String apiName = null;
try {
log.info("=======?=============================================================================");
MethodSignature signature = (MethodSignature) joinPoint
.getSignature();
Method method = signature.getMethod();
String[] names = signature.getParameterNames();
Object[] values = joinPoint.getArgs();
apiName = method.getName();
log.info("接口方法名称: " + apiName);
if (values != null && names != null) {
Class<?>[] types = method.getParameterTypes();
int j = Math.min(names.length, types.length);
j = Math.min(j, values.length);
for (int i = 0; i < j; i++) {
String key = types[i].getSimpleName() + " " + names[i];
if (!(values[i] instanceof javax.servlet.http.HttpServletRequest)
&& !(values[i] instanceof javax.servlet.http.HttpServletResponse)
&& !(values[i] instanceof org.springframework.web.multipart.commons.CommonsMultipartFile)
&& !(values[i] instanceof org.springframework.web.multipart.MultipartFile)) {
pms.put(key, values[i]);
}
}
}
log.info("接口请求入参: " + pms.toString());
res = joinPoint.proceed();
//出参
if (res instanceof ResultBean<?>) {
ResultBean<?> temp = (ResultBean<?>) res;
log.info("接口返回状态码:" + temp.getRet_code());
log.info("接口返回出参 :" + temp.toString());
}else {
log.info("接口返回出参 :" + res.toString());
}
} catch (Throwable throwable) {
log.error("LogPrintClass 出错,信息如下:", throwable);
}
return res;
}
}
更新:
package com.ucmed.unified.aop;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ucmed.unified.dto.ResultBean;
import com.ucmed.unified.enumeration.RetCodeEnumeration;
import com.ucmed.unified.exception.AdviceException;
import com.ucmed.unified.exception.ServiceException;
import com.ucmed.unified.exception.UniPatientException;
import com.ucmed.unified.model.ErrorRecord;
import com.ucmed.unified.service.errorRecord.ErrorRecordService;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.ThreadContext;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.UUID;
/**
* 日志打印
*
* @author HJH
* @since 2017-08-09
**/
@Order(1)
@Aspect
@Component
@Slf4j
public class LogPrintClass {
@Autowired
private ErrorRecordService errorRecordService;
@Around("execution(* com.ucmed.unified.controller..*(..))")
public Object interceptor(ProceedingJoinPoint joinPoint) {
Object res;
JSONObject pms = new JSONObject();
String apiName = null;
try {
MethodSignature signature = (MethodSignature) joinPoint
.getSignature();
log.info("======={}=============================================================================", signature.getMethod());
String uuid = UUID.randomUUID().toString();
ThreadContext.put("logId",uuid );
Method method = signature.getMethod();
String[] names = signature.getParameterNames();
Object[] values = joinPoint.getArgs();
apiName = method.getName();
log.info("接口方法名称: " + apiName);
if (values != null && names != null) {
Class<?>[] types = method.getParameterTypes();
int j = Math.min(names.length, types.length);
j = Math.min(j, values.length);
for (int i = 0; i < j; i++) {
String key = types[i].getSimpleName() + " " + names[i];
if (!(values[i] instanceof javax.servlet.http.HttpServletRequest)
&& !(values[i] instanceof javax.servlet.http.HttpServletResponse)
&& !(values[i] instanceof org.springframework.web.multipart.commons.CommonsMultipartFile)
&& !(values[i] instanceof org.springframework.web.multipart.MultipartFile)
&& !(values[i] instanceof org.springframework.validation.BeanPropertyBindingResult)) {
pms.put(key, values[i]);
}
}
}
log.info("接口请求入参: " + pms.toString());
res = joinPoint.proceed();
if (log.isDebugEnabled()) {
//出参
if (res instanceof ResultBean<?>) {
ResultBean<?> temp = (ResultBean<?>) res;
log.debug("接口返回状态码:" + temp.getRet_code());
log.debug("接口返回出参 :" + JSON.toJSONString(temp));
}else {
log.debug("接口返回出参 :" + JSON.toJSONString(res));
}
}
} catch (ServiceException e) {
if(e.getData()!=null){
res = e.getData();
}else if(e.getRetCode()> 0){
res = new ResultBean(e.getRetCode(),e.getMessage());
}else{
res = ResultBean.error(e.getMessage());
}
} catch (AdviceException e) {
res = new ResultBean(RetCodeEnumeration.ADVICE_ERROR, "【医嘱】" + e.getMessage());
} catch (UniPatientException e) {
res = new ResultBean(RetCodeEnumeration.UNI_PATIENT_ERROR, "【统一就诊人】" + e.getMessage());
} catch (Throwable throwable) {
res = ResultBean.error(throwable.getMessage());
ErrorRecord errorRecord = new ErrorRecord();;
errorRecord.setErrorMsg(throwable.getMessage()+"; "+getStackMsg(throwable)).setMethodName(apiName).setParameter(pms.toString());
errorRecordService.addErrorRecord(errorRecord);
log.error("LogPrintClass 出错,信息如下:", throwable);
}
return res;
}
private static String getStackMsg(Throwable e) {
StringBuffer sb = new StringBuffer();
StackTraceElement[] stackArray = e.getStackTrace();
for (int i = 0; i < stackArray.length; i++) {
StackTraceElement element = stackArray[i];
sb.append(element.toString() + "\n");
}
return sb.toString();
}
private HttpServletRequest getRequest() {
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
return sra.getRequest();
}
}
控制日志级别
@ApiOperation(value = "root日志级别")
@RequestMapping(value = "/setRootLogLevel", method = RequestMethod.GET)
public ResultBean<String> setRootLogLevel(Integer level) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger rootLogger = loggerContext.getLogger("root");
if (level == 3) {
rootLogger.setLevel(Level.ERROR);
} else if (level == 1) {
rootLogger.setLevel(Level.INFO);
} else if (level == 0) {
rootLogger.setLevel(Level.DEBUG);
}
resetLogLevel(loggerContext);
return ResultBean.success(level);
}
@ApiOperation(value = "设置日志级别")
@RequestMapping(value = "/setLogLevel", method = RequestMethod.GET)
public ResultBean<String> setLogLevel(Integer level, String pack) {
if (StringUtils.isBlank(pack)) {
pack = "com.ucmed";
}
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger packLogger = loggerContext.getLogger(pack);
if (level == 3) {
packLogger.setLevel(Level.ERROR);
} else if (level == 1) {
packLogger.setLevel(Level.INFO);
} else if (level == 0) {
packLogger.setLevel(Level.DEBUG);
}
resetLogLevel(loggerContext);
return ResultBean.success(level);
}
@ApiOperation(value = "是否开启sql日志排查")
@RequestMapping(value = "/setSqlLogLevel", method = RequestMethod.GET)
public ResultBean<String> setSqlLogLevel(Integer openSql) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
if (openSql == null) {
} else if (openSql == 0) {
resetLogLevel(loggerContext);
} else if (openSql == 1) {
Logger sql = loggerContext.getLogger("com.ucmed.unified.mapper");
Logger logAop = loggerContext.getLogger("com.ucmed.unified.aop.LogPrintClass");
sql.setLevel(Level.DEBUG);
logAop.setLevel(Level.INFO);
}
return ResultBean.success(openSql);
}
private void resetLogLevel(LoggerContext loggerContext) {
Logger rootLogger = loggerContext.getLogger("root");
Logger sql = loggerContext.getLogger("com.ucmed.unified.mapper");
Logger logAop = loggerContext.getLogger("com.ucmed.unified.aop.LogPrintClass");
sql.setLevel(rootLogger.getLevel());
logAop.setLevel(rootLogger.getLevel());
}