/* * 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 #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 attrs = boost::log::attributes; namespace keywords = boost::log::keywords; BOOST_LOG_ATTRIBUTE_KEYWORD(line_id, "LineID", unsigned int) BOOST_LOG_ATTRIBUTE_KEYWORD(channel, "Channel", std::string) BOOST_LOG_ATTRIBUTE_KEYWORD(remote_address, "RemoteAddress", std::string) BOOST_LOG_ATTRIBUTE_KEYWORD(received_size, "ReceivedSize", std::size_t) BOOST_LOG_ATTRIBUTE_KEYWORD(sent_size, "SentSize", std::size_t) //[ example_sources_network_connection_channels class network_connection { src::channel_logger< > m_net, m_stat; logging::attribute_set::iterator m_net_remote_addr, m_stat_remote_addr; public: network_connection() : // We can dump network-related messages through this logger // and be able to filter them later m_net(keywords::channel = "net"), // We also can separate statistic records in a different channel // in order to route them to a different sink m_stat(keywords::channel = "stat") { } void on_connected(std::string const& remote_addr) { // Add the remote address to both channels attrs::constant< std::string > addr(remote_addr); m_net_remote_addr = m_net.add_attribute("RemoteAddress", addr).first; m_stat_remote_addr = m_stat.add_attribute("RemoteAddress", addr).first; // Put message to the "net" channel BOOST_LOG(m_net) << "Connection established"; } void on_disconnected() { // Put message to the "net" channel BOOST_LOG(m_net) << "Connection shut down"; // Remove the attribute with the remote address m_net.remove_attribute(m_net_remote_addr); m_stat.remove_attribute(m_stat_remote_addr); } void on_data_received(std::size_t size) { BOOST_LOG(m_stat) << logging::add_value("ReceivedSize", size) << "Some data received"; } void on_data_sent(std::size_t size) { BOOST_LOG(m_stat) << logging::add_value("SentSize", size) << "Some data sent"; } }; //] int main(int, char*[]) { // Construct the sink for the "net" channel typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink; boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >(); sink->locked_backend()->add_stream( boost::make_shared< std::ofstream >("net.log")); sink->set_formatter ( expr::stream << line_id << ": [" << remote_address << "] " << expr::smessage ); sink->set_filter(channel == "net"); logging::core::get()->add_sink(sink); // Construct the sink for the "stat" channel sink = boost::make_shared< text_sink >(); sink->locked_backend()->add_stream( boost::make_shared< std::ofstream >("stat.log")); sink->set_formatter ( expr::stream << remote_address << expr::if_(expr::has_attr(received_size)) [ expr::stream << " -> " << received_size << " bytes: " ] << expr::if_(expr::has_attr(sent_size)) [ expr::stream << " <- " << sent_size << " bytes: " ] << expr::smessage ); sink->set_filter(channel == "stat"); logging::core::get()->add_sink(sink); // Register other common attributes, such as time stamp and record counter logging::add_common_attributes(); // Emulate network activity network_connection conn; conn.on_connected("11.22.33.44"); conn.on_data_received(123); conn.on_data_sent(321); conn.on_disconnected(); return 0; }