Пропущенная метка времени в Boost.Log - PullRequest
0 голосов
/ 06 февраля 2020

Я новичок в Boost.Log. Я хотел бы распечатать данные в следующем формате: [TimeStamp][Severity] Message.

У меня есть такой код

auto my_formatter = [](boost::log::record_view const& rec, boost::log::formatting_ostream& strm)
{
    strm << "[" << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S") << "]";
    strm << "[" << rec[boost::log::trivial::severity] << "] ";
    strm << rec[boost::log::expressions::smessage];
};

void addFileSink()
{
    using sinkType = boost::log::sinks::synchronous_sink<boost::log::sinks::text_file_backend>;

    auto backend = boost::make_shared<boost::log::sinks::text_file_backend>(
        boost::log::keywords::file_name = "log_%N.log",
        boost::log::keywords::rotation_size = 10 * 1024 * 1024,
        boost::log::keywords::open_mode = std::ios_base::app
    );

    boost::shared_ptr<sinkType> sink(new sinkType(backend));
    sink->set_formatter(my_formatter);
    sink->set_filter(boost::log::trivial::severity >= boost::log::trivial::severity_level::info);
    boost::log::core::get()->add_sink(sink);
}

void addConsoleSink()
{
    using sinkType = boost::log::sinks::synchronous_sink<boost::log::sinks::text_ostream_backend>;

    auto backend = boost::make_shared<boost::log::sinks::text_ostream_backend>();
    backend->add_stream(boost::shared_ptr<std::ostream>(&std::cout, boost::null_deleter()));
    backend->auto_flush(true);

    boost::shared_ptr<sinkType> sink(new sinkType(backend));
    sink->set_formatter(my_formatter);
    sink->set_filter(boost::log::trivial::severity >= boost::log::trivial::severity_level::error);
    boost::log::core::get()->add_sink(sink);
}

int main()
{
    boost::log::add_common_attributes();

    addFileSink();
    addConsoleSink();

    boost::log::sources::severity_logger<boost::log::trivial::severity_level> lg;

    BOOST_LOG_SEV(lg, boost::log::trivial::severity_level::error) << "Message error";
    BOOST_LOG_SEV(lg, boost::log::trivial::severity_level::info) << "Message info";

    return 0;
}

Он отлично работает, кроме атрибута TimeStamp, я получаю такой вывод :

[[error] Message error

Я пробовал разные способы из примеров и так далее, но не могу найти решение этой проблемы .. boost::log::add_common_attributes(); не помогает.

1 Ответ

1 голос
/ 07 февраля 2020

boost::log::expressions::format_date_time не является функцией форматирования даты и времени. Это генератор форматирования для использования в выражениях лямбда-форматирования. Другими словами, format_date_time создает средство форматирования (объект функции с заданной c подписью), которое после вызова извлекает значение атрибута из записи журнала и форматирует его.

Вам следует либо используйте лямбда-выражения для создания средства форматирования вместо функции my_formatter, в этом случае вы можете использовать format_date_time или использовать один из традиционных методов форматирования даты и времени, например strftime или Boost.DateTime IO .

Пример использования лямбда-выражений:

namespace expr = boost::log::expressions;

sink->set_formatter
(
    expr::stream
        << "[" << expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S") << "]"
        << "[" << boost::log::trivial::severity << "] "
        << expr::smessage
);

Пример использования strftime:

auto my_formatter = [](boost::log::record_view const& rec, boost::log::formatting_ostream& strm)
{
    if (auto timestamp = boost::log::extract< boost::posix_time::ptime >("TimeStamp", rec))
    {
        std::tm ts = boost::posix_time::to_tm(*timestamp);

        char buf[128];
        if (std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &ts) > 0)
            strm << "[" << buf << "]";
    }

    strm << "[" << rec[boost::log::trivial::severity] << "] ";
    strm << rec[boost::log::expressions::smessage];
};
...