logback丢失日志

发布时间 2023-11-30 10:47:31作者: 笑~笑

问题描述、现象

  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){

        }