站群系统开发,wordpress自动短网址插件,wordpress知更鸟最新破解,农村电商扶贫网站建设文章目录 一、引言二、使用AOP实现日志打印三、logback单独打印api调用信息 一、引言
相信我们都有过这样的经历#xff0c;在提供第三方对外接口时#xff0c;为了防止推诿扯皮#xff0c;我们会在自己接口被调用时日志打印一下第三方的调用参数#xff0c;再在业务逻辑结… 文章目录 一、引言二、使用AOP实现日志打印三、logback单独打印api调用信息 一、引言
相信我们都有过这样的经历在提供第三方对外接口时为了防止推诿扯皮我们会在自己接口被调用时日志打印一下第三方的调用参数再在业务逻辑结束返回时再打印一下给第三方的返回参数这样在后续遇到bug时能用日志方便排shuai查guo。 如果老老实实的手动打印日志我们的代码将会是这个样子
publish Response queryTask(RequestParam param) {// 打印第三方请求参数LOGGER.info(queryTask param:{}, JSON.toJSONString(param));// Response为执行查询业务后的结果Response rsp null;// 打印返回给第三方的结果LOGGER.info(queryTask response:{}, JSON.toJSONString(rsp))return rsp;
}每个接口都这样去写又麻烦又怕自己忘记如此机械化的简单行为有没有什么办法能够让程序帮我们做这份工作让我们的代码变得更加优雅呢Spring的AOP是一个不错的思想。
二、使用AOP实现日志打印
定义一个api注解它所标注的方法均能够打印入参和返回
Target({ElementType.METHOD})
Retention(RetentionPolicy.RUNTIME)
public interface ApiLog {}定义我们的切面和切点
Component
Aspect
public class ApiLogAspect {// 切入点Pointcut(annotation(com.yangyungang.open.aspect.log.anno.ApiLog))private void apiLogPointCut() {}// 环绕通知Around(apiLogPointCut())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {MethodSignature signature (MethodSignature) joinPoint.getSignature();// 类名String className joinPoint.getTarget().getClass().getName();// 方法名String methodName signature.getName();// 参数Object[] args joinPoint.getArgs();StringBuffer requestInfo new StringBuffer();requestInfo.append(the api method ().append(className).append(:).append(methodName).append() called, request param: );if (AdaptorCommonUtil.checkSafe(args)) {Arrays.stream(args).forEach(p - requestInfo.append(JSON.toJSONString(p)).append( ));}// 在方法执行前打印LOGGER.info(requestInfo.toString());// 执行方法Object result joinPoint.proceed();// 在方法执行后打印LOGGER.info(the api ({}:{}) method return:{}, className, methodName, JSON.toJSONString(result));return result;}
}ApiLogAspect这个类为一个切面Pointcut代表切入点这里我的注解ApiLog就为切入点Around(“apiLogPointCut()”)代表在切入点附近进行环绕通知也就是要执行我们前面说的日志打印我们在方法执行前后都进行了拦截进行日志打印joinPoint.proceed()才真正执行我们的业务逻辑。 写好该切面后我们要做的仅仅只是在api方法上加入注解就可以了
ApiLog
publish Response queryTask(RequestParam param) {// Response为执行查询业务后的结果Response rsp null;return rsp;
}所达到的效果和“引言”中的代码块一致。
三、logback单独打印api调用信息
当我写好接口后又发现api调用日志和我们的业务日志完全糅杂在了一起即使将来排查也难以进行区分由于我们项目使用的是logback可以让我们的api包通常第三方api会单独写到一个包里单独打印到一个日志文件中这样日志不就很清爽了吗只需要改一下logback的配置文件即可
!-- api调用的日志单独打印 --logger namecom.yangyungang.open.aspect.log.aop.ApiLogAspect levelINFO additivityfalseappender-ref refOPENAPI /appender-ref refSTDOUT //logger!-- api日志Appender --appender nameOPENAPI classch.qos.logback.core.rolling.RollingFileAppenderfilter classch.qos.logback.classic.filter.ThresholdFilterlevelINFO/level/filterFile${LOG_HOME}/${COMPONENT_ID}.${SEGMENT_ID}.openApi.debug.log/FilerollingPolicy classlogback.rolling.log.gather.TimeBasedBackUpRollingPolicyFileNamePattern${LOG_HOME}/${COMPONENT_ID}.${SEGMENT_ID}.openApi.debug.log.%i.zip/FileNamePatternMinIndex1/MinIndex!--最多十个文件 --MaxIndex${log.max.index}/MaxIndex/rollingPolicytriggeringPolicy classch.qos.logback.core.rolling.SizeBasedTriggeringPolicyMaxFileSize${log.openApi.max.size}/MaxFileSize/triggeringPolicyencoderpattern${FILE_LOG_PATTERN}/patterncharset${log.charset}/charset/encoder/appender