boost::log を使用して、loadtest アプリケーションのログを別のファイルとコンソールに記録したいと考えています。各ワークスレッド (テスト対象のサーバーに接続されている 1 人のユーザーを表す) は、スレッド ログを記録し、失敗した呼び出しを失敗した呼び出しログに記録します。フィルターを使用してそれを達成しようとしています。
目標は次のとおりです。
=> All logs with severity = lower than "INFO" will be discarded
=> All log records having the attribute "global" go to ./logs/loadtest.log AND to console
=> All log records having the attribute "thread" go to ./logs/thread.log AND to console
=> All log records having the attribute "faileCalls" go to ./logs/failedCalls.log AND to console
これは私の初期化コードです:
void initLogging()
{
boost::shared_ptr<boost::log::core::basic_core> core = boost::log::core::get();
// Construct the sinks for our global log file and for console
typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::text_ostream_backend> text_sink;
// global log file
boost::shared_ptr<text_sink> sinkLoadtest = boost::make_shared<text_sink>();
sinkLoadtest->locked_backend()->add_stream(boost::make_shared<std::ofstream>("./logs/loadtest.log", std::ios::app));
sinkLoadtest->locked_backend()->auto_flush(true);
sinkLoadtest->set_filter(boost::log::filters::has_attr("global"));
core->add_sink(sinkLoadtest);
// console
boost::shared_ptr<text_sink> sinkConsole = boost::make_shared<text_sink>();
boost::shared_ptr<std::ostream> stream(&std::clog, boost::log::empty_deleter());
sinkConsole->locked_backend()->add_stream(stream);
sinkConsole->locked_backend()->auto_flush(true);
core->add_sink(sinkConsole);
// thread dependent logging (one file per workthread)
sinkThread = boost::make_shared<text_sink>();
sinkFailedCalls = boost::make_shared<text_sink>();
sinkThread->locked_backend()->add_stream(boost::make_shared<std::ofstream>("./logs/thread.log"), std::ios::app));
sinkFailedCalls->locked_backend()->add_stream(boost::make_shared<std::ofstream>("./logs/failedCalls.log", std::ios::app));
sinkThread->set_filter(boost::log::filters::has_attr("thread"));
sinkFailedCalls->set_filter(boost::log::filters::has_attr("failedCalls"));
core->add_sink(sinkThread);
core->add_sink(sinkFailedCalls);
// set global severity level
core->set_filter(boost::log::filters::attr<boost::log::trivial::severity_level>("Severity") >= boost::log::trivial::info);
}
これらは私の質問です: 重大度レベルに加えてカスタム フィルター属性の 1 つを渡すことができるようにするには、どのマクロを使用すればよいですか?
ロガーを取得する最良の方法は何ですか? 常にコアから取得するか、メンバー変数「ロガー」を持っていますか? スレッドセーフにする必要があります。
よろしくお願いいたします。
ベストジャン
// 編集: そのようなマクロがストリーミング演算子を使用することを提案するなら、それは素晴らしいことです