logback丟失日誌

問題描述、現象

  1. 項目正常運行
  2. 日誌文件生成以及文件名都看不出來問題
  3. 日誌裏記錄的信息也可以記錄完整的每次請求記錄
  4. 偶爾隨機丟失一次或者多次完整的請求記錄,與沒有收到用戶請求情況相同

 

問題排查

  1. 排除AsyncAppender的丟失機制導致,可以將日誌記錄方式先改爲同步方式或者discardThreshold設置爲0再驗證問題是否還會出現

2、系統多實例部署,用於多個實例運行,日誌配置文件完全相同,會導致多個實例往同一個文件寫日誌,觸發日誌滾動機制時,會出現日誌覆蓋的情況。

問題處理

  1. AsyncAppender丟失機制導致可以改爲同步打印或者discardThreshold設置爲0
  2. 多實例部署情況:可以獲取當前服務的本地ip地址,寫入日誌變量,進行日誌文件名稱區分,不同的實行寫入不同的文件內即可解決;
      //寫入變量
      System.setProperty("instanceIp", "XXX");
      //springboot啓動類
      SpringApplication.run(ElectricRecordApplication.class, args);
logback.xml   //日誌配置文件


    //引用變量
        <springProperty scope="context" name="instanceIp"  source="instanceIp" defaultValue="" />
        <fileNamePattern>${appLogPath}/%d{yyyy-MM-dd,aux}/logFile.%d{yyyy-MM-dd_HH}${instanceIp}.log</fileNamePattern>
        try{
            RedisURI uri = RedisURI.Builder.redis("XXX", 16379)
                    .withDatabase(6)
                    .withPassword("XXXX")
                    .build();
            redisClient = RedisClient.create(uri);
            connect= redisClient.connect();
            RedisCommands syncCommands = connect.sync();
            Object count = syncCommands.get("count");
            if(StringUtils.isEmpty(count)){
                syncCommands.set("count", "1");
                type="_A";
            }else{
                int i = Integer.parseInt(count.toString());
                if(i%2==0){
                    type="_A";
                }else{
                    type="_B";
                }
                syncCommands.set("count", String.valueOf(i+1));
            }
            connect.close();
            redisClient.shutdown();
        }catch (Exception e){

        }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章