问题描述、现象
- 项目正常运行
- 日志文件生成以及文件名都看不出来问题
- 日志里记录的信息也可以记录完整的每次请求记录
- 偶尔随机丢失一次或者多次完整的请求记录,与没有收到用户请求情况相同
问题排查
- 排除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){
}