我想保留我的服务的审核日志,可以添加/更新/删除用户和相关角色。但我发现审计日志与服务代码紧密相关。实际上我认为开发人员不应该担心日志输入参数。
一种好方法是使用Aop和自定义注释来解耦。类似于以下内容:
@Auditable(actionType = ActionType.ADD, subject = Subject.User) // @Auditable is the annotation defined by me
@RequestMapping("/addUser")
@ResponseBody
public void
signUp(UserDTO userDTO){
UserInfo userInfo = new UserInfo();
userInfo.setName(userDTO.getName());
userInfo.setPassword("11");
userInfo.setUid(1);
userInfo.setState(1);
userInfoService.insert(userInfo);
}
方面可能是这样的:
@Component
@Aspect
public class AuditAspect {
@Resource
private IAuditLogService auditLogService;
@After(value = "@annotation(auditable)")
@Transactional
public void logAuditActivity(JoinPoint jp, Auditable auditable) {
String targetAuditingUser;
String actionType = auditable.actionType().getDescription();
String subject = auditable.subject().getSubject();
AuditLog auditLog = new AuditLog();
auditLog.setAppId(1L);
auditLog.setOperatio(actionType);
auditLog.setFunctionType(subject);
auditLog.setCreatedAt(new Date());
auditLog.setUpdatedAt(new Date());
auditLogService.insert(auditLog);
}
但使用方面存在问题。我无法在日志中添加一些与服务相关的消息。例如,当我删除用户时,我应该获取用户名并将其添加到日志中。
@Auditable(actionType = ActionType.DELETE, subject = Subject.User)
@RequestMapping("/delete")
@ResponseBody
public void
delete(int userId){
// need to record a log “DELETE USER userNameDeleted“,
String userNameDeleted = userService.getUserById(userId);
userInfoService.delete(userId);
}
我需要记录日志“DELETE USER Tom”,但是userNameDeleted无法传递给aspect。因此,似乎方面无法使用此类与服务相关的消息(例如Tom)编写日志。
我想知道在使用动态消息保存日志时是否存在解耦服务/应用程序的方法。