varargs に何らかの値 (char*) が含まれているかどうかを確認するための単純な API (ループなし) はありますか?
単純な API がない場合、引数をカウントせずにどのように反復する必要がありますか?
私の方法では、構成 IP でログベースをフィルタリングできるはずなので、引数の 1 つが 10.3.2.2 (構成 IP) であるかどうかを確認する必要があります。
void Logger::Log(const char *format, ...) {
lock_guard<mutex> guard(mtx_);
if (!file_) {
file_ = fopen("application.log", "w");
}
time_t current = time(0);
tm *ptm = localtime(¤t);
stringstream ss;
ss << "\n[" << ptm->tm_min << ":" << ptm->tm_sec << "]";
fprintf(file_, ss.str().data());
va_list argptr;
va_start(argptr, format);
vfprintf(file_, format, argptr);
va_end(argptr);
fflush(file_);
}
このレッスンを見て、指定された引数の長さと型で反復するだけを示します。形式とチェック内容よりもコストがかかるため、ロガーは高度なパフォーマンスの要求に対応できる必要があります。
私の目標は、単純なロガー メソッドを実装することです。したがって、次のように呼び出します。
Log("trafic from ip %s to ip %s", "10.1.1.1","1.1.1.1")
と他の多くの呼び出し。フィルターで、パラメーター値の1つが「10.1.1.1」(たとえば)であるかどうかを確認したいので、ログに記録しないでください。