问题描述、现象
- 项目正常运行
- 日志文件生成以及文件名都看不出来问题
- 日志里记录的信息也可以记录完整的每次请求记录
- 偶尔随机丢失一次或者多次完整的请求记录,与没有收到用户请求情况相同
问题排查
- 排除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){ }
标签:count,syncCommands,实例,丢失,日志,logback,connect From: https://www.cnblogs.com/qq376324789/p/17866726.html