gpt4 book ai didi

编写日志写入函数(包装 vfprintf): how to modify the text string to print?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:53 26 4
gpt4 key购买 nike

我正在编写一个日志编写器,为此我正在 vfprintf 上编写一个包装函数,这样我就可以在它周围包含一些额外的信息。

日志写入宏定义如下:

#define LOG_WRITE(type, fmt, args...)   write_log(type, __FILE__, __FUNCTION__, __LINE__, fmt, ## args)

我的函数定义如下:

int write_log(enum LogType_e type, const char* file, const char* function, int line, const char* format, ...) {

va_list arg;
int rv;

va_start(arg, format);
rv = vfprintf(log_fd, format, arg);
va_end(arg);

return rv;
}

该函数获取一些额外信息,例如日志级别、运行日志调用的文件、函数、代码行,最后是文本。

当然,我想检查该信息并将其格式化并添加到“格式”中。我该怎么做?

最佳答案

最简单的解决方案可能不是摆弄格式字符串,而是添加对 fprintf(log_fd, ...) 的进一步调用:

void write_log(enum LogType_e type, const char* file, const char* function, int line, const char* format, ...) {

va_list arg;
int rv;

switch (type) {
case TYPE_ERROR:
fprintf(log_fd, "Error: ");
break;
case TYPE_WARN:
fprintf(log_fd, "Warning: ");
break;
}

if (file) {
if (function) {
fprintf(log_fd, "[%s in %s, %d] ", function, file, line);
} else {
fprintf(log_fd, "[%s, %d] ", file, line);
}
}

va_start(arg, format);
rv = vfprintf(log_fd, format, arg);
va_end(arg);
}

这使得跟踪打印的字符数变得更加困难,但无论如何您都不会使用该信息,因此计算和返回它没有意义。

(您也可以记录到一个临时字符串,然后在需要自动换行时漂亮地打印它。但这意味着您必须再次跟踪整个字符串长度。)

关于编写日志写入函数(包装 vfprintf): how to modify the text string to print?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22685895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com