【问题标题】:C++ How to set a severity filter on a Boost Global LoggerC++ 如何在 Boost Global Logger 上设置严重性过滤器
【发布时间】:2015-04-21 23:53:48
【问题描述】:

我这几天一直在尝试创建一个 Boost Global Logger 以供整个应用程序使用但我似乎无法在 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) 使用可识别您的枚举的格式化程序设置接收器。

但我不知道如何做到这一点,因为即使在尝试按照他的指示进行操作之后,严重性级别看起来像 sink 仍在回退到 boost::log::trivial::severity_level::info 严重性.谁能帮我弄清楚如何在我的全局记录器中正确设置严重性?代码如下:

标题

#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;
}

ma​​in.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;
}

我在this SO question 中找到了更好的示例62.10. A macro to define a global logger 和工作版本。但是工作示例不使用 get() 方法。所以,在声明了 BOOST_LOG_GLOBAL_LOGGER 之后,我能够访问 log::get() 但我仍然无法让它识别严重性

【问题讨论】:

    标签: c++ logging boost


    【解决方案1】:

    我找到了 Boost Log 专家 Andrey。为了将来帮助其他人,我发布了指向我们Sourceforge discussion 的链接。在我的显示器上敲了很多次之后,他接受了他的解释并重新访问了this SO question中的工作版本。但我终于让它工作了!耶!!!

    【讨论】:

    • 您能否将您的完整工作解决方案发布到任何地方?更具体地说,我正在寻找一个解决方案,其中所有日志记录配置都在一个 ini 文件中。我的问题发布在stackoverflow.com/questions/52172457/…
    • @BKS,自从我开始工作以来,我还没有看过那个代码。我不再为那家公司工作。查看 Sourceforge 讨论和上面链接中发布的 SO 问题。我会尽力为您解决一些问题,但可能需要几天时间。
    • 感谢您的评论。有一个有用的提示解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2021-12-26
    • 2013-04-25
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多