1.写好AOP类
@Aspect
@Component
public class LogAspect {
final Logger logger = LoggerFactory.getLogger("aopLog"); //自定义的logger
@Pointcut("execution(* com.gks.creditloan.dataservice.mapper.*.*.*(..))")
public void mapperLog(){
}
/**
* 前置通知(Before) 在目标方法被调用之前调用通知功能
* @param joinPoint
*/
// @Before("mapperLog()")
public void beforeAdvice(JoinPoint joinPoint){
logger.info("beforeAdvice>>>>>> start");
String name =joinPoint.getSignature().getName();
logger.info("调用方法为:"+name);
logger.info("beforeAdvice>>>>>> end");
}
/**
* 后置通知(After)在目标方法完成之后调用通知,不会关心方法的输出是什么。
* @param joinPoint
*/
// @After("mapperLog()")
public void afterAdvice(JoinPoint joinPoint){
logger.info("afterAdvice>>>>>> start");
String name =joinPoint.getSignature().getName();
logger.info("调用方法为:"+name);
logger.info("afterAdvice>>>>>> end");
}
/**
* 返回通知(After-returning): 在目标方法成功执行之后调用通知。
* @param joinPoint
* @param result
*/
@AfterReturning(pointcut = "mapperLog()",returning = "result")
public Object afterReturnAdvice(JoinPoint joinPoint,Object result){
logger.info("LogAspect.afterReturnAdvice>>>>>> start");
//获取方法名
String methodName = joinPoint.getSignature().getName();
//获取类名
String targetName = joinPoint.getSignature().getDeclaringType().getName();
String name=targetName+"."+methodName;
//获取传入目标方法的参数对象
Object[] args= joinPoint.getArgs();
//WriteDateUseDateFormat 默认为yyyy-MM-dd HH:mm:ss
String argsJson= JSONObject.toJSONString(args, SerializerFeature.WriteDateUseDateFormat);
logger.info("LogAspect调用方法"+name+"入参为:"+argsJson);
logger.info("LogAspect调用方法"+name+"结果为:"+JSONObject.toJSONString(result, SerializerFeature.WriteDateUseDateFormat));
logger.info("LogAspect.afterReturnAdvice>>>>>> end");
return result;
}
/**
* 异常通知(After-throwing):在目标方法抛出异常后调用通知。
*/
@AfterThrowing(pointcut = "mapperLog()",throwing = "exception")
public void AfterThrowingAdvice(JoinPoint joinPoint,Exception exception){
logger.info("LogAspect.AfterThrowingAdvice>>>>>> start");
//获取方法名
String methodName = joinPoint.getSignature().getName();
//获取类名
String targetName = joinPoint.getSignature().getDeclaringType().getName();
String name=targetName+"."+methodName;
//获取传入目标方法的参数对象
Object[] args= joinPoint.getArgs();
String argsJson= JSONObject.toJSONString(args, SerializerFeature.WriteDateUseDateFormat);
logger.error("LogAspect.调用方法"+name+"参数为:"+argsJson);
logger.error("LogAspect.调用方法"+name+"发生异常:",exception);
logger.info("LogAspect.AfterThrowingAdvice>>>>>> end");
}
}
2.定义自己的filter
public class LogFilter extends ThresholdFilter {
String filterStr;
@Override
public FilterReply decide(ILoggingEvent event) {
if (!isStarted()) {
return FilterReply.NEUTRAL;
}
String msg= event.getMessage();
if(msg !=null && !"".equals(msg)){
if(msg.startsWith(filterStr)){
return FilterReply.DENY;
}
}
return FilterReply.NEUTRAL;
}
public void setFilterStr(String filterStr) {
this.filterStr = filterStr;
}
public String getFilterStr() {
return filterStr;
}
}
3.配置logback文件(我的是xml)
<!--增加SQL查询的入参出参的打印...见意只保留一个月时效,-->
<appender name="FILE-SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="com.lakala.creditloan.component.helper.LogFilter" >
<param name="filterStr" value="LogAspect" />
</filter>
<File>${log.base}/${log.name}-sql.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- rollover daily -->
<FileNamePattern>${log.base}/${log.name}-err-%d{yyyy-MM-dd}.%i.zip</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>30MB</maxFileSize><!-- or whenever the file size reaches 5MB -->
</timeBasedFileNamingAndTriggeringPolicy>
<!-- <maxHistory></maxHistory> -->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%-5level [%contextName] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger.%method - %msg%n</Pattern>
</encoder>
</appender>
<!--自定义的logger 在AOP中引用-->
<logger name="aopLog" additivity="false"><appender-ref ref="FILE-SQL" /> </logger>
原文:https://www.cnblogs.com/blog-record/p/13903161.html