首页 > 解决方案 > 如何生成带有序列号的日志文件名?

问题描述

我想将日志转储到日志文件中。达到文件的最大大小限制后,我想用数字重命名文件(格式类似于 log.%d)。

备份日志文件的数量有限制。达到限制后,我也必须删除最旧的创建日志文件。


void log_msg( )
{
    char log_message[256];
    time_t curr_time;
    struct tm * time_info;
    int ret;
    char NewLogFileName[40];
    char oldLogFileName[40];
    struct stat sb;
    int logNum = 0;

    time( &curr_time );
    time_info = localtime(&curr_time);
    strftime(log_message, sizeof(log_message), "%d %b %Y %H:%M:%S,", time_info);


     if ( files_in_Dir() > LOG_MAX_NUM_FILES  ) {
    /* delete the last created file and rename other files accordingly
      ex: file.0 -> file.1, file.1 -> file.2 */
     sprintf(oldLogFileName, "%s/%s.%d", LOG_DIR, logBaseFileName, (LOG_MAX_NUM_FILES - 1));
     unlink (oldLogFileName);

     for(logNum = 0; logNum < LOG_MAX_NUM_FILES - 1; logNum++ ) {
      sprintf(oldLogFileName, "%s/%s.%d", LOG_DIR ,logBaseFileName ,logNum);
      sprintf(NewLogFileName, "%s/%s.%d", LOG_DIR ,logBaseFileName ,logNum+1);
      if (rename(oldLogFileName,NewLogFileName) == 0) {
          printf("%s: Moved the content of %s to %s \n", __FUNCTION__, oldLogFileName, NewLogFileName);
      }else{
          printf("%s: Can't move the content of %s to %s %s \n", __FUNCTION__, oldLogFileName, NewLogFileName, strerror(errno));
      }
    }
  }

 // check for the file size before every write
    if ((stat(logFileName, &sb) == 0) && (sb.st_size > LOG_FILE_SIZE)) {
     // close the file
      close(data_log_fd);
         data_log_fd = 0;
       for(logNum = 0; logNum < LOG_MAX_NUM_FILES - 1; logNum++ ) {
      sprintf(oldLogFileName, "%s/%s.%d", LOG_DIR ,logBaseFileName ,logNum);
      sprintf(NewLogFileName, "%s/%s.%d", LOG_DIR ,logBaseFileName ,logNum+1);
      if (rename(oldLogFileName,NewLogFileName) == 0) {
          printf("%s: Moved the content of %s to %s \n", __FUNCTION__, oldLogFileName, NewLogFileName);
      }else{
          printf("%s: Can't move the content of %s to %s %s \n", __FUNCTION__, oldLogFileName, NewLogFileName, strerror(errno));
      }
    }
    
     // reinitiate logging
      data_log_init();
  }

    strcat(log_message, cpu_data);

    /** Finally write the log message to the log file */
   if( data_log_fd > 0 )
        ret = write( data_log_fd, (const void*) log_message, strlen(log_message) );
    else
        printf("Could not write data to the log file: %s\n", strerror(errno) );

  return;

}

重命名时出现了一些错误,它正在将文件 log.0 直接重命名为 log.4。没有生成中间文件。

标签: c

解决方案


无关说明:调用此函数时,当前文件似乎已打开。它可能会被关闭,而无需再次打开新文件。

您的重命名循环按以下顺序运行:

  • 文件.0 -> 文件.1
  • 文件.1 -> 文件.2
  • ...
  • 文件.n-1 -> 文件.n

看到图案了吗?如果LOG_MAX_NUM_FILES是“4”,剩下的文件是“file.4”,从“file.0”重命名通过整个链。

可能的解决方案:使用递减索引运行循环。


推荐阅读