Журнал Boost — форматирование с использованием серьезности_канала_логера

Я видел несколько примеров с форматировщиками, но в них использовались настраиваемые атрибуты.

Как указать формат для 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.

регистратор.ч

#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.";
}

person Šimon Tóth    schedule 20.07.2015    source источник
comment
Какой код вы используете?   -  person sehe    schedule 20.07.2015
comment
@sehe Добавлен полный код.   -  person Šimon Tóth    schedule 20.07.2015


Ответы (2)


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

severity_channel_logger — это составной регистратор, который вставляет как уровень серьезности и канал в записях журнала, сделанных с помощью этого регистратора. Таким образом, из документов вы узнаете, что имена атрибутов — «Серьезность» и «Канал» соответственно, а типы значений атрибутов — это типы, которые вы указываете в качестве параметров шаблона регистратора — 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;
);
person Andrey Semashev    schedule 20.07.2015
comment
Спасибо, небольшой вопрос. Без средства форматирования выходные данные содержат метку времени. Как распечатать метку времени в форматере? "TimeStamp" не существует, хотя он используется в других примерах. Я решил эту проблему, зарегистрировав новые глобальные часы, но отметка времени была там до того, как был добавлен форматтер, так куда же она делась? - person Šimon Tóth; 21.07.2015
comment
По умолчанию не зарегистрированы никакие атрибуты, даже метка времени. Вы должны добавить его самостоятельно (что, как я предполагаю, вы сделали, когда добавили атрибут часов). Чтобы добавить временную метку в средство форматирования, вы можете использовать либо expr::attr, который выводит временную метку в формате по умолчанию, либо [expr::format_date_time][1], который предлагает способ ее настройки. [1]: boost.org/doc/libs/1_58_0/libs/log/doc/html/log/detailed/ - person Andrey Semashev; 21.07.2015

На самом деле в 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
person cwfighter    schedule 20.07.2015