關於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));
}

每個控制層最好打打印好入參和返回的數據(數據太大隻返回部分數據)

發佈了164 篇原創文章 · 獲贊 114 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章