背景:由于客户要求将开机自启动的程序打印单独保存以记录和查询,案例代码中为ftgetcpu.c程序,一共有个log文件依次为ftgetcpu0.log,ftgetcpu1.log,ftgetcpu2.log,ftgetcpu3.log,ftgetcpu4.log,文件阈值设置为7M。程序刚运行时,会依次将stdout重定向到ftgetcpu0.log中,写满阈值后依次往后写满,当五个文件均写满时,调用shiftLogs()函数,依次将1号文件重命名覆盖0号文件,2号文件重命名覆盖1号文件,依次类推,再清空4号文件,将stdout指向4号文件。
这样可以使得0号文件始终是相对最旧的文件,4号文件始终是相对最新的文件。方便记录和观察。以下是项目部分代码。
这部分是log替换和运转部分:
void shiftLogs(){
int i;
char oldFileName[100], newFileName[100];
//rename
for(i = 1; i < LOG_FILE_COUNT; i++){
sprintf(oldFileName, "/var/ftgetcpu%d.log", i);
sprintf(newFileName, "/var/ftgetcpu%d.log", i - 1);
rename(oldFileName, newFileName);
}
//clear log4
FILE *file = fopen("/var/ftgetcpu4.log", "w");
if(file == NULL){
perror("Error opening ftgetcpu_log4 file -- clear ftgetcpu_log4");
fflush(stdout);
exit(EXIT_FAILURE);
}
fclose(file);
}
//初始化日志
for(int i = 0; i < LOG_FILE_COUNT; i++){
char fileName[30];
sprintf(fileName, "/var/ftgetcpu%d.log", i);
logs[i] = fopen(fileName, "a");
if(logs[i] == NULL){
perror("Error opening ftgetcpu_log file -- init ftgetcpu_log");
exit(EXIT_FAILURE);
}
}
for(int i = 0; i < LOG_FILE_COUNT; i++){
memset(cmd_log, 0, sizeof(cmd_log));
memset(fileSize, 0, sizeof(fileSize));
sprintf(cmd_log, "ls -l /var/ftgetcpu%d.log | awk '{printf $5}'", i);
logs_ll[i] = popen(cmd_log, "r");
fgets(fileSize, 100, logs_ll[i]);
log_size[i] = atoll(fileSize);
pclose(logs_ll[i]);
}
//status log
if(log_size[0] < LOG_FILE_SIZE){
freopen("/var/ftgetcpu0.log", "a", stdout);
log_status = 0;
}else if(log_size[0] > LOG_FILE_SIZE && log_size[1] < LOG_FILE_SIZE){
freopen("/var/ftgetcpu1.log", "a", stdout);
log_status = 1;
}else if(log_size[0] > LOG_FILE_SIZE && log_size[1] > LOG_FILE_SIZE && log_size[2] < LOG_FILE_SIZE){
freopen("/var/ftgetcpu2.log", "a", stdout);
log_status = 2;
}else if(log_size[0] > LOG_FILE_SIZE && log_size[1] > LOG_FILE_SIZE && log_size[2] > LOG_FILE_SIZE && log_size[3] < LOG_FILE_SIZE){
freopen("/var/ftgetcpu3.log", "a", stdout);
log_status = 3;
}else if(log_size[0] > LOG_FILE_SIZE && log_size[1] > LOG_FILE_SIZE && log_size[2] > LOG_FILE_SIZE && log_size[3] > LOG_FILE_SIZE && log_size[4] < LOG_FILE_SIZE){
freopen("/var/ftgetcpu4.log", "a", stdout);
log_status = 4;
}else if(log_size[4] > LOG_FILE_SIZE){
shiftLogs();
log_status = 4;
}
以上代码是判断stdout的输出重定向。