2013-08-02 3 views
10

私はブースト1.54.0を使用しています。 以下に私の問題を示す最小の例があります。ブーストログseverity_logger init_from_stream

boostlogのseverity_loggerを使用します。 ストリームからシンクを設定したいと思います。 (以下の例では私はストリングストリームを使用しています。 私の実際のアプリケーションではストリームはファイルから来ます) %Severity%を出力またはフィルタリングのために使用します。

私の問題は次のとおりです。%重大度%が空です。

%LineID%と%Message%は期待どおりに埋められます。 出力された行に指定されたシンクを設定すると、期待どおりに動作します。

アイデア?

#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/utility/setup/from_stream.hpp> 
#include <boost/log/utility/setup/console.hpp> 
#include <boost/log/expressions.hpp> 

enum SeverityLevel { trace, fatal }; 

int main (int argc, char *argv[]) 
{ 
    boost::log::add_common_attributes(); 
    /* 
    struct severity_tag; 
    boost::log::add_console_log(std::clog, 
     boost::log::keywords::format = (
      boost::log::expressions::stream 
       << boost::log::expressions::attr< unsigned int >("LineID") 
       << ": <" << boost::log::expressions::attr<SeverityLevel, severity_tag >("Severity") 
       << "> " << boost::log::expressions::smessage) 
    ); */ 

    std::stringstream s; 
    s << "[Sinks.MySink]" << std::endl; 
    s << "Destination=Console" << std::endl; 
    s << "Format=\"%LineID%: <%Severity%> - %Message%\"" << std::endl; 
    boost::log::init_from_stream(s); 

    boost::log::sources::severity_logger<SeverityLevel> lg; 
    BOOST_LOG_SEV(lg, trace) << "This is a trace message"; 
    BOOST_LOG_SEV(lg, fatal) << "This is a fatal message"; 
    return 0; 
} 
+0

それはappeatうブーストログに実際に 'Sinks.MySink'を使用するよう指示する必要があります。悲しいことに、私はブーストログ設定 – sehe

+0

の経験がありませんそれは問題ではありません。それはMySinkを使用しています。私が提供するフォーマットは、必要に応じて使用されます。 %Severity%は空の文字列に置き換えられます。列挙型の値の数にする必要があります。それは、シンク構成のアウトカムな方法でうまく動作します。 – SebastianK

答えて

10

あなたは正しいです。これは既知のバグであり、現在の開発バージョンで修正されています。ここで

バグレポート:https://svn.boost.org/trac/boost/ticket/8840

ここにリンク上でこの答えはあまり依存にするために、それがレポート内で解決された方法です。あなたには、あなたの重大度属性を登録する必要があり

設定ファイルを解析する前にhereを参照してください。重大度に基づいてレコードをフィルタリングする場合は、フォーマッタとフィルタパーサーの両方に属性を登録する必要があります。

OK、これは機能していますが、私は、ストリーム入力/抽出機能を追加する必要がありましたし、私は設定ファイルから設定をロードする前に次の2行を追加する必要がありました:

logging::register_simple_formatter_factory<ESeverityLevel, char>("Severity"); 
logging::register_simple_filter_factory<ESeverityLevel, char>("Severity"); 
+2

あなたは男です。私が設定ミスをしたと信じたので、私はあなたのポストにつまずくまで2日かかりました... – quaylar

+2

数年後...ブーストはバージョン1.62で、私は過去2日間同じ問題を抱えていました。この回答により、私は "Severity"を働かせることができました。 – Rado

関連する問題