为Boost.Log设置自定义格式和筛选器:什么都没发生



我在配置Boost.Log时遇到问题。我希望使用一个全局记录器将严重性为debug或更高的所有消息打印到std::cout。消息的格式是一个简单的"foobar: "前缀。

我期望打印的内容:foobar: foobar

打印的内容:什么都没有。

样本代码:

main.c:

#include "logger.hh"
int main() {
init_logger();
using namespace boost::log::trivial;
BOOST_LOG_SEV(my_logger::get(), debug) << "foobar";
}

logger.hh:

#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/sources/severity_feature.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/trivial.hpp>
BOOST_LOG_GLOBAL_LOGGER(my_logger, boost::log::sources::severity_logger_mt<>)
void init_logger();

logger.cc:

#include "logger.hh"
#include <boost/core/null_deleter.hpp>
#include <boost/log/core.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/sources/logger.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/smart_ptr/make_shared_object.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <iostream>
namespace logging = boost::log;
namespace sinks = boost::log::sinks;
namespace expr = boost::log::expressions;
namespace src = boost::log::sources;
BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, src::severity_logger_mt) {
src::severity_logger_mt<> lg;
return lg;
}
void init_logger() {
// Construct the sink
auto sink = boost::make_shared<sinks::synchronous_sink<sinks::text_ostream_backend>>();
boost::shared_ptr<std::ostream> stream(&std::cout, boost::null_deleter{});
sink->locked_backend()->add_stream(stream);
sink->set_formatter(expr::stream << "foobar: " << expr::smessage);       // ???
sink->set_filter(logging::trivial::severity >= logging::trivial::debug); // ???
// Register the sink in the logging core
logging::core::get()->add_sink(sink);
}

我不明白我做错了什么。

在浏览其他答案和进行实验时,我发现了一些Boost.Log文档和教程中没有明确说明的事情。

severity_logger_mt必须使用表示严重性结构的具体类型进行实例化,默认值仅为int(可能是为了吃掉任何用户提供的枚举(。严重性结构的一个示例是来自boost::log::trivial::severity_levelseverity_level结构。

下面的代码是一个完整的工作示例:

main.cc:没有变化。

logger.hh:

#pragma once
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/sources/severity_feature.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/trivial.hpp>
BOOST_LOG_GLOBAL_LOGGER(
my_logger, boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level>)
void init_logger();

logger.cc:

#include "logger.hh"
#include <boost/core/null_deleter.hpp>
#include <boost/log/core.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/trivial.hpp>
#include <boost/smart_ptr/make_shared_object.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <iostream>
namespace logging = boost::log;
namespace expr = boost::log::expressions;
namespace sinks = boost::log::sinks;
namespace src = boost::log::sources;
BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, src::severity_logger_mt<logging::trivial::severity_level>) {
src::severity_logger_mt<logging::trivial::severity_level> lg;
return lg;
}
void init_logger() {
// Construct the sink
auto sink = boost::make_shared<sinks::synchronous_sink<sinks::text_ostream_backend>>();
boost::shared_ptr<std::ostream> stream(&std::cout, boost::null_deleter{});
sink->locked_backend()->add_stream(stream);
sink->set_formatter(expr::stream << "foobar: " << expr::smessage);
sink->set_filter(logging::trivial::severity >= logging::trivial::debug);
// Register the sink in the logging core
logging::core::get()->add_sink(sink);
}

显式添加新接收器的另一种方法是使用辅助函数,例如add_console_log()

#include <boost/log/utility/setup/console.hpp>
namespace keywords = boost::log::keywords;
BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, src::severity_logger_mt<logging::trivial::severity_level>) {
src::severity_logger_mt<logging::trivial::severity_level> lg;
logging::add_console_log(std::cout,
keywords::format = (expr::stream << "foobar: " << expr::smessage));
logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::debug);
return lg;
}

最新更新