好的,很可能我没有在这里找到您要寻找的地方,但愿意试一试并刻录答案。以下是尽可能基本的记录器,但演示了如何集中消息构建。底部包含一些测试条件,我特意缩小了初始缓冲区大小,以便您在调试器中浏览并以交互方式查看调整大小。毫无疑问,您会想放大它的大小。
无论如何,如果我碰巧碰巧并正确理解了这个问题,我希望如果它不能直接解决您的问题,您至少会得到一些想法。谢谢。
编辑: OP 要求使用 std::string 和缓冲区调整大小进行压制,以符合其嵌入式系统环境的有限编译能力。因此,使用了固定长度的缓冲区,并且vsnprintf()
仅在内容实际适合时才信任来自的输出。
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
class Logger
{
static const size_t STRSIZE = 256;
public:
void error(const char* fmt, ...)
{
va_list argptr;
va_start(argptr,fmt);
log("ERROR", fmt, argptr);
};
// two different logging interfaces.
void info(const char* fmt, ...)
{
va_list argptr;
va_start(argptr,fmt);
log("INFO", fmt, argptr);
};
void debug(const char* fmt, ...)
{
va_list argptr;
va_start(argptr,fmt);
log("DEBUG", fmt, argptr);
};
private:
void log(const char *msg, const char* fmt, va_list& vl)
{
// uses a fixed size message buffer
char str[STRSIZE+1] = {0};
strncpy(str, msg, sizeof(str)-1);
strncat(str, ": ", (sizeof(str)-1) - strlen(str));
// needed for sizing limits of variadic printf, then send
// output as a single line message to stderr.
size_t mlen = strlen(str);
if (vsnprintf(str + mlen, sizeof(str)-mlen-1, fmt, vl) >= 0)
fprintf(stderr, "%s\n", str);
else
fprintf(stderr, "%s: (max log message length exceeded)\n", msg);
};
};
int main(int argc, char *argv[])
{
Logger logger;
logger.debug("Numbers %d %d %d", 1,2,3);
logger.error("Strings %s %s %s", "1", "2", "3");
logger.info("Mixed %s %d %p", "1", 2, "3");
logger.info("No additional parameters required for this message.");
// demonstrate automatic cutoff.
char sbig[] = "0123456789012345678901234567890123456789"
"0123456789012345678901234567890123456789";
logger.debug("Oversized params: %d-%s %d-%s %d-%s %d-%s",
1, sbig, 2, sbig, 3, sbig, 4, sbig);
return 0;
}