录制日志时如何解耦代码

时间:2018-01-18 06:52:34

标签: java spring logging aop

我想保留我的服务的审核日志,可以添加/更新/删除用户和相关角色。但我发现审计日志与服务代码紧密相关。实际上我认为开发人员不应该担心日志输入参数。

一种好方法是使用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)编写日志。

我想知道在使用动态消息保存日志时是否存在解耦服务/应用程序的方法。

0 个答案:

没有答案