124 lines
4.1 KiB
C++
124 lines
4.1 KiB
C++
/*
|
|
* 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 <cstddef>
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <boost/smart_ptr/shared_ptr.hpp>
|
|
#include <boost/smart_ptr/make_shared_object.hpp>
|
|
#include <boost/move/utility_core.hpp>
|
|
#include <boost/log/core.hpp>
|
|
#include <boost/log/expressions.hpp>
|
|
#include <boost/log/attributes/constant.hpp>
|
|
#include <boost/log/attributes/scoped_attribute.hpp>
|
|
#include <boost/log/attributes/attribute_value_impl.hpp>
|
|
#include <boost/log/sources/logger.hpp>
|
|
#include <boost/log/sources/record_ostream.hpp>
|
|
#include <boost/log/sinks/sync_frontend.hpp>
|
|
#include <boost/log/sinks/text_ostream_backend.hpp>
|
|
#include <boost/log/utility/setup/common_attributes.hpp>
|
|
#include <boost/log/utility/manipulators/add_value.hpp>
|
|
|
|
namespace logging = boost::log;
|
|
namespace src = boost::log::sources;
|
|
namespace expr = boost::log::expressions;
|
|
namespace sinks = boost::log::sinks;
|
|
namespace attrs = boost::log::attributes;
|
|
|
|
BOOST_LOG_ATTRIBUTE_KEYWORD(line_id, "LineID", unsigned int)
|
|
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
|
|
class network_connection
|
|
{
|
|
src::logger m_logger;
|
|
logging::attribute_set::iterator m_remote_addr;
|
|
|
|
public:
|
|
void on_connected(std::string const& remote_addr)
|
|
{
|
|
// Put the remote address into the logger to automatically attach it
|
|
// to every log record written through the logger
|
|
m_remote_addr = m_logger.add_attribute("RemoteAddress",
|
|
attrs::constant< std::string >(remote_addr)).first;
|
|
|
|
// The straightforward way of logging
|
|
if (logging::record rec = m_logger.open_record())
|
|
{
|
|
rec.attribute_values().insert("Message",
|
|
attrs::make_attribute_value(std::string("Connection established")));
|
|
m_logger.push_record(boost::move(rec));
|
|
}
|
|
}
|
|
void on_disconnected()
|
|
{
|
|
// The simpler way of logging: the above "if" condition is wrapped into a neat macro
|
|
BOOST_LOG(m_logger) << "Connection shut down";
|
|
|
|
// Remove the attribute with the remote address
|
|
m_logger.remove_attribute(m_remote_addr);
|
|
}
|
|
void on_data_received(std::size_t size)
|
|
{
|
|
// Put the size as an additional attribute
|
|
// so it can be collected and accumulated later if needed.
|
|
// The attribute will be attached only to this log record.
|
|
BOOST_LOG(m_logger) << logging::add_value("ReceivedSize", size) << "Some data received";
|
|
}
|
|
void on_data_sent(std::size_t size)
|
|
{
|
|
BOOST_LOG(m_logger) << logging::add_value("SentSize", size) << "Some data sent";
|
|
}
|
|
};
|
|
//]
|
|
|
|
int main(int, char*[])
|
|
{
|
|
// Construct the sink
|
|
typedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink;
|
|
boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >();
|
|
|
|
// Add a stream to write log to
|
|
sink->locked_backend()->add_stream(
|
|
boost::make_shared< std::ofstream >("sample.log"));
|
|
|
|
// Set the formatter
|
|
sink->set_formatter
|
|
(
|
|
expr::stream
|
|
<< line_id
|
|
<< ": [" << remote_address << "] "
|
|
<< expr::if_(expr::has_attr(received_size))
|
|
[
|
|
expr::stream << "[Received: " << received_size << "] "
|
|
]
|
|
<< expr::if_(expr::has_attr(sent_size))
|
|
[
|
|
expr::stream << "[Sent: " << sent_size << "] "
|
|
]
|
|
<< expr::smessage
|
|
);
|
|
|
|
// Register the sink in the logging core
|
|
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;
|
|
}
|