2016-12-14 7 views
1

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

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

私はメッセージが重要度と出力することの二重のチェックを避ける代わりに、直接のBOOST_LOG_TRIVIALマクロを使用するために出力されることを知っているいくつかの方法があるかもしれ?

答えて

1

このようには機能しません。あなたは後押しするフィルタ機能を提供する必要がある::ログイン::ドキュメントごとのように些細:

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に渡すのがロガーの仕事です。

あなた自身の変数でロギングレベルを追跡する必要があります。片方向です:

#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; 
} 
+0

これは質問に答えません。重大度に応じて条件付きで任意のコードを実行するには何らかの方法が必要です。 – bobeff

+0

答えが肉薄します。残念ながらあなたは間違っていると思います。 –

+0

@bobeffの回答は、独自のログレベルを追跡する方法の例で更新されました。 –

関連する問題