2015-07-20 3 views
1

Я видел несколько примеров с formatters, но те, которые использовали настраиваемые атрибуты.Boost log - форматирование с severity_channel_logger

Как указать формат для severity_channel_logger? Что я получаю сейчас:

[2015-07-20 11:53:09.879305] [0x00007f047b525740] [trace] Bla, bla bla, bla bla bla. 
[2015-07-20 11:53:09.879370] [0x00007f047b525740] [trace] Bla, bla bla, bla bla bla. 
[2015-07-20 11:53:09.879376] [0x00007f047b525740] [fatal] Bla, bla bla, bla bla bla. 

logger.h

#ifndef LOGGER_H_ 
#define LOGGER_H_ 

#include <boost/log/trivial.hpp> 
#include <boost/log/core.hpp> 
#include <boost/log/sources/global_logger_storage.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/sources/channel_feature.hpp> 
#include <boost/log/sources/severity_channel_logger.hpp> 

#include <string> 

namespace Logging { 

typedef boost::log::sources::severity_channel_logger<boost::log::trivial::severity_level,std::string> LoggerType; 

BOOST_LOG_GLOBAL_LOGGER(clogger,LoggerType) 

} // namespace Logging 

#endif 

logger.cpp

#include "logger.h" 
#include <memory> 

#include <boost/log/core/core.hpp> 
#include <boost/log/expressions/formatters/date_time.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/log/sinks/sync_frontend.hpp> 
#include <boost/log/sinks/text_ostream_backend.hpp> 
#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/support/date_time.hpp> 
#include <boost/core/null_deleter.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/make_shared.hpp> 
#include <boost/shared_ptr.hpp> 

using namespace Logging; 

BOOST_LOG_GLOBAL_LOGGER_INIT(clogger, LoggerType) 
{ 
    boost::log::sources::severity_channel_logger< boost::log::trivial::severity_level, std::string > lg; 
    return lg; 
} 

main.cpp

#include "logger.h" 
#include <boost/log/attributes/named_scope.hpp> 
using namespace Logging; 

int main() 
{ 
    BOOST_LOG_FUNCTION(); 
    BOOST_LOG(clogger::get()) << "Bla, bla bla, bla bla bla."; 
    BOOST_LOG_CHANNEL(clogger::get(),"standard") << "Bla, bla bla, bla bla bla."; 
    BOOST_LOG_CHANNEL_SEV(clogger::get(),"standard",boost::log::trivial::fatal) << "Bla, bla bla, bla bla bla."; 
} 
+0

Какой код вы используете? – sehe

+1

@sehe Добавлен полный код. –

ответ

1

Вам необходимо установить форматтер для вашей раковины. Форматировщик может быть определен в multiple ways, но в итоге он извлекает значения атрибутов из записей журнала и помещает их в строку. Не имеет значения, определены ли атрибуты пользователем или библиотекой - вам просто нужно имя атрибута и тип его значений.

severity_channel_logger - это композитный регистратор, который вставляет как severity level, так и channel в записи журнала, выполненные через этот регистратор. Таким образом, из документов вы узнаете, что имена атрибутов являются «Severity» и «Channel» соответственно, а типы значений атрибутов - это типы, которые вы указываете в качестве параметров шаблона журнала: boost::log::trivial::severity_level и std::string в вашем случае.

Теперь вы можете установить форматтер, который вы хотите для своей раковины. Например:

namespace expr = boost::log::expressions; 

sink->set_formatter(
    expr::stream 
     << expr::attr<boost::log::trivial::severity_level>("Severity") 
     << " [" << expr::attr<std::string>("Channel") << "]: " 
     << expr::smessage; 
); 
+0

Спасибо, всего лишь маленький вопрос. Без форматирования вывод содержит метку времени. Как напечатать метку времени в форматировании? '' TimeStamp "', похоже, не существует, даже если он используется в других примерах. Я решил это, зарегистрировав новые глобальные часы, но временная метка была там до того, как форматировщик был добавлен, и куда он пошел? –

+0

По умолчанию нет атрибутов, даже метка времени. Вы должны добавить его самостоятельно (что, я полагаю, вы сделали, когда добавили атрибут clock). Чтобы добавить временную метку к форматированию, вы можете использовать либо '' 'expr :: attr''', который выведет временную метку в формате по умолчанию, либо [' '' expr :: format_date_time''] [1], который предлагает способ его настройки. [1]: http://www.boost.org/doc/libs/1_58_0/libs/log/doc/html/log/detailed/expressions.html#log.detailed.expressions.formatters.date_time –

0

На самом деле, есть много введений в boost.org. Теперь я дам мне мой код:

#include <fstream> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/smart_ptr/make_shared_object.hpp> 
#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/log/sinks/sync_frontend.hpp> 
#include <boost/log/sinks/text_ostream_backend.hpp> 
#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/support/date_time.hpp> 

namespace logging = boost::log; 
namespace src = boost::log::sources; 
namespace expr = boost::log::expressions; 
namespace sinks = boost::log::sinks; 
namespace keywords = boost::log::keywords; 

void init() 
{ 
    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>("sample.log")); 

    sink->set_formatter 
    (
     expr::stream 
      // line id will be written in hex, 8-digits, zero-filled 
     << expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d, %H:%M:%S") 
     << std::hex << std::setw(8) << std::setfill('0') << expr::attr< unsigned int >("LineID") 
     << ": <" << logging::trivial::severity 
     << "> " << expr::smessage 
); 

logging::core::get()->add_sink(sink); 
} 

int main() 
{ 
init(); 
logging::add_common_attributes(); 

using namespace logging::trivial; 
src::severity_logger<severity_level> lg; 

BOOST_LOG_SEV(lg, trace) << "A trace severity message"; 
BOOST_LOG_SEV(lg, debug) << "A debug severity message"; 
BOOST_LOG_SEV(lg, info) << "An informational severity message"; 
BOOST_LOG_SEV(lg, warning) << "A warning severity message"; 
BOOST_LOG_SEV(lg, error) << "An error severity message"; 
BOOST_LOG_SEV(lg, fatal) << "A fatal severity message"; 

return 0; 

}

По моим кодам, вы получите выходной формат в sample.log .Это будет отображаться с timestamp и log level. Для получения дополнительной информации вы должны зайти на сайт [http://www.boost.org/doc/libs/1_58_0/libs/log/example/doc/tutorial_fmt_format.cpp]. Я надеюсь это тебе поможет. Кстати, выход:

2015-07-20, 23:19:0200000001: <trace> A trace severity message 
2015-07-20, 23:19:0200000002: <debug> A debug severity message 
2015-07-20, 23:19:0200000003: <info> An informational severity message 
2015-07-20, 23:19:0200000004: <warning> A warning severity message 
2015-07-20, 23:19:0200000005: <error> An error severity message 
2015-07-20, 23:19:0200000006: <fatal> A fatal severity message