/* * Copyright Andrey Semashev 2007 - 2015. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include #include #include #include #include #include namespace logging = boost::log; namespace src = boost::log::sources; namespace expr = boost::log::expressions; namespace sinks = boost::log::sinks; namespace keywords = boost::log::keywords; //[ example_sinks_unlocked enum severity_level { normal, warning, error }; // A trivial sink backend that requires no thread synchronization class my_backend : public sinks::basic_sink_backend< sinks::concurrent_feeding > { public: // The function is called for every log record to be written to log void consume(logging::record_view const& rec) { // We skip the actual synchronization code for brevity std::cout << rec[expr::smessage] << std::endl; } }; // Complete sink type typedef sinks::unlocked_sink< my_backend > sink_t; void init_logging() { boost::shared_ptr< logging::core > core = logging::core::get(); // The simplest way, the backend is default-constructed boost::shared_ptr< sink_t > sink1(new sink_t()); core->add_sink(sink1); // One can construct backend separately and pass it to the frontend boost::shared_ptr< my_backend > backend(new my_backend()); boost::shared_ptr< sink_t > sink2(new sink_t(backend)); core->add_sink(sink2); // You can manage filtering through the sink interface sink1->set_filter(expr::attr< severity_level >("Severity") >= warning); sink2->set_filter(expr::attr< std::string >("Channel") == "net"); } //] int main(int, char*[]) { init_logging(); src::severity_channel_logger< severity_level > lg(keywords::channel = "net"); BOOST_LOG_SEV(lg, normal) << "Hello world!"; return 0; }