- 自定义log注解,请求抓取,配合切面手段,轻松实现日志埋点
-
CP_OperateLog
/*
* COPYRIGHT Beijing cp-boss-Tech Co.,Ltd. *
****************************************************************************
* 源文件名: CP_OperateLog.java
* 功能: cpframework框架
* 版本: @version 1.0
* 编制日期: 2013年12月30日 上午10:58:09
* 修改历史: (主要历史变动原因及说明)
* YYYY-MM-DD | Author | Change Description
* 2013年12月30日 | hanqunfeng | Created
*/
package com.demo;
import java.lang.annotation.*;
/**
*Description: <功能操作日志注解>. <br>
*<p>
<声明在被spring管理的类的方法上,会记录下当前的操作日志类型>
比如:@CP_OperateLog(value="注解日志",type=1,key="test")
</p>
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CP_OperateLog {
/**
* 用户操作名称
* @return 用户操作名称,默认为空串
*/
String value() default "";
/**
* 用户操作类型,默认类型为0<br/>
* 0 - 其他操作 <br/>
* 1 - 查询 <br/>
* 2 - 新增 <br/>
* 3 - 修改 <br/>
* 4 - 删除
* @return 用户操作类型
*/
CP_GlobalNamingConstant type() default CP_GlobalNamingConstant.OPERATE_DEFAULT;
/**
* 用户操作名称对应的key,可以通过该key值在属性文件中查找对应的value
* @return key
*/
String key() default "";
}
/*******************************************************************************
* COPYRIGHT Beijing cp-boss-Tech Co.,Ltd. *
*******************************************************************************
* 源文件名: CP_GlobalNamingConstant.java
* 功能:
* 版本: 1.0
* 编制日期: 2009-4-22
* 说明:
* 修改历史: (主要历史变动原因及说明)
* YYMMDD | Author | Change Description
* 2009-4-22 Liujiajun Created
*******************************************************************************/
package com.demo;
public enum CP_GlobalNamingConstant {
/**
* ****************************************************
* 用户操作日志记录类型定义<br/>
* ****************************************************
*/
/**
* 用户操作类型:导入
*/
OPERATE_IMPORT("导入"),
/**
* 用户操作类型:导出
*/
OPERATE_EXPORT("导出"),
/**
* 用户操作类型:获取对象
*/
OPERATE_ENTUITY("获取对象"),
/**
* 用户操作类型:获取列表
*/
OPERATE_LIST("获取列表"),
/**
* 用户操作类型:添加记录
*/
OPERATE_ADD("添加记录"),
/**
* 用户操作类型:修改记录
*/
OPERATE_MODIFY("修改记录"),
/**
* 复制对象
*/
OPERATE_COPY("复制对象"),
/**
* 用户操作类型:删除记录
*/
OPERATE_DELETE("删除记录"),
/**
* 用户操作类型:编辑记录
*/
OPERATE_EDIT("编辑记录"),
/**
* 用户操作类型:数据详细信息
*/
OPERATE_DETAIL_MODIFY("修改记录"),
/**
* 用户操作类型:上传
*/
OPERATE_UPLOAD("上传"),
/**
* 用户操作类型:下载
*/
OPERATE_DOWNLOAD("下载"),
/**
* 用户操作类型:缓存管理
*/
OPERATE_CACHE("缓存管理"),
/**
* 用户操作类型:默认
*/
OPERATE_DEFAULT("默认");
private String desc;//中文描述
/**
* 私有构造,防止被外部调用
* @param desc
*/
private CP_GlobalNamingConstant(String desc){
this.desc=desc;
}
/**
* 定义方法,返回描述,跟常规类的定义没区别
* @return
*/
public String getDesc(){
return desc;
}
/**
* 覆盖
* @return
*/
@Override
public String toString() {
return desc;
}
}
import com.veckchina.intelctrl.common.annotation.FixedFileUrlWithSsl;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.AnnotationUtils;
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;
@Aspect
@Component
public class LogAspect {
@Pointcut("@annotation(com.veckchina.intelctrl.common.annotation.CP_OperateLog)")
public void RestControllerPointCut() { };
@Around("RestControllerPointCut()")
public Object afterReturning(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = joinPoint.proceed();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String referer = request.getHeader("Referer");
Signature signature = joinPoint.getSignature();
// 获取方法上的注解
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
CP_OperateLog anno = AnnotationUtils.findAnnotation(method, CP_OperateLog.class);
return result;
}
}