如何使用时间戳和严重性字符串?

How to use timestamp and use string of severity?

  1. 我使用了成功的接收器格式化的官方代码
    sink.set_formatter    (
        expr::stream
        << "[ "
        << expr::format_date_time<boost::posix_time::ptime>("TimeStamp","%H:%M:%S.%f")
        << " - " << severity << " ] "
        << expr::smessage
    )

但输出是 [%time% - 1 ] %message%。 而 severity 只是输出为 int

但我想要 [%time% - debug ] %message% 的结果。

我用 severity_logger_mt<SeverityLevel>Severity 只是一个枚举


  1. 我尝试通过提供 sink::set_formatter 函数来自己转换 Severity,编译后的错误和输出如代码所示:
void coloring_formatter(const boost::log::record_view& record,
                            boost::log::formatting_ostream& stream)
{

  stream << "["
    /* !!! ERROR !!! with no acceptable convertor for <<   */
    << record[timestamp]    

   /*!!! compile ERROR !!! no matching function call for format_date_time */
   << expr::format_date_time<
                    boost::posix_time::ptime>(timestamp, "%Y-%m-%d %H:%M:%S")

   /*!!! complied done but with no time stamp output !!!  */
<< boost::log::expressions::format_date_time<
                    boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S")
             << " - " << type << "] "
             << record[boost::log::expressions::smessage];
    }

谁能帮我

  1. 对"timestamp"输出sink::set_formatter

  2. 的函数
  3. Severity 的输出字符串而不是 int

  1. 您提供的代码不完整。在格式化程序表达式中,severity 必须是 attribute keyword 才能从日志记录中提取严重性级别。目前尚不清楚你的情况是什么,我怀疑它可能是一个常量,无论附加到日志记录的实际严重性级别如何,它都会输出到流中。

  2. coloring_formatter 函数不正确,因为它试图将 格式化程序 lambda 表达式expr::format_date_time 一样用于实际流。

你必须了解 lambda 表达式 a.k.a 之间的区别。 惰性表达式(构造一个稍后调用的函数;当使用流调用该函数时,它将执行格式化)和一个实际的流式表达式,它在正在执行的流。 expr::format_date_timeboost::log::expressions 命名空间中的其他组件用于为过滤器和格式化程序编写 lambda 表达式。它们不能用于实际的流输出表达式。

当你调用sink.set_formatter时,你必须提供一个函数,它会在调用时执行日志记录格式化。有多种方式来描述该功能。一种方法是使用 lambda 表达式,就像您的案例 #1 一样,以 expr::streamexpr::format 开头。另一种方法是从头开始编写函数,就像您的案例 #2 一样,但在该函数中您不能再使用 lambda 表达式。

您可以查看 Boost.Log 示例(例如,here, here or here)以了解如何格式化 date/time 和严重级别。关于这些示例需要注意的重要部分:

  • 严重级别类型有一个operator<<,它执行从枚举到字符串的转换。此运算符必须与枚举位于同一命名空间,否则编译器将找不到它并将枚举输出为整数。
  • 严重级别枚举必须在记录器类型中用作其模板参数。这样您将确保日志记录具有枚举类型的严重性级别。
  • 严重级别枚举必须在格式化程序中使用,您可以在其中指定严重级别。当你使用expr::attr时,它必须在模板参数中,当你使用关键字时,它必须是带有BOOST_LOG_ATTRIBUTE_KEYWORD的关键字定义的一部分。这将确保格式化程序能够在调用格式化程序时从日志记录中提取您的枚举。
  • 格式化 date/time 时,expr::format_date_time 只能在 lambda 表达式中使用。当您从头开始编写格式化函数时,您必须使用 Boost.DateTime or functions like strftime 来格式化时间戳。