如何使用时间戳和严重性字符串?
How to use timestamp and use string of severity?
- 我使用了成功的接收器格式化的官方代码
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
只是一个枚举
- 我尝试通过提供 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];
}
谁能帮我
对"timestamp"输出sink::set_formatter
的函数
Severity
的输出字符串而不是 int
您提供的代码不完整。在格式化程序表达式中,severity
必须是 attribute keyword 才能从日志记录中提取严重性级别。目前尚不清楚你的情况是什么,我怀疑它可能是一个常量,无论附加到日志记录的实际严重性级别如何,它都会输出到流中。
coloring_formatter
函数不正确,因为它试图将 格式化程序 lambda 表达式 像 expr::format_date_time
一样用于实际流。
你必须了解 lambda 表达式 a.k.a 之间的区别。 惰性表达式(构造一个稍后调用的函数;当使用流调用该函数时,它将执行格式化)和一个实际的流式表达式,它在正在执行的流。 expr::format_date_time
和 boost::log::expressions
命名空间中的其他组件用于为过滤器和格式化程序编写 lambda 表达式。它们不能用于实际的流输出表达式。
当你调用sink.set_formatter
时,你必须提供一个函数,它会在调用时执行日志记录格式化。有多种方式来描述该功能。一种方法是使用 lambda 表达式,就像您的案例 #1 一样,以 expr::stream
或 expr::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
来格式化时间戳。
- 我使用了成功的接收器格式化的官方代码
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
只是一个枚举
- 我尝试通过提供 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];
}
谁能帮我
对"timestamp"输出
sink::set_formatter
的函数
Severity
的输出字符串而不是int
您提供的代码不完整。在格式化程序表达式中,
severity
必须是 attribute keyword 才能从日志记录中提取严重性级别。目前尚不清楚你的情况是什么,我怀疑它可能是一个常量,无论附加到日志记录的实际严重性级别如何,它都会输出到流中。coloring_formatter
函数不正确,因为它试图将 格式化程序 lambda 表达式 像expr::format_date_time
一样用于实际流。
你必须了解 lambda 表达式 a.k.a 之间的区别。 惰性表达式(构造一个稍后调用的函数;当使用流调用该函数时,它将执行格式化)和一个实际的流式表达式,它在正在执行的流。 expr::format_date_time
和 boost::log::expressions
命名空间中的其他组件用于为过滤器和格式化程序编写 lambda 表达式。它们不能用于实际的流输出表达式。
当你调用sink.set_formatter
时,你必须提供一个函数,它会在调用时执行日志记录格式化。有多种方式来描述该功能。一种方法是使用 lambda 表达式,就像您的案例 #1 一样,以 expr::stream
或 expr::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 likestrftime
来格式化时间戳。