关于log该如何打以便后期排查问题

以前打印log前,没有考虑之后排查问题的方便与否,而只是觉得重要的信息才打印,但是什么是重要信息呢?这里总结了以下几点经验:
1、通过打印log来跟踪一组行为
在前面的博文: https://blog.csdn.net/timchen525/article/details/80358723 中我写了用logId来跟踪一次request请求所打印的所有log日志,但是对于一个完整的操作步骤,比如,对于一个项目的添加,编辑,删除,以及查询的操作,需要通过一个唯一的id串联起来,比如项目的操作行为, 我通过log记录如下:
@Slf4j
public class ProjectBehavior {
    
    private String userName = "tim";
    
    public void add() {
        int rowAffectNum = addProject(project);
        Long projectId = project.getId();
        log.info("[userName={} add project and projectId={}]", userName, projectId);
    }
    
    public void update() {
        updateProject(project);
        log.info("[userName={} update project and projectId={}, projectInfo={}]", userName, project.getId(),  JSON.toJsonString(project));
    }
    
    public void select() {
        selectProject(project);
        log.info("[userName={} select project, projectId={}]", userName, project.getId());
    }
    
    public void delete() {
        deleteProject(project);
        log.info("[userName={} delete project and projectId={}, projectInfo={}]", userName, project.getId(), JSON.toJsonString(project))
    }
}
分析:
在上述的代码中,所有的增删改查的行为的唯一标识是projectId=具体的项目id,因此,我们可以根据项目的id将所有的行为贯穿起来。注意:在增加项目的操作的时候,这里需要在添加的时候返回项目的主键id,具体操作可以参考我的这篇博文《MySQL 插入数据后返回自增id的方法》。
2、log打印warn或者error的信息
log在打印warn或者error信息时,应该尽可能的包括入参,以及返回值的错误信息。比如:
try {
    insertData(project);
} catch (Exception e) {
    log.error("input param={}, error={}", JSON.toJsonString(project), e );
}
3、log打印controller层的入参和返回的数据
@GetMapping(value = "/test")
public String test(User user) {
    log.info("[URI=/test][input param={}]", JSON.toJsonString(user));
    // 业务数据处理
    Project project = doSomeThing();
    log.info("[URI=/test][return data={}]",JSON.toJsonString(project));
}

每个控制层最好打打印好入参和返回的数据(数据太大只返回部分数据)

猜你喜欢

转载自blog.csdn.net/timchen525/article/details/80637549