diff --git a/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/annotation/BusinessLog.java b/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/annotation/BusinessLog.java new file mode 100644 index 000000000..1ef355ca1 --- /dev/null +++ b/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/annotation/BusinessLog.java @@ -0,0 +1,45 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.log.api.annotation; + +import java.lang.annotation.*; + +/** + * 用来标记在控制器类或方法上,进行判断是否需要对接口进行日志记录 + * + * @author fengshuonan + * @date 2022/1/12 20:48 + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface BusinessLog { + + /** + * 是否进行日志记录,默认是开启 + */ + boolean openLog() default true; + +} diff --git a/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/constants/LogFileConstants.java b/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/constants/LogFileConstants.java index 4fb935583..3a215feb6 100644 --- a/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/constants/LogFileConstants.java +++ b/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/constants/LogFileConstants.java @@ -64,4 +64,9 @@ public interface LogFileConstants { */ Integer DEFAULT_API_LOG_AOP_SORT = 500; + /** + * 默认全局记录日志的开关 + */ + Boolean DEFAULT_GLOBAL_LOG_FLAG = false; + } diff --git a/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/expander/LogConfigExpander.java b/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/expander/LogConfigExpander.java index 1f8acecf9..56d35cd7d 100644 --- a/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/expander/LogConfigExpander.java +++ b/kernel-d-log/log-api/src/main/java/cn/stylefeng/roses/kernel/log/api/expander/LogConfigExpander.java @@ -59,4 +59,14 @@ public class LogConfigExpander { return ConfigContext.me().getSysConfigValueWithDefault("SYS_LOG_FILE_SAVE_PATH_LINUX", String.class, LogFileConstants.DEFAULT_FILE_SAVE_PATH_LINUX); } + /** + * 全局日志记录,如果开启则所有请求都将记录日志 + * + * @author fengshuonan + * @date 2022/1/12 20:32 + */ + public static Boolean getGlobalControllerOpenFlag() { + return ConfigContext.me().getSysConfigValueWithDefault("SYS_LOG_GLOBAL_FLAG", Boolean.class, LogFileConstants.DEFAULT_GLOBAL_LOG_FLAG); + } + } diff --git a/kernel-d-log/log-business-requestapi/src/main/java/cn/stylefeng/roses/kernel/log/requestapi/RequestApiLogRecordAop.java b/kernel-d-log/log-business-requestapi/src/main/java/cn/stylefeng/roses/kernel/log/requestapi/RequestApiLogRecordAop.java index c6f2be5ac..febeb9221 100644 --- a/kernel-d-log/log-business-requestapi/src/main/java/cn/stylefeng/roses/kernel/log/requestapi/RequestApiLogRecordAop.java +++ b/kernel-d-log/log-business-requestapi/src/main/java/cn/stylefeng/roses/kernel/log/requestapi/RequestApiLogRecordAop.java @@ -26,8 +26,10 @@ package cn.stylefeng.roses.kernel.log.requestapi; import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.log.api.LogRecordApi; +import cn.stylefeng.roses.kernel.log.api.annotation.BusinessLog; import cn.stylefeng.roses.kernel.log.api.constants.LogConstants; import cn.stylefeng.roses.kernel.log.api.constants.LogFileConstants; +import cn.stylefeng.roses.kernel.log.api.expander.LogConfigExpander; import cn.stylefeng.roses.kernel.log.api.factory.LogRecordFactory; import cn.stylefeng.roses.kernel.log.api.factory.appender.AuthedLogAppender; import cn.stylefeng.roses.kernel.log.api.factory.appender.HttpLogAppender; @@ -87,6 +89,12 @@ public class RequestApiLogRecordAop implements Ordered { Object result = point.proceed(); try { + // 判断是否需要记录日志 + boolean ensureMakeLog = this.ensureMakeLog(point); + if (!ensureMakeLog) { + return result; + } + if (ObjectUtil.isNotEmpty(result)) { // 获取接口上@PostResource或者@GetResource的name属性和requiredLogin属性 Map annotationProp = getAnnotationProp(point); @@ -116,7 +124,7 @@ public class RequestApiLogRecordAop implements Ordered { * @date 2020/12/22 21:18 */ private Map getAnnotationProp(ProceedingJoinPoint joinPoint) { - MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); // 通过map封装参数和参数值,key参数名,value是参数值 @@ -231,7 +239,7 @@ public class RequestApiLogRecordAop implements Ordered { // 解决上传文件接口aop记录日志报错 if (args[i] instanceof MultipartFile && args[i] != null) { // 根据参数名只记录文件名 - paramMap.put(parameterNames[i], ((MultipartFile)args[i]).getOriginalFilename()); + paramMap.put(parameterNames[i], ((MultipartFile) args[i]).getOriginalFilename()); } else { paramMap.put(parameterNames[i], args[i]); } @@ -249,7 +257,7 @@ public class RequestApiLogRecordAop implements Ordered { for (int i = 0; i < args.length; i++) { if (args[i] instanceof MultipartFile && args[i] != null) { // 根据参数名只记录文件名 - paramMap.put("args" + i, ((MultipartFile)args[i]).getOriginalFilename()); + paramMap.put("args" + i, ((MultipartFile) args[i]).getOriginalFilename()); } else { paramMap.put("args" + i, args[i]); } @@ -260,4 +268,57 @@ public class RequestApiLogRecordAop implements Ordered { return paramMap; } + /** + * 确定当前接口是否需要记录日志 + * + * @author fengshuonan + * @date 2022/1/12 20:44 + */ + private boolean ensureMakeLog(ProceedingJoinPoint point) { + // 判断是否需要记录日志,如果不需要直接返回 + Boolean openFlag = LogConfigExpander.getGlobalControllerOpenFlag(); + + // 获取类上的业务日志开关注解 + Class controllerClass = point.getTarget().getClass(); + BusinessLog businessLog = controllerClass.getAnnotation(BusinessLog.class); + + // 获取方法上的业务日志开关注解 + BusinessLog methodBusinessLog = null; + MethodSignature methodSignature = null; + if (!(point.getSignature() instanceof MethodSignature)) { + return false; + } + methodSignature = (MethodSignature) point.getSignature(); + Object target = point.getTarget(); + try { + Method currentMethod = target.getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes()); + methodBusinessLog = currentMethod.getAnnotation(BusinessLog.class); + } catch (NoSuchMethodException e) { + return false; + } + + // 如果开关开启 + if (openFlag) { + // 如果控制器类上特意标明不做日志,则不记录日志 + if (businessLog != null && !businessLog.openLog()) { + return false; + } + // 如果方法上标明不记录日志,则不记录日志 + if (methodBusinessLog != null && !methodBusinessLog.openLog()) { + return false; + } + return true; + } else { + // 如果全局开关没开启,但是类上有特殊标记开启日志,则以类上标注为准 + if (businessLog != null && businessLog.openLog()) { + return true; + } + // 如果方法上标明不记录日志,则不记录日志 + if (methodBusinessLog != null && methodBusinessLog.openLog()) { + return true; + } + return false; + } + } + }