問題描述、現象
- 項目正常運行
- 日誌文件生成以及文件名都看不出來問題
- 日誌裏記錄的信息也可以記錄完整的每次請求記錄
- 偶爾隨機丟失一次或者多次完整的請求記錄,與沒有收到用戶請求情況相同
問題排查
- 排除AsyncAppender的丟失機制導致,可以將日誌記錄方式先改爲同步方式或者
discardThreshold
設置爲0再驗證問題是否還會出現
2、系統多實例部署,用於多個實例運行,日誌配置文件完全相同,會導致多個實例往同一個文件寫日誌,觸發日誌滾動機制時,會出現日誌覆蓋的情況。
問題處理
- AsyncAppender丟失機制導致可以改爲同步打印或者
discardThreshold
設置爲0 - 多實例部署情況:可以獲取當前服務的本地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){ }