【问题标题】:c++ boost log positional(indexed) format alignmentc++ boost log positional(indexed) 格式对齐
【发布时间】:2017-01-25 14:59:29
【问题描述】:

我正在尝试格式化 boost 日志输出,以便出于输出日志对齐的原因,选择的字段将始终具有特定宽度。

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
    );

我尝试了不同的格式,例如

  • “[%1%] [%2%] [%3%] [%|20t|%4%] %5%”
  • “[%1%] [%2%] [%3%] [%-20s] %5%”
  • 琐碎的::严重性

我的许多尝试都抛出了以下错误:

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

【问题讨论】:

    标签: c++ boost boost-log


    【解决方案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
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多