私たちは、元のログ記録を維持しながら、ログメッセージを別の形式(JSONやMQTT)へ再処理できるよう、ログにコールバックsinkを追加する必要がありました。C++標準を隅々まで知らなかったため、小さな落とし穴に気付きました。sinkを追加するときは、ロガーの sinks() へアクセスする方法に注意してください。次の方法では動作しません。
auto sinks = log_->sinks();
sinks.push_back(std::make_shared<spdlog::sinks::callback_sink<std::mutex> >([this](const spdlog::details::log_msg& msg) {this->LogCallback(msg);}));"auto sinks = ..." はsinkのvectorのコピーを取得するため、ロガー内のsinkのvectorを変更していません。C++コンパイラーは、実際にはC++標準どおりに動作しています。"auto var = xyz" は参照を返すものではなく、右辺オブジェクトのコピーコンストラクターを呼び出します。
auto&、または common.h で定義されている元のsink_ptr型を使う必要があります。ただし、vectorへの参照でなければなりません。
auto& sinks = log_->sinks();
sinks.push_back( .....etcこの説明が、ほかの方の1時間の悩みを省ければ幸いです。
詳細は#3014を参照してください。
©gabime 2023-2024 spdlog. All Rights Reserved.