2016-12-02 24 views
1

例えば、私のログメッセージは、4つのレベル(または属性)を持っている:boost :: logによって異なる属性を持つ異なるログに印刷するにはどうすればいいですか?

"error","warning","exception","action". 

私はその属性fatal.logに「エラー」または「例外」であるメッセージ、およびその属性「アクション」である印刷メッセージを印刷したいです「警告」をregular.logに設定します。オンラインで検索することで :

boost::shared_ptr<sinks::text_multifile_backend> backend = boost::make_shared<sinks::text_multifile_backend>(); 
backend->set_file_name_composer 
(
    sinks::file::as_file_name_composer(boost::log::expressions::stream << boost::log::expressions::attr<std::string>("level") << ".log") 
); 

typedef sinks::synchronous_sink<sinks::text_multifile_backend> sink_t; 
boost::shared_ptr<sink_t> sink(new sink_t(backend)); 

// Set the formatter 
sink->set_formatter 
    (
    boost::log::expressions::stream 
    << boost::log::expressions::attr<std::string>("level") 
    << boost::log::expressions::smessage 
    ); 

私がレベル(属性)によって異なるログ・ファイルを生成し、別のログに異なるメッセージを印刷する

BOOST_LOG_SEV(_logger, level) << message; 

を使用することができそうです。しかし、これは4つのレベル(属性)を持っているので、2つのログだけでなく、4つのログを生成するようです。 1つのログに属性を含むメッセージを印刷し、他の属性を持つメッセージを別のログに出力する方法は?

+0

あなたはおそらくあなたのファイルシンクの上にフィルタを設定することによって、これを解決することができ、1は属性が等しくフィルタリングだろう「エラー」または "へ例外 "と他の"アクション "と"警告 " –

答えて

0

boost documentationからいくつかのコードを借りて、あなたはおそらく、このアプローチで逃げることができます:

using text_sink = sinks::synchronous_sink<sinks::text_ostream_backend>; 
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>(); 

    sink->locked_backend()->add_stream(
     boost::make_shared<std::ofstream>("regular.log")); 

    // set your 1st formatter 

    sink->set_filter(expr::has_attr(tag_attr) && (tag_attr == "action" || tag_attr == "warning")); 

    logging::core::get()->add_sink(sink); 

    sink = boost::make_shared<text_sink>(); 

    sink->locked_backend()->add_stream(
     boost::make_shared<std::ofstream>("fatal.log")); 

    // set your 2nd formatter 

    sink->set_filter(expr::has_attr(tag_attr) && (tag_attr == "error" || tag_attr == "exception")); 

    logging::core::get()->add_sink(sink); 
+0

boost :: make_shared からconst boost :: make_shared への適切なユーザー定義の変換を示していませんところで、日付に基づいてファイル名を生成したいのであれば、シンク→locked_backend()→add_stream( boost :: make_shared ( "Regular_%Y-%m-% d_%H-%M-%S.-log "") );; – firstaccount

+0

あなたはどのラインで失敗するのか教えてください。他の質問については、私はドキュメントを読むことをお勧めします –

+0

シンク→locked_backend()→add_stream( boost :: make_shared ( "regular.log"))で失敗します。 – firstaccount

関連する問題