わかりました、おそらく私はあなたがここで探しているところに正確さを得ることができませんでしたが、ショットを取り、答えを燃やすことをいとわないです。以下は、入手できる限り基本的なロガーですが、メッセージビルドを一元化する方法を示しています。下部にはいくつかのテスト条件が含まれています。デバッガーをウォークスルーしてサイズ変更をインタラクティブに確認できるように、意図的に初期バッファーサイズを小さくしました。あなたは間違いなくそれをサイズアップしたいと思うでしょう。
とにかく、運が良ければ質問を正しく理解できれば、それがあなたの問題に直接対処しないのであれば、少なくともいくつかのアイデアが得られることを願っています。ありがとう。
編集: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;
}