int ShiftRmbLog()

in eventmesh-sdks/eventmesh-sdk-c/src/rmb_log.c [395:722]


int ShiftRmbLog (FILE * file)
{
  if (strlen (pStRmbLog->_para._path) == 0
      || pStRmbLog->_para._shiftType == RMB_LOG_TYPE_NORMAL)
  {
    return 0;
  }

  if (pStRmbLog->_para._shiftType == RMB_LOG_TYPE_CYCLE)
  {

    if (stat (pStRmbLog->_logBaseFileName, &pStRmbLog->gRmbSb) < 0)
    {
      pStRmbLog->_curFileSize = 0;
    }
    else
    {
      pStRmbLog->_curFileSize = (int) pStRmbLog->gRmbSb.st_size;
    }

    if (pStRmbLog->_curFileSize < pStRmbLog->_para._maxFileSize)
    {
      return 0;
    }

    OpenRmbLog ();
    //file lock
    pStRmbLog->logFileLock.l_type = F_WRLCK;
    pStRmbLog->logFileLock.l_start = 0;
    pStRmbLog->logFileLock.l_whence = SEEK_SET;
    pStRmbLog->logFileLock.l_len = 0;
    pStRmbLog->logFileLock.l_pid = getpid ();
    if (-1 != fcntl (pStRmbLog->_fd, F_SETLKW, &pStRmbLog->logFileLock))
    {
      int fd = OpenStateLog ();
      pStRmbLog->logStateLock.l_type = F_WRLCK;
      pStRmbLog->logStateLock.l_start = 0;
      pStRmbLog->logStateLock.l_whence = SEEK_SET;
      pStRmbLog->logStateLock.l_len = 0;
      pStRmbLog->logStateLock.l_pid = getpid ();
      if (-1 != fcntl (fd, F_SETLKW, &pStRmbLog->logStateLock))
      {
        //GetCurFileNum(pStRmbLog->_pStatFile);
        GetCurFileNum (pStRmbLog->_pStatFile);
//                              printf("pid=%d,getCurNo=%d,CurNums=%d", getpid(), pStRmbLog->_curFileNo, pStRmbLog->_curFileNums);
        snprintf (pStRmbLog->_logFileName,
                  sizeof (pStRmbLog->_logFileName) - 1, "%s.%d",
                  pStRmbLog->_logBaseFileName, pStRmbLog->_curFileNo);

        if (stat (pStRmbLog->_logBaseFileName, &pStRmbLog->gRmbSb) != -1
            && (int) pStRmbLog->gRmbSb.st_size >=
            pStRmbLog->_para._maxFileSize)
        {
          pStRmbLog->_curFileNums += 1;
          if (pStRmbLog->_curFileNums > pStRmbLog->_para._maxFileNum)
          {
            if (access (pStRmbLog->_logFileName, F_OK) == 0)
            {
//                                                      printf("pid=%d remove file=%s,curNo=%d, curNum=%d", getpid(), pStRmbLog->_logFileName, pStRmbLog->_curFileNo, pStRmbLog->_curFileNums);
              remove (pStRmbLog->_logFileName);
            }
            pStRmbLog->_curFileNums -= 1;
          }

          if (access (pStRmbLog->_logBaseFileName, F_OK) == 0)
          {
//                                              printf("pid=%d rename %s-->%s, curNo=%d,curNum=%d", getpid(), pStRmbLog->_logBaseFileName, pStRmbLog->_logFileName, pStRmbLog->_curFileNo, pStRmbLog->_curFileNums);
            rename (pStRmbLog->_logBaseFileName, pStRmbLog->_logFileName);
          }
          else
          {
//                                              printf("pid=%d baseFileName=%s not exist", getpid(), pStRmbLog->_logBaseFileName);
          }
          pStRmbLog->_curFileNo =
            (pStRmbLog->_curFileNo + 1) % pStRmbLog->_para._maxFileNum;
//                                      if (pStRmbLog->_curFileNo == 0)
//                                      {
//                                              pStRmbLog->_curFileNo = 1;
//                                      }
          SetCurFileNum (pStRmbLog->_pStatFile);
          //snprintf(pStRmbLog->_logFileName, sizeof(pStRmbLog->_logFileName) - 1, "%s.%d", pStRmbLog->_logBaseFileName, pStRmbLog->_curFileNo);
        }

//                              printf("pid=%d setFileNum.curNo=%d curNum=%d", getpid(), pStRmbLog->_curFileNo, pStRmbLog->_curFileNums);
        pStRmbLog->logStateLock.l_type = F_UNLCK;
        pStRmbLog->logStateLock.l_whence = SEEK_SET;
        pStRmbLog->logStateLock.l_start = 0;
        pStRmbLog->logStateLock.l_len = 0;
        fcntl (fd, F_SETLKW, &pStRmbLog->logStateLock);
      }
      CloseStateLog ();

//                      printf("shift over!pid=%d, curNo=%d,curNum=%d, logFileName=%s", getpid(),  pStRmbLog->_curFileNo, pStRmbLog->_curFileNums,  pStRmbLog->_logFileName);
      //strncpy(pStRmbLog->_toDeleteFileName, pStRmbLog->_logFileName, sizeof(pStRmbLog->_toDeleteFileName) - 1);

      pStRmbLog->logFileLock.l_type = F_UNLCK;
      pStRmbLog->logFileLock.l_whence = SEEK_SET;
      pStRmbLog->logFileLock.l_start = 0;
      pStRmbLog->logFileLock.l_len = 0;
      fcntl (pStRmbLog->_fd, F_SETLKW, &pStRmbLog->logFileLock);
    }
    CloseRmbLog ();
    return 0;
  }
  else if (pStRmbLog->_para._shiftType == RMB_LOG_TYPE_DAILY)
  {
    time_t curTime = time (NULL);
    //日期变更发送滚动
    if (RmbIsOtherDay (&curTime, &pStRmbLog->_lastShiftTime))
    {
      OpenRmbLog ();
      //file lock
      pStRmbLog->logFileLock.l_type = F_WRLCK;
      pStRmbLog->logFileLock.l_start = 0;
      pStRmbLog->logFileLock.l_whence = SEEK_SET;
      pStRmbLog->logFileLock.l_len = 0;
      pStRmbLog->logFileLock.l_pid = getpid ();
      if (-1 != fcntl (pStRmbLog->_fd, F_SETLKW, &pStRmbLog->logFileLock))
      {
        int fd = OpenStateLog ();
        pStRmbLog->logStateLock.l_type = F_WRLCK;
        pStRmbLog->logStateLock.l_start = 0;
        pStRmbLog->logStateLock.l_whence = SEEK_SET;
        pStRmbLog->logStateLock.l_len = 0;
        pStRmbLog->logStateLock.l_pid = getpid ();
        if (-1 != fcntl (fd, F_SETLKW, &pStRmbLog->logStateLock))
        {
          GetCurFileNum (pStRmbLog->_pStatFile);
          snprintf (pStRmbLog->_logFileName,
                    sizeof (pStRmbLog->_logFileName) - 1, "%s.%d",
                    pStRmbLog->_logBaseFileName, pStRmbLog->_curFileNo);

          if (RmbIsOtherDay (&curTime, &pStRmbLog->_lastShiftTime))
          {
            pStRmbLog->_curFileNums += 1;
            if (pStRmbLog->_curFileNums > pStRmbLog->_para._maxFileNum)
            {
              if (access (pStRmbLog->_logFileName, F_OK) == 0)
              {
                remove (pStRmbLog->_logFileName);
              }
              pStRmbLog->_curFileNums -= 1;
            }
            if (access (pStRmbLog->_logBaseFileName, F_OK) == 0)
            {
              rename (pStRmbLog->_logBaseFileName, pStRmbLog->_logFileName);
            }

            snprintf (pStRmbLog->_logBaseFileName,
                      sizeof (pStRmbLog->_logBaseFileName), "%s_%s.log",
                      pStRmbLog->_para._path, RmbGetShortDateStr (&curTime));
            snprintf (pStRmbLog->_logFileName,
                      sizeof (pStRmbLog->_logFileName), "%s.0",
                      pStRmbLog->_logBaseFileName);
            pStRmbLog->_curFileNo = 0;
            pStRmbLog->_curFileNums = 0;
            pStRmbLog->_lastShiftTime = curTime;
            SetCurFileNum (pStRmbLog->_pStatFile);
          }
          else
          {
            snprintf (pStRmbLog->_logBaseFileName,
                      sizeof (pStRmbLog->_logBaseFileName), "%s_%s.log",
                      pStRmbLog->_para._path, RmbGetShortDateStr (&curTime));
          }
          pStRmbLog->logStateLock.l_type = F_UNLCK;
          pStRmbLog->logStateLock.l_whence = SEEK_SET;
          pStRmbLog->logStateLock.l_start = 0;
          pStRmbLog->logStateLock.l_len = 0;
          fcntl (fd, F_SETLKW, &pStRmbLog->logStateLock);
        }
        CloseStateLog ();

        pStRmbLog->logFileLock.l_type = F_UNLCK;
        pStRmbLog->logFileLock.l_whence = SEEK_SET;
        pStRmbLog->logFileLock.l_start = 0;
        pStRmbLog->logFileLock.l_len = 0;
        fcntl (pStRmbLog->_fd, F_SETLKW, &pStRmbLog->logFileLock);
      }
      CloseRmbLog ();
      return 0;
    }

    if (stat (pStRmbLog->_logBaseFileName, &pStRmbLog->gRmbSb) < 0)
    {
      pStRmbLog->_curFileSize = 0;
    }
    else
    {
      pStRmbLog->_curFileSize = (int) pStRmbLog->gRmbSb.st_size;
    }

    if (pStRmbLog->_curFileSize < pStRmbLog->_para._maxFileSize)
    {
      return 0;
    }

    OpenRmbLog ();
    //file lock
    pStRmbLog->logFileLock.l_type = F_WRLCK;
    pStRmbLog->logFileLock.l_start = 0;
    pStRmbLog->logFileLock.l_whence = SEEK_SET;
    pStRmbLog->logFileLock.l_len = 0;
    pStRmbLog->logFileLock.l_pid = getpid ();
    if (-1 != fcntl (pStRmbLog->_fd, F_SETLKW, &pStRmbLog->logFileLock))
    {
      int fd = OpenStateLog ();
      pStRmbLog->logStateLock.l_type = F_WRLCK;
      pStRmbLog->logStateLock.l_start = 0;
      pStRmbLog->logStateLock.l_whence = SEEK_SET;
      pStRmbLog->logStateLock.l_len = 0;
      pStRmbLog->logStateLock.l_pid = getpid ();
      if (-1 != fcntl (fd, F_SETLKW, &pStRmbLog->logStateLock))
      {
        GetCurFileNum (pStRmbLog->_pStatFile);
        snprintf (pStRmbLog->_logFileName, sizeof (pStRmbLog->_logFileName),
                  "%s.%d", pStRmbLog->_logBaseFileName,
                  pStRmbLog->_curFileNo);

        if (stat (pStRmbLog->_logBaseFileName, &pStRmbLog->gRmbSb) != -1
            && (int) pStRmbLog->gRmbSb.st_size >=
            pStRmbLog->_para._maxFileSize)
        {
          pStRmbLog->_curFileNums += 1;
          if (pStRmbLog->_curFileNums > pStRmbLog->_para._maxFileNum)
          {
            if (access (pStRmbLog->_logFileName, F_OK) == 0)
            {
              remove (pStRmbLog->_logFileName);
            }
            pStRmbLog->_curFileNums -= 1;
          }
          //CloseZrdLog();
          if (access (pStRmbLog->_logBaseFileName, F_OK) == 0)
          {
            rename (pStRmbLog->_logBaseFileName, pStRmbLog->_logFileName);
          }

          pStRmbLog->_curFileNo =
            (pStRmbLog->_curFileNo + 1) % pStRmbLog->_para._maxFileNum;
//                                      if (pStRmbLog->_curFileNo == 0)
//                                      {
//                                              pStRmbLog->_curFileNo = 1;
//                                      }
          SetCurFileNum (pStRmbLog->_pStatFile);

        }

        pStRmbLog->logStateLock.l_type = F_UNLCK;
        pStRmbLog->logStateLock.l_whence = SEEK_SET;
        pStRmbLog->logStateLock.l_start = 0;
        pStRmbLog->logStateLock.l_len = 0;
        fcntl (fd, F_SETLKW, &pStRmbLog->logStateLock);
      }
      CloseStateLog ();

      pStRmbLog->logFileLock.l_type = F_UNLCK;
      pStRmbLog->logFileLock.l_whence = SEEK_SET;
      pStRmbLog->logFileLock.l_start = 0;
      pStRmbLog->logFileLock.l_len = 0;
      fcntl (pStRmbLog->_fd, F_SETLKW, &pStRmbLog->logFileLock);
    }
    CloseRmbLog ();
    return 0;
  }
  else if (pStRmbLog->_para._shiftType == RMB_LOG_TYPE_DAILY_AND_CYCLE)
  {
    time_t curTime = time (NULL);
    //日期变更发送滚动
    if (RmbIsOtherDay (&curTime, &pStRmbLog->_lastShiftTime))
    {
      pStRmbLog->_curFileNums += 1;
      //假如个数限制,则删除老的
      if (pStRmbLog->_curFileNums > pStRmbLog->_para._maxFileNum)
      {
        remove (pStRmbLog->_toDeleteFileName);
        pStRmbLog->_curFileNums -= 1;
        StDayInfo dayInfo;
        FindNextDeleteLog (&dayInfo);
      }
      //GetCurStateFromRmbLogByDaily_V3(); //保证没有出错
      //rename
      //CloseRmbLog();
      rename (pStRmbLog->_logBaseFileName, pStRmbLog->_logFileName);
      snprintf (pStRmbLog->_logBaseFileName,
                sizeof (pStRmbLog->_logBaseFileName), "%s_%s.log",
                pStRmbLog->_para._path, RmbGetShortDateStr (&curTime));
      snprintf (pStRmbLog->_logFileName, sizeof (pStRmbLog->_logFileName),
                "%s_1.log", pStRmbLog->_logBaseFileName);
      pStRmbLog->_curFileNo = 1;
      //OpenRmbLog();
      return 0;
    }

    if (stat (pStRmbLog->_logBaseFileName, &pStRmbLog->gRmbSb) < 0)
    {
      pStRmbLog->_curFileSize = 0;
    }
    else
    {
      pStRmbLog->_curFileSize = (int) pStRmbLog->gRmbSb.st_size;
    }

    if (pStRmbLog->_curFileSize < pStRmbLog->_para._maxFileSize)
    {
      return 0;
    }
    //文件大小促发滚动
    pStRmbLog->_curFileNums += 1;
    if (pStRmbLog->_curFileNums > pStRmbLog->_para._maxFileNum)
    {
      remove (pStRmbLog->_toDeleteFileName);
      pStRmbLog->_curFileNums -= 1;
      StDayInfo dayInfo;
      FindNextDeleteLog (&dayInfo);
    }
    //rename
    //CloseRmbLog();
    rename (pStRmbLog->_logBaseFileName, pStRmbLog->_logFileName);
    pStRmbLog->_curFileNo += 1;
    snprintf (pStRmbLog->_logFileName, sizeof (pStRmbLog->_logFileName),
              "%s_%d.log", pStRmbLog->_logBaseFileName,
              pStRmbLog->_curFileNo);
    //OpenRmbLog();
    return 0;
  }
  return 0;
}