【发布时间】:2021-05-20 18:42:17
【问题描述】:
我只想设置一个 Boost Log V2 接收器 (Boost 1.75.0) 以从生成应用程序的日志记录中过滤掉几行。 目标是拥有一个仅包含这些行的日志文件(例如:登录的用户),而另一个接收器注销每条记录
我已尝试在配置文件中配置接收器的过滤器属性以匹配标记存在,如下所示:
[Sinks.FileSink]
Destination=TextFile
Filter="%USER%"
FileName="log.log"
MaxSize=10000000
Format="[%TimeStamp%] - %Message%"
Asynchronous=false
AutoFlush=true
%USER% 标记将是过滤条件,如果存在,则记录该行,否则不...
我尝试添加为 value 属性:
... << boost::log::add_value("USER", true) << "message..."
并在文件记录器之前注册它:
boost::log::core::get()->add_global_attribute("USER", boost::log::attributes::mutable_constant(true));
boost::log::init_from_stream(config);
它们都不起作用
对我来说,奇怪的行为是,如果我过滤严重性,过滤模式就会起作用,就像这样:Filter="%Severity%"
谁能帮我从应用程序中只过滤几行并将它们转发到文件中?
谢谢
更新:
想要展示我想要实现的目标的最小示例:
#include <boost/log/utility/setup/from_stream.hpp>
#include <boost/log/attributes/mutable_constant.hpp>
int main(int argc, char *argv_char[]) {
std::stringstream config;
config << R"([Core])" << std::endl;
config << R"(DisableLogging=false)" << std::endl;
config << R"(Filter="%Severity% >= trace")" << std::endl;
config << R"([Sinks.Sink])" << std::endl;
config << R"(Destination=Console)" << std::endl;
//config << R"(Filter="%CMD% = \"YES\"")" << std::endl;
config << R"(Filter="%CMD% = \"NO\"")" << std::endl;
config << R"(FileName="commands.log")" << std::endl;
config << R"(Format="%Message%")" << std::endl;
config << R"(Asynchronous=false)" << std::endl;
config << R"(AutoFlush=true)" << std::endl;
boost::log::core::get()->add_global_attribute("CMD", boost::log::attributes::mutable_constant<std::string>("NO"));
boost::log::init_from_stream(config);
BOOST_LOG_TRIVIAL(debug) << "Non-visible message";
BOOST_LOG_TRIVIAL(debug) << boost::log::add_value("CMD", "YES") << "Visible message";
return 0;
}
如果我将过滤条件替换为 %CMD% = "YES",则输出中缺少所需的日志行
更新 2:
// Codes above didn't changed
boost::log::init_from_stream(config);
boost::log::sources::logger logger;
logger.add_attribute("CMD", boost::log::attributes::constant<std::string>("YES"));
BOOST_LOG(logger) << "A log message from logger";
boost::log::sources::logger loggerScoped;
BOOST_LOG_SCOPED_LOGGER_ATTR(loggerScoped, "CMD", boost::log::attributes::constant<std::string>("YES"));
BOOST_LOG(loggerScoped) << "A log message from loggerScoped";
BOOST_LOG_TRIVIAL(debug) << "Non-visible message";
BOOST_LOG_TRIVIAL(debug) << boost::log::add_value("CMD", "YES") << "Visible message";
return 0;
【问题讨论】:
-
顾名思义,
add_global_attribute添加了一个全局属性,因此除非您将其删除,否则它始终存在。add_value操纵器还添加了一个属性,但这是一个特定于记录器的属性,并且在过滤完成后。它复制了全局属性,因此没有效果。如果没有全局属性,则为 would not have worked for filtering。 -
至于为什么过滤器不能使用全局属性,我不知道。请展示一段重现问题的最小可编译代码。
-
嗨@AndreySemashev,我已经更新了我的帖子,并添加了一个最小示例。谢谢