介绍
我们在进行项目开发时经常会使用得logback/log4j+slf4j进行日志控制,这有助于我们记录用户操作和错误排查,更重要得是这是甩锅利器(0.0)。 然而有些时候,客户要求记录敏感操作信息入库,这就需要我们进行更详细得日志记录操作。 废话不多说直接上代码 以下代码只是个Demo,仅供参考和学习。
AOP + 自定义注解
面向切面编程,用来强化功能。这个就不多介绍了,请自行百度。你可以的! 注解这玩意,在实际开发中肯定没少用,大家也知道注解得好处。减少配置,拿来就用,方便!
自定义注解 SysLog
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
AOP切面 SysLogAspect
@Aspect
@Component
public class SysLogAspect {
@Resource
private SysLogService sysLogService;
@Pointcut(value = "@annotation(com.finn.springbootmp.annotation.SysLog)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
Object result = point.proceed();
long time = System.currentTimeMillis() - beginTime;
saveSysLog(point, time, result);
return result;
}
private void saveSysLog(ProceedingJoinPoint point, long time, Object result) {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
SysLogEntity sysLogEntity = new SysLogEntity();
SysLog sysLog = method.getAnnotation(SysLog.class);
if (sysLog != null) {
sysLogEntity.setOperation(sysLog.value());
}
String className = point.getTarget().getClass().getName();
String methodName = signature.getName();
sysLogEntity.setMethod(className + "." + methodName + "()");
Object[] args = point.getArgs();
String params = JSONObject.toJSONString(args);
sysLogEntity.setParams(params);
HttpServletRequest request = getHttpServletRequest();
sysLogEntity.setIpAddress(IpUtils.getIpAddress(request));
sysLogEntity.setOperateTime(time);
sysLogEntity.setCreateDate(new Date());
sysLogService.save(sysLogEntity);
}
public HttpServletRequest getHttpServletRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
}
日志实体类 SysLogEntity
@Data
@TableName("sys_log")
public class SysLogEntity implements Serializable
{
private static final long serialVersionUID = 1L;
@TableId("id")
private Long id;
private String userName;
private String operation;
private String method;
private String params;
private Long operateTime;
private String ipAddress;
private Date createDate;
private String logType;
private int status;
}
ip工具类 IpUtils
public static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
}
sys_log 表sql
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`operation` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户操作',
`method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法',
`params` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求参数',
`operate_time` bigint(20) NULL DEFAULT NULL COMMENT '执行时间',
`ip_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'ip地址',
`create_date` datetime(0) NOT NULL COMMENT '创建时间',
`status` tinyint(2) NULL DEFAULT NULL COMMENT '状态',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1427633902284976130 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
测试
测试代码
@RestController
@RequestMapping("/sys-user")
public class SysUserController {
@Autowired
private ISysUserService iSysUserService;
@SysLog("通用日志处理测试")
@RequestMapping("/test")
public boolean test(@RequestParam("username") String username,@RequestParam("password") String password){
SysUser sysUser = new SysUser();
sysUser.setUsername(username);
sysUser.setPassword(password);
boolean save = iSysUserService.save(sysUser);
return save;
}
}
请求测试
http://127.0.0.1:8080/sys-user/test?username=finn&password=finn321
结果:

注意
使用localhost作为地址测试时,ip存入有问题,使用127.0.0.1就好
|