Я учусь 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 ;
}