одиночный атрибут формата журнала повышения с logging::init_from_stream

Когда я устанавливаю параметры формата в коде, для форматирования вывода даты и времени я могу использовать что-то вроде этого

logging::formatter simpleFormat(expr::format("%1% %2%") %
   expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%H:%M:%S") %
   expr::smessage
);

Но когда я инициализирую регистратор с помощью файла конфигурации, я могу указать формат только в обозначении позиции атрибутов, а не в деталях их формата.

Итак, эта строка в файле конфигурации журнала повышения

Format="[%TimeStamp%]: %Message%"

производит вывод:

[2015-Feb-06 09:32:27.401496]: blah blah blah

Я хочу уменьшить временную метку до чего-то вроде этого

[06.02.2015 09:32:27]

Как это можно описать в конфигурационном файле журнала буста, или это вообще нельзя сделать?


person Vasilly.Prokopyev    schedule 06.02.2015    source источник


Ответы (2)


Преамбула

Мой ответ действителен для boost 1.55 (последний не тестировался). И это было протестировано только с компилятором MSVC 2013.

Отвечать

Похоже, вам нужен пользовательский атрибут formatter_factory для TimeStamp, чтобы иметь возможность указать его формат. Это работает для меня:

#include <fstream>
#include "boost/shared_ptr.hpp"
#include "boost/log/trivial.hpp"
#include "boost/log/expressions.hpp"
#include "boost/log/utility/setup.hpp"
#include "boost/log/support/date_time.hpp"

class timestamp_formatter_factory :
    public boost::log::basic_formatter_factory<char, boost::posix_time::ptime>
{
    public:
        formatter_type create_formatter(boost::log::attribute_name const& name, args_map const& args)
        {
            args_map::const_iterator it = args.find("format");
            if (it != args.end())
                return boost::log::expressions::stream << boost::log::expressions::format_date_time<boost::posix_time::ptime>(boost::log::expressions::attr<boost::posix_time::ptime>(name), it->second);
            else
                return boost::log::expressions::stream << boost::log::expressions::attr<boost::posix_time::ptime>(name);
        }
};

int main()
{
    // Initializing logging
    boost::log::register_formatter_factory("TimeStamp", boost::make_shared<timestamp_formatter_factory>());
    boost::log::add_common_attributes();
    std::ifstream file("settings.ini");
    boost::log::init_from_stream(file);
    // Testing
    BOOST_LOG_TRIVIAL(info) << "Test";
    return 0;
}

И теперь в вашем файле настроек вы можете указать аргумент format для атрибута TimeStamp. Как это:

[Sinks.ConsoleOut]
Destination=Console
AutoFlush=true
Format="[%TimeStamp(format=\"%Y.%m.%d %H:%M:%S\")%]: %Message%"
person Sergey Krusch    schedule 06.02.2015
comment
Тай, классно выглядит, сегодня уже закончил работу, в понедельник попробую. - person Vasilly.Prokopyev; 06.02.2015

Вы должны иметь возможность использовать set_formatter как описано в документации здесь

sink->set_formatter
(
    expr::stream << expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S")
);
person sehe    schedule 06.02.2015