如何将stderr重定向到C中的.txt文件



我有一个函数,可以将一些日志信息打印到终端,但我也在尝试将其捕获到日志文件中。我不是C专家,正在努力获得一些练习!

以下是我尝试的

static void logging(const char *format, ...) {
va_list args;
//FILE *file_ptr;
char log_file[] = "logs/TEST-LOG-001.txt";
if (freopen(log_file, "w", stderr) == NULL) {
printf("<---ERROR LOGGING TO FILES--->");
}   
else {
fprintf(stderr, "LOG: ");
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
fprintf(stderr, "n");
fclose(stderr);
}   
}

重定向到文件的正确方式是什么。我成功地做了一件更简单的事情,我可以将stdout重定向到一个文本文件,只需使用一个硬编码的字符串数组和我想重定向到文本文件的硬编码索引量,类似于这里看到的。

除了重定向stderr之外,我应该如何为测试日志文件分配一个唯一的ID(比如时间戳(?

我的程序的总体目的是使用一些libav库将视频解码为一系列图像。返回到stdout的是传入的视频文件的总体信息(持续时间、格式、分辨率等(,每帧都有相应的信息(帧数、大小、类型(。我基本上想向stdout和日志文件显示日志记录信息。

下面是我显示的数据的一个例子:

LOG: AVPacket->pts 0
LOG: AVPacket->pts 1024
LOG: AVPacket->pts 512
LOG: Frame 1 (type=I, size=100339 bytes, format=0) pts 0 key_frame 1 [DTS 0]
LOG: AVPacket->pts 256
LOG: Frame 2 (type=B, size=7484 bytes, format=0) pts 256 key_frame 0 [DTS 3]
LOG: AVPacket->pts 768

将错误日志写入stderr,将正常日志写入stdout,并通过以下方式将日志消息重定向到专用文件:

# write error message to `err.txt`, normal log to `info.txt`
./a.out 2>err.txt 1>info.txt

BTW:不建议重写已有的*print*函数。使用预处理器宏,以防您想添加更多信息,如标签:

#define LOG_ERR(fmt, ...)   fprintf(stderr, fmt, ##__VA_ARGS__)
#define LOG_INFO(fmt, ...)  fprintf(stdout, fmt, ##__VA_ARGS__)
// usage
LOG_ERR("[E] Something wrong!n");
LOG_INFO("[I] Frame %d(type %c) ...n", frame_number, frame_type);

您可以通过以下方式向stderr和日志文件输出错误消息:

#include <stdarg.h>
#include <stdio.h>
static FILE *logfp;
// the log file should be opened at initialization time with
// logfp = fopen("logs/TEST-LOG-001.txt", "a");
static void logging(const char *format, ...) {
va_list args, args2;
va_start(args, format);
if (logfp) {
va_copy(args2, args);
vfprintf(logfp, format, args2);
// uncomment if the format strings do not include a newline
//fprintf(logfp, "n");
va_end(args2);
}
fprintf(stderr, "LOG: ");
vfprintf(stderr, format, args);
// uncomment if the format strings do not include a newline
//fprintf(stderr, "n");
va_end(args);
}

最新更新