c - 如何生成带有序列号的日志文件名?
问题描述
我想将日志转储到日志文件中。达到文件的最大大小限制后,我想用数字重命名文件(格式类似于 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。没有生成中间文件。
解决方案
无关说明:调用此函数时,当前文件似乎已打开。它可能会被关闭,而无需再次打开新文件。
您的重命名循环按以下顺序运行:
- 文件.0 -> 文件.1
- 文件.1 -> 文件.2
- ...
- 文件.n-1 -> 文件.n
看到图案了吗?如果LOG_MAX_NUM_FILES
是“4”,剩下的文件是“file.4”,从“file.0”重命名通过整个链。
可能的解决方案:使用递减索引运行循环。
推荐阅读
- servlets - 挂钩 PrintWriter 并修改字符串
- c# - asp.net 核心中的连接不安全
- python - Python文件读取问题,可能的infile循环?
- reactjs - 使用 Laravel 的拖放区。大文件导致 500 错误
- java - Unirest 的回应隐藏了真正的例外
- json - 带有Json资源返回错误的Laravel分页
- sql - 我只想更新一个元组(在 SQL Server 中)并选择相同的更新元组
- c# - 如何在 Visual Studio 2017 中创建模拟 WCF 服务
- tensorflow - 使用不同的优化器在 tensorflow 中训练同一层
- ruby-on-rails - Rails 更新关联