3

boost::logライブラリの単純なログを使用しており、現在設定されているロガーの重大度に応じていくつかのコードを実行したいと考えています。これは、ログ メッセージが出力される場合にのみ、ログ メッセージの構築に必要です。しかし、重大度を照会する正しい方法が見つかりません。コードは次のようにする必要があります。

if (boost::log::trivial::severity <=
    boost::log::trivial::severity_level::trace)
{
  // construct log message
  BOOST_LOG_TRIVIAL(trace) << message;
}

さらに、メッセージが出力されることがわかっている場合、重大度の二重チェックを回避し、BOOST_LOG_TRIVIALマクロを使用する代わりに直接出力する方法があるでしょうか?

4

2 に答える 2

3

そのようには機能しません。ドキュメントに従って、boost::log::trivial にフィルター関数を提供する必要があります。

http://www.boost.org/doc/libs/1_61_0/libs/log/doc/html/log/tutorial/trivial_filtering.html

void init()
{
    logging::core::get()->set_filter
    (
        // here they've used a constant but you could use a global or
        // a function
        logging::trivial::severity >= logging::trivial::info
    );
}

int main(int, char*[])
{
    init();

    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";

    return 0;
}

渡されたオブジェクトlogging::core::set_filterの型はboost::log::filter

次のように簡単に書くことができます。

auto filt = logging::filter(logging::trivial::severity >= logging::trivial::info);
logging::core::get()->set_filter(filt);

filt送信された属性を検査し、それらの属性に対するすべてのテストが を返すかどうかを返す軽量の関数オブジェクトですtrue。この場合、テストは 1 つだけlogging::trivial::severity >= logging::trivial::infoです。

boost::log::core属性セットを構築し、何かを発行したいときにそれを渡すのは、ロガーの仕事です。

要するに、独自の変数でログ レベルを追跡する必要があるということです。1 つの方法を次に示します。

#include <iostream>
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>

namespace logging = boost::log;


int main(int, char*[])
{
    // track your own variable here
    logging::trivial::severity_level my_log_level = logging::trivial::trace;

    // with this filter
    auto filt = logging::filter(logging::trivial::severity >= my_log_level);
    logging::core::get()->set_filter(filt);

    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";

    // now you have control
    if (my_log_level <= logging::trivial::trace)
    {
        std::cout << "tracing\n";
    }


    return 0;
}
于 2016-12-14T13:55:36.173 に答える