2015-04-17 3 views
1

J'apprends le Boost. Suite à un tutoriel, j'essaie de définir un filtre sur un récepteur en envoyant une référence à la méthode onlyWarnings.Boost set_filter ne fonctionne pas

Brève:

sink->set_filter(&onlyWarnings); 

En onlyWarnings:

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

Je manque évidemment quelque chose dans mon code et une partie importante du tutoriel.

HEADER:

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

Répondre

2

Êtes-vous sûr que la sévérité est juste un autre attribut? Je recommande de commencer à partir d'un exemple de travail, comme celui-ci:

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

travailler les avez-vous avant de commencer votre propre codage? L'enregistreur de sévérité des balises possède un exemple de filtre qui semble très différent du vôtre.

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

Peut-être essayer quelque chose comme:

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

Johan: J'ai une autre question que vous pourriez être en mesure d'aider, situé ici: http://stackoverflow.com/q/29785243/1735836 – Patricia