c++ - boost set_filter 不工作

标签 c++ boost boost-logging

我正在学习 Boost。按照教程,我尝试通过发送对方法 onlyWarnings 的引用来在接收器上设置过滤器。

简介:

sink->set_filter(&onlyWarnings);

仅在警告中:

set["Severity"].extract<int>()  // is always 0

我的代码和本教程的重要部分显然遗漏了一些东西。

标题:

#ifndef ONEPRINT_LOGGER_H
#define ONEPRINT_LOGGER_H

#include <boost/log/core/core.hpp>
#include <boost/log/attributes/attribute_value_set.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/sinks.hpp>
#include <boost/core/null_deleter.hpp>
#include <iostream>

namespace expr = boost::log::expressions;
namespace sources = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;

namespace ids {

    enum severity_level
    {
        normal,
        warning,
        error,
        critical
    };

    class Logger {
    public:
        Logger();
        ~Logger();
        void logIt(std::string msg);

    protected:
        typedef sinks::asynchronous_sink<sinks::text_ostream_backend> asynchronousSink;
        void setupLogging();
    };

}
#endif //ONEPRINT_LOGGER_H

CPP:

#include "Logger.h"

class counter;

using namespace ids;

namespace {  // NON-MEMBER METHODS
    bool onlyWarnings(const boost::log::attribute_value_set& set)
    {
        return set["Severity"].extract<int>() > 0;
    }

    void severity_and_message(const boost::log::record_view &view, boost::log::formatting_ostream &os)
    {
        os << view.attribute_values()["Severity"].extract<int>() << ": " <<
        view.attribute_values()["Message"].extract<std::string>();
    }
}

Logger::Logger() {
    setupLogging();
    logIt("Testing");
}

Logger::~Logger() {

}

void Logger::setupLogging()
{
    boost::shared_ptr< boost::log::core > core = boost::log::core::get();
    boost::shared_ptr<sinks::text_ostream_backend> backend = boost::make_shared<sinks::text_ostream_backend>();

    boost::shared_ptr<Logger::asynchronousSink> sink(new Logger::asynchronousSink(backend));
    boost::shared_ptr<std::ostream> stream{&std::clog, boost::null_deleter{}};
    sink->locked_backend()->add_stream(stream);

    sink->set_filter(&onlyWarnings);
    sink->set_formatter(&severity_and_message);

    core->add_sink(sink);
}

void Logger::logIt(std::string msg) {
    BOOST_LOG_TRIVIAL(warning) << msg;

    sources::severity_logger<severity_level> severityLogger;
    BOOST_LOG_SEV(severityLogger, critical) << msg;
}

最佳答案

您确定严重性只是另一个属性吗?我建议您从一个工作示例开始,例如:

http://www.boost.org/doc/libs/1_56_0/libs/log/doc/html/log/tutorial/advanced_filtering.html

http://boost-log.sourceforge.net/libs/log/example/doc/tutorial_filtering.cpp

在您开始自己的编码之前,您是否让它们工作了? 标签严重性记录器有一个示例过滤器,看起来与您的非常不同。

bool my_filter(logging::value_ref< severity_level, tag::severity > const& level,
               logging::value_ref< std::string, tag::tag_attr > const& tag)
{
    return level >= warning || tag == "IMPORTANT_MESSAGE";
}

也许尝试更像:

bool my_filter(logging::value_ref< severity_level, tag::severity > const& level)
{
    return level >= warning ;
}

关于c++ - boost set_filter 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29707017/

相关文章:

c++ - Objective C 协议(protocol)引用作为 C++ 类中的实例变量

c++ - Boost如何创建类型选择的 map ?

c++ - partial_sort 和智能指针

boost - Yocto 1.6 工具链中没有 libboost_log

c++ - 如何在 Linux 上使用 Boost.Filesystem?

c++ - QFile::copy 静态函数不复制文件

c++ - 巴特沃斯 N 阶滤波器设计

c++ - 修改boost多索引容器项

c++ - 日期更改为第二天时 booSTLog 异常

c++ - 提升日志记录 - 目的地和格式化程序