首页 文章

C如何在Boost Global Logger上设置严重性过滤器

提问于
浏览
4

我一直在努力创建一个Boost Global Logger,以便在整个应用程序中使用 but I can't seem to get the severity level set in the Global Logger .

IMPORTANT:

Look below for Andrey's answer...it's labeled as step (a) and (b) but I'm still not getting it right!


刚出Boost文档here

...拥有一个或多个全局 Logger 以便在需要时在每个地方轻松访问它们会更方便 . 在这方面,std :: cout就是这种 Logger 的一个很好的例子 . 该库提供了一种声明全局 Logger 的方法,可以像std :: cout一样访问它们 . 实际上,此功能可用于任何 Logger ,包括用户定义的 Logger . 声明了全局 Logger 后,可以确保从应用程序代码的任何位置对此 Logger 实例进行线程安全访问 . 该库还保证全局 Logger 实例即使跨模块边界也是唯一的 . 这允许甚至在可以编译到不同模块中的仅头部组件中采用日志记录 . 无论您用于声明 Logger 的宏如何,都可以使用logger标记的静态get函数获取 Logger 实例:

src::severity_logger_mt< >& lg = my_logger::get();

我从Boost Logger大师安德烈那里发现我的问题是 the severity type mismatch .

您已使用默认模板参数实例化severity_logger_mt,因此严重性级别属性的类型为int . 您的枚举值将转换为int并发送到日志记录核心 . 您尚未设置任何接收器,因此默认使用默认接收器 . 接收器尝试从日志记录中提取严重性级别属性值,但未能这样做,因为它期望严重性级别为boost :: log :: trivial :: severity_level类型 . 在失败之后,接收器回退到boost :: log :: trivial :: severity_level :: info严重性 . 如果要将枚举用于严重性级别,则必须:

------------------------------------ ( Now, here is the ANSWER !!!! ) ---------------------------------------

(a)在 Logger 模板参数中指定它,以及(b)使用知道你的枚举的格式化程序设置接收器 .

但我无法弄清楚如何做到这一点,因为即使在尝试遵循他的指示之后,严重性级别看起来像接收器仍然会回落到boost :: log :: trivial :: severity_level :: info severity . 任何人都可以帮我弄清楚如何在我的全局 Logger 中正确设置严重性?这是代码:

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. A macro to define a global loggerthis SO question中的工作版本 . 但是工作示例不使用get()方法 . 因此,在声明BOOST_LOG_GLOBAL_LOGGER之后,我能够访问log :: get() but I still can't get it to recognize the severity .

1 回答

  • 5

    我找到了促进日志专家安德烈 . 为了帮助将来的其他人,我发布了一个链接到我们的Sourceforge discussion . 在我的显示器上敲了很多头后,他接受了解释并重新审视了this SO question中的工作版本 . 但我终于搞定了!好极了!!!

相关问题