【发布时间】:2021-09-17 00:19:10
【问题描述】:
我正在尝试构建一个文件,我将在其中保留应用程序中最重要的事件。我构建了一个负责记录的函数,但它似乎没有按预期工作。首先,在无限while() 循环期间,APPLOG.LOG 文件中不会出现消息,但仅在应用程序完成时才会出现。我应该如何构建将信息实时写入文件的功能?
我使用了很多 *.c 文件,并且我希望能够在每个文件中记录事件。 fLog = fopen(LOG_FILENAME, "w"); 不应该在 APLOG(...) 函数内吗?
下面是一些负责记录的代码。
日志记录.h
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
#define TYPE_GENERAL 1
#define TYPE_BINARY 2
#define TYPE_INFO 3
#define TYPE_WARNING 4
#define TYPE_ERROR 5
#define LOG_FILENAME "APPLOG.LOG"
FILE *fLog;
logging.c
void APLOG(FILE *fLog, uint32_t type, char *MESSAGE)
{
if(fLog == NULL)
{
printf("Error open %s FILE!", TRLOG_FILENAME);
exit(1);
}
else
{
switch(type)
{
case TYPE_GENERAL:
fprintf(fLog, "%s %s %s: %s \n",__DATE__, __TIME__, "GENERAL", MESSAGE);
break;
case TYPE_BINARY:
fprintf(fLog, "%s %s %s: %s \n",__DATE__, __TIME__, "BINARY", "ATTEMPTED TO WRITE A BINARY MESSAGE. FUNCTION NOT ACTIVE");
break;
case TYPE_INFO:
fprintf(fLog, "%s %s %s: %s \n",__DATE__, __TIME__, "INFO", MESSAGE);
break;
case TYPE_WARNING:
fprintf(fLog, "%s %s %s: %s \n",__DATE__, __TIME__, "WARINNG", MESSAGE);
//send warning to external app
break;
case TYPE_ERROR:
fprintf(fLog, "%s %s %s: %s \n",__DATE__, __TIME__, "ERROR", MESSAGE);
//send raport to app provider
break;
default:
break;
}
}
}
main.c
int main(int argc, char **argv)
{
fLog = fopen(LOG_FILENAME, "w");
APLOG(fLog, TYPE_INFO, "APP HAS BEEN RUNNING. LOGGING STARTED" );
while()
{
//endless while here. If any part of the code does not work, exit the while and report the problem. More APLOG here.
}
APLOG(fLog, TYPE_ERROR, "OUT OF WORK. BACK TO EMERGENCY.");
return 0;
}
【问题讨论】:
-
您知道基于
FILE *的IO 被缓冲了吗?你试过fflush()吗? -
__DATE__, __TIME__这将在日志文件的每一行打印文件编译的相同日期和时间。您想获取 current 日期和时间,不是吗?Shouldn'tfLog = fopen(LOG_FILENAME, "w"); be inside the APLOG(...) function?你想要它在那里吗?答案取决于你希望你的函数具有什么语义。 -
"
fLog = fopen(LOG_FILENAME, "w");不应该在APLOG(...)函数中吗?"不,因为该文件会随着每条记录的消息而被销毁和重写。如果在函数内,文件应该以"a"模式打开。