我已经尝试了几天来创建一个 Boost Global Logger 以便在整个应用程序中使用但我似乎无法获得全局记录器中设置的严重级别.
重要的:
请看下面安德烈的答案......它被标记为步骤(a)和(b),但我仍然没有得到正确的答案!
直接来自 Boost 文档here
...拥有一个或多个全局记录器会更方便
以便在需要时可以在任何地方轻松访问它们。在这方面
std::cout 是此类记录器的一个很好的例子。
该库提供了一种声明全局记录器的方法,可以
访问方式与 std::cout 非常相似。其实这个功能可以用
与任何记录器,包括用户定义的记录器。宣布全球
记录器,可以确保对这个记录器有线程安全的访问
来自应用程序代码的任何位置的实例。图书馆还
保证全局记录器实例即使在不同的环境中也是唯一的
模块边界。这甚至允许在仅标头中使用日志记录
可能被编译成不同模块的组件。
无论您使用什么宏来声明记录器,您都可以
使用logger的静态get函数获取logger实例
标签:
src::severity_logger_mt< >& lg = my_logger::get();
我从 Boost Logger 大师 Andrey 那里得知我的问题是严重性类型不匹配.
您已使用默认模板实例化了severity_logger_mt
参数,因此严重性级别属性的类型为 int。你的枚举
值被转换为 int 并发送到日志记录核心。你还没有
设置任何接收器,因此默认情况下使用默认接收器。水槽
尝试从日志记录中提取严重性级别属性值,
但未能做到这一点,因为它预计严重级别为
输入 boost::log::trivial::severity_level。在那次失败之后水槽
回退到 boost::log::trivial::severity_level::info 严重性。
如果您想使用枚举来表示严重级别,您必须:
------------------------------------------------(现在,这就是答案!!!)-- ------------------------------------------------
(a) 在记录器模板参数中指定它并
(b) 设置一个带有格式化程序的接收器,该格式化程序可以识别您的枚举。
但我不知道如何做到这一点,因为即使在尝试遵循他的指示之后,严重性级别看起来仍然会回落到 boost::log::trivial::severity_level::info 严重性。谁能帮我弄清楚如何在我的全局记录器中正确设置严重性?这是代码:
HEADER
#include <boost/log/trivial.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
enum severity_level
{
normal,
warning,
error,
critical
};
BOOST_LOG_GLOBAL_LOGGER(logger, boost::log::sources::severity_logger_mt< severity_level >)
CPP
#include "GlobalLogger.h"
#include <boost/log/expressions/formatters/date_time.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/core/null_deleter.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/make_shared.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/sinks.hpp>
#include <fstream>
namespace logging = boost::log;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace sinks = boost::log::sinks;
namespace attrs = boost::log::attributes;
bool onlyWarnings(const boost::log::attribute_value_set& set)
{
return set["Severity"].extract<severity_level>() > 0;
}
void severity_and_message(const boost::log::record_view &view, boost::log::formatting_ostream &os)
{
os << view.attribute_values()["Severity"].extract<severity_level>() << ": " <<
view.attribute_values()["Message"].extract<std::string>();
}
BOOST_LOG_GLOBAL_LOGGER_INIT(logger, boost::log::sources::severity_logger_mt< severity_level >)
{
boost::log::sources::severity_logger_mt< severity_level > logger;
// add a text sink
typedef sinks::asynchronous_sink<sinks::text_ostream_backend> text_sink;
boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
// add "console" output stream to our sink
boost::shared_ptr<std::ostream> stream{&std::clog, boost::null_deleter{}};
sink->locked_backend()->add_stream(stream);
// specify the format of the log message
sink->set_formatter(&severity_and_message);
// just log messages with severity >= SEVERITY_THRESHOLD are written
sink->set_filter(&onlyWarnings);
// "register" our sink
logging::core::get()->add_sink(sink);
logging::add_common_attributes();
return logger;
}
main.cpp
#include <iostream>
#include "GlobalLogger.h"
using namespace std;
int main() {
boost::log::sources::severity_logger_mt< severity_level >& lg = logger::get();
BOOST_LOG_SEV(lg, severity_level::normal) << "note";
BOOST_LOG_SEV(lg, severity_level::warning) << "warning";
BOOST_LOG_SEV(lg, severity_level::critical) << "critical";
return 0;
}
我找到了一个更好的例子62.10。定义全局记录器的宏和一个工作版本这个问题。但工作示例没有使用 get() 方法。因此,在声明 BOOST_LOG_GLOBAL_LOGGER 后,我能够访问 log::get()但我还是无法让它认识到严重性.