我正在寻找为我的日志记录实现类似printf的api。它应该类似于调用printf。 例如:
persistent_log(LogType0, "This is buffered writing %d", i);
我查看了变量参数的内容,但似乎我需要知道数字&那里的论据类型。所以我在这方面需要更多的帮助。
答案 0 :(得分:24)
这是我发现的一个过去项目的摘录,我发现它对我很有用。当然缺少一些初始化步骤。这里的关键是vfprintf
函数,它将处理打印各种参数的细节。
void _proxy_log(log_level_t level, const char *fmt, ...)
__attribute__((format (printf, 2, 3)));
#define proxy_log(level, fmt, ...) _proxy_log(level, fmt"\n", ##__VA_ARGS__)
void _proxy_log(log_level_t level, const char *fmt, ...) {
va_list arg;
FILE *log_file = (level == LOG_ERROR) ? err_log : info_log;
/* Check if the message should be logged */
if (level > log_level)
return;
/* Write the error message */
va_start(arg, fmt);
vfprintf(log_file, fmt, arg);
va_end(arg);
#ifdef DEBUG
fflush(log_file);
fsync(fileno(log_file));
#endif
}
答案 1 :(得分:4)
答案 2 :(得分:0)
这是一个老问题,但这里是我的简化基本解决方案,它完全模仿 printf 并且应该可以扩展到其他更具体的用途,它基本上是 Michael Mior 答案的通用版本:
#include <stdarg.h>
void print(const char* fmt, ...)
{
va_list arg;
va_start(arg, fmt);
vprintf(fmt, arg);
//vprintf can be replaced with vsprintf (for sprintf behavior)
//or any other printf function preceded by a v
va_end(arg);
}
(这似乎也适用于 C++,只是没有库)