28 #include <boost/core/null_deleter.hpp>
29 #include <boost/log/attributes/clock.hpp>
30 #include <boost/log/attributes/function.hpp>
31 #include <boost/log/expressions.hpp>
32 #include <boost/log/sinks/text_ostream_backend.hpp>
33 #include <boost/log/sources/global_logger_storage.hpp>
34 #include <boost/log/sources/severity_channel_logger.hpp>
35 #include <boost/log/support/date_time.hpp>
36 #include <boost/log/utility/exception_handler.hpp>
39 #include <boost/log/sinks/async_frontend.hpp>
41 using log_sink = boost::log::sinks::asynchronous_sink<T>;
43 #include <boost/log/sinks/sync_frontend.hpp>
45 using log_sink = boost::log::sinks::synchronous_sink<T>;
50 BOOST_LOG_ATTRIBUTE_KEYWORD(channel,
"Channel", std::string)
51 BOOST_LOG_ATTRIBUTE_KEYWORD(context,
"Context", std::string)
52 BOOST_LOG_ATTRIBUTE_KEYWORD(severity,
"Severity",
int)
53 BOOST_LOG_ATTRIBUTE_KEYWORD(threadName,
"ThreadName", std::string)
54 BOOST_LOG_ATTRIBUTE_KEYWORD(timestamp,
"TimeStamp", boost::posix_time::ptime)
59 struct ThreadLocalLogName
61 ThreadLocalLogName(std::string
const& _name) {
m_name.reset(
new std::string(_name)); }
62 boost::thread_specific_ptr<std::string>
m_name;
65 ThreadLocalLogName g_logThreadName(
"main");
67 auto const g_timestampFormatter =
68 (boost::log::expressions::stream
69 <<
EthViolet << boost::log::expressions::format_date_time(timestamp,
"%m-%d %H:%M:%S")
72 std::string verbosityToString(
int _verbosity)
90 void formatter(boost::log::record_view
const& _rec, boost::log::formatting_ostream& _strm)
92 _strm << std::setw(5) << std::left << verbosityToString(_rec.attribute_values()[severity].get())
95 g_timestampFormatter(_rec, _strm);
97 _strm <<
EthNavy << std::setw(4) << std::left << _rec[threadName] <<
EthReset " ";
98 _strm << std::setw(6) << std::left << _rec[channel] <<
" ";
99 if (boost::log::expressions::has_attr(context)(_rec))
102 _strm << _rec[boost::log::expressions::smessage];
109 #if defined(__GLIBC__) || defined(__APPLE__)
111 pthread_getname_np(pthread_self(), buffer, 127);
115 return g_logThreadName.m_name.get() ? *g_logThreadName.m_name.get() :
"<unknown>";
121 #if defined(__GLIBC__)
122 pthread_setname_np(pthread_self(), _n.c_str());
123 #elif defined(__APPLE__)
124 pthread_setname_np(_n.c_str());
126 g_logThreadName.m_name.reset(
new std::string(_n));
132 auto sink = boost::make_shared<log_sink<boost::log::sinks::text_ostream_backend>>();
134 boost::shared_ptr<std::ostream> stream{&std::cout, boost::null_deleter{}};
135 sink->locked_backend()->add_stream(stream);
136 sink->set_filter([_options](boost::log::attribute_value_set
const& _set) {
137 if (_set[severity] > _options.verbosity)
140 auto const messageChannel = _set[channel];
141 return (_options.includeChannels.empty() ||
142 contains(_options.includeChannels, messageChannel)) &&
143 !
contains(_options.excludeChannels, messageChannel);
146 sink->set_formatter(&formatter);
148 boost::log::core::get()->add_sink(sink);
150 boost::log::core::get()->add_global_attribute(
151 "ThreadName", boost::log::attributes::make_function(&
getThreadName));
152 boost::log::core::get()->add_global_attribute(
153 "TimeStamp", boost::log::attributes::local_clock());
155 boost::log::core::get()->set_exception_handler(
156 boost::log::make_exception_handler<std::exception>([](std::exception
const& _ex) {
157 std::cerr <<
"Exception from the logging library: " << _ex.what() <<
'\n';