template<class msg_type> void operator()(msg_type & str) const { bool is_needed = true; if ( ! convert::get_underlying_string(str).empty()) if ( *(convert::get_underlying_string(str).rbegin()) == '\n') is_needed = false; if ( is_needed) convert::write( BOOST_LOG_STR("\n"), str ); }
template<class msg_type> void operator()(msg_type & str) const { convert::write( BOOST_LOG_STR("\n"), str ); }
// when we enter here, we know the logger is enabled hold_string_type gathered_info() { hold_string_type str = m_out.str(); m_gather.do_gather(str); return BOOST_LOG_STR("start of ") + str; }
void set_format(const hold_string_type & format) { // format too big BOOST_ASSERT( format.size() < 64); m_format.clear(); m_day = -1; m_month = -1; m_yy = -1; m_yyyy = -1; m_hour = -1; m_min = -1; m_sec = -1;m_millisec = -1;m_microsec = -1;m_nanosec = -1; typedef hold_string_type::size_type uint; uint day_idx = format.find(BOOST_LOG_STR("$dd")); uint month_idx = format.find(BOOST_LOG_STR("$MM")); uint yy_idx = format.find(BOOST_LOG_STR("$yy")); uint yyyy_idx = format.find(BOOST_LOG_STR("$yyyy")); uint hour_idx = format.find(BOOST_LOG_STR("$hh")); uint min_idx = format.find(BOOST_LOG_STR("$mm")); uint sec_idx = format.find(BOOST_LOG_STR("$ss")); uint millisec_idx = format.find(BOOST_LOG_STR("$mili")); uint microsec_idx = format.find(BOOST_LOG_STR("$micro")); uint nanosec_idx = format.find(BOOST_LOG_STR("$nano")); typedef std::vector<index_info> array; array indexes; if ( day_idx != hold_string_type::npos) indexes.push_back( index_info(day_idx, &m_day) ); if ( month_idx != hold_string_type::npos) indexes.push_back( index_info(month_idx, &m_month) ); if ( yy_idx != hold_string_type::npos || yyyy_idx != hold_string_type::npos) { if ( yyyy_idx != hold_string_type::npos) indexes.push_back( index_info(yyyy_idx, &m_yyyy, 4) ); else indexes.push_back( index_info(yy_idx, &m_yy) ); } if ( hour_idx != hold_string_type::npos) indexes.push_back( index_info(hour_idx, &m_hour ) ); if ( min_idx != hold_string_type::npos) indexes.push_back( index_info(min_idx, &m_min) ); if ( sec_idx != hold_string_type::npos) indexes.push_back( index_info(sec_idx, &m_sec) ); if ( millisec_idx != hold_string_type::npos) indexes.push_back( index_info(millisec_idx, &m_millisec, 4, 3) ); if ( microsec_idx != hold_string_type::npos) indexes.push_back( index_info(microsec_idx, &m_microsec, 5, 6) ); if ( nanosec_idx != hold_string_type::npos) indexes.push_back( index_info(nanosec_idx, &m_nanosec, 4, 9) ); std::sort( indexes.begin(), indexes.end(), index_info::by_index); // create the format string, that we can actually pass to sprintf uint prev_idx = 0; int idx = 0; for ( array::iterator begin = indexes.begin(), end = indexes.end(); begin != end; ++begin) { m_format += format.substr( prev_idx, begin->src_idx - prev_idx); *begin->format_idx = idx; std::basic_ostringstream<char_type> cur_sprintf_format; cur_sprintf_format << BOOST_LOG_STR("%0") << begin->size << BOOST_LOG_STR("d"); m_format += cur_sprintf_format.str(); prev_idx = begin->src_idx + begin->advance_size + 1; ++idx; } m_format += format.substr(prev_idx); }
stream_type & get() { stream_type & val = *(m_cache.get()); val.str( BOOST_LOG_STR("") ); return val; }
void init() { m_format_before .add( BOOST_LOG_STR("idx"), formatter::idx() ) .add( BOOST_LOG_STR("time"), ::boost::logging::detail::formatter_time_type( BOOST_LOG_STR("$hh:$mm:$ss") ) ) .add( BOOST_LOG_STR("thread_id"), formatter::thread_id() ); m_format_after .add( BOOST_LOG_STR("idx"), formatter::idx_t<formatter::do_convert_format::append>() ) .add( BOOST_LOG_STR("time"), ::boost::logging::detail::formatter_time_type_append( BOOST_LOG_STR("$hh:$mm:$ss") ) ) .add( BOOST_LOG_STR("thread_id"), formatter::thread_id_t<formatter::do_convert_format::append>() ); m_destination .add( BOOST_LOG_STR("file"), destination::file("out.txt") ) .add( BOOST_LOG_STR("file2"), destination::file("out.txt") ) .add( BOOST_LOG_STR("rol_file"), destination::rolling_file("out.txt") ) .add( BOOST_LOG_STR("rol_file2"), destination::rolling_file("out.txt") ) .add( BOOST_LOG_STR("cout"), destination::cout() ) .add( BOOST_LOG_STR("cerr"), destination::cerr() ) .add( BOOST_LOG_STR("debug"), destination::dbg_window() ); }