2017-01-25 4 views
1

ブーストログの出力をフォーマットして、選択したフィールドが出力ログの整列のために常に特定の幅になるようにしようとしています。C++ブーストログの位置指定(インデックス付き)フォーマットのアラインメント

add_file_log(
     keywords::file_name = s.str(), 
     keywords::rotation_size = log_info.log_file_size, 
     keywords::max_size = log_info.log_file_amount * log_info.log_file_size, 
     keywords::target = log_info.log_path, 
     keywords::open_mode = std::ios::out | std::ios::app, 
     keywords::auto_flush = true, 
     keywords::format = 
     expressions::format("[%1%] [%2%] [%3%] [%4%] %5%") 
     % expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f") 
     % expressions::attr<unsigned int>("ThreadID") 
     % expressions::attr<string>("Scope") 
     % trivial::severity 
     % expressions::smessage 
    ); 

Iは "[%1%] [%2%] [%3%] [%| 20トン|%4%]%、5%" は、

  • として異なるフォーマットを試みました
  • "[%1%] [%2%] [%3%] [%-20s]%、5%"
  • 些細::重症度< <のstd :: setw(20)

私の試みの多くは、次のエラーを投げた:

> Caught Exception in cyacollector main. Error: Unsupported format 
> placeholder 

答えて

1

現在、Boost.Logでexpressions::format%N%の形でのみ位置のプレースホルダをサポートしています。この形式では、幅や精度などの追加パラメータは使用できません。ほとんどの場合、このフォーマッタは既にフォーマットされた文字列をフォーマットテンプレートに挿入するため、この時点でほとんどのパラメータを適用できないためです。

ただし、引数をformatに変更することで、目的を達成できます。 max_size_decorデコレータとstd::setwマニピュレータの組み合わせを使用して、ログ出力の各列の固定幅の効果を得ることができます。

add_file_log(
    ..., 
    keywords::format = 
    expressions::format("[%1%] [%2%] [%3%] [%4%] %5%") 
     % expressions::max_size_decor<char>(30)[ expressions::stream << std::setw(30) << expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f") ] 
     % expressions::max_size_decor<char>(10)[ expressions::stream << std::setw(10) << expressions::attr<unsigned int>("ThreadID") ] 
     % expressions::max_size_decor<char>(20)[ expressions::stream << std::setw(20) << expressions::attr<string>("Scope") ] 
     % expressions::max_size_decor<char>(5)[ expressions::stream << std::setw(5) << trivial::severity ] 
     % expressions::smessage 
); 
関連する問題