Как мне записать метку времени сообщения в файл журнала? - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь создать файл журнала для моей программы на C ++.Моя цель - поставить две метки времени в двух точках моей программы и напечатать в файле период времени между этими двумя точками.Я делаю это потому, что хочу знать, какие части моего кода занимают больше всего времени, чтобы я мог вносить улучшения (поэтому может быть несколько кусков кода, которые я хочу измерить).До сих пор я создал функцию, которая при вызове печатает строку, которую я передаю в качестве аргумента, в файл:

#define LOGFILE "myprog.log"
void Log (std::string message){
    std::ofstream ofs;
    ofs.open(LOGFILE, std::ofstream::out | std::ios::app);
    ofs << message << std::endl;
    ofs.close();
}

Однако мне трудно понять, как распечататьОтметка времени процессора.Во-первых, я не знаю, какой формат измерения времени мне следует использовать (я должен использовать типы chrono или time_t?) Я пытаюсь распечатать период времени, поэтому было бы полезно, если бы был тип для длительности (I 'мы пробовали chrono :: duration, но, похоже, требуется поддержка C ++ 11).Во-вторых, если я знаю, какой тип использовать, как мне напечатать его в файл?Есть ли способ привести этот тип к строке?Или я могу передать это непосредственно моей функции и напечатать как-нибудь?

Это очень беспокоило меня в последние пару дней, и я не могу понять это, поэтому любой вклад был бы действительно полезным.Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Если вы хотите более ручной подход, это то, что я использовал раньше

char buffer[MAX_BUFFER_SIZE];

time_t t = time(NULL);
struct tm *lt = localtime(&t);

snprintf(buffer, MAX_BUFFER_SIZE, "%02d/%02d/%02d %02d:%02d:%02d", lt->tm_mon+1, lt->tm_mday, lt->tm_year%100, lt->tm_hour, lt->tm_min, lt->tm_sec);

Затем просто выведите buffer , который теперь содержит строковое представление времени, в ваш файл.

0 голосов
/ 09 октября 2018

Получить метку времени процессора

Вам понадобится std::chrono::system_clock, чтобы получить эту метку времени. Не используйте std::chrono::steady_clock или std::chrono::high_resolution_clock, так как они предназначены для высокоточных измерений времени и не гарантируют точность или точность времени настенного времени.

auto now = std::chrono::system_clock::now();
//now is a time_point object describing the instant it was recorded according to your system clock

Напечатайте эту метку времени процессора в читаемом формате

В C ++ 20 это довольно тривиально.

std::string formatted_time = std::chrono::format("%F_%T", now);
ofs << formatted_time << ": " << message << std::endl;
  • %F является заменой %Y-%m-%D, что будетвыводить год-месяц-день в формате ISO, т.е. 2018-10-09.
  • %T - то же самое для %H:%M:%S, который будет выводить время, т.е. 17:55:34.786

См. Спецификацию для std::chrono::format для получения дополнительных параметров / подробностей.

До C ++ 20

Рассмотрим Библиотека Говарда Хиннанта date , большая часть которой включена в C ++ 20 как новую часть библиотеки chrono.Функция format, найденная в этой библиотеке, использует тот же синтаксис, который был предложен выше для версии C ++ 20.

0 голосов
/ 09 октября 2018

Я обычно использую свою реализацию для таких вещей.

#include <chrono>
#include <ctime>


// strftime format
#define LOGGER_PRETTY_TIME_FORMAT "%Y-%m-%d %H:%M:%S"

// printf format
#define LOGGER_PRETTY_MS_FORMAT ".%03d"


// convert current time to milliseconds since unix epoch
template <typename T>
static int to_ms(const std::chrono::time_point<T>& tp)
{
    using namespace std::chrono;

    auto dur = tp.time_since_epoch();
    return static_cast<int>(duration_cast<milliseconds>(dur).count());
}


// format it in two parts: main part with date and time and part with milliseconds
static std::string pretty_time()
{
    auto tp = std::chrono::system_clock::now();
    std::time_t current_time = std::chrono::system_clock::to_time_t(tp);

    // this function use static global pointer. so it is not thread safe solution
    std::tm* time_info = std::localtime(&current_time);

    char buffer[128];

    int string_size = strftime(
        buffer, sizeof(buffer),
        LOGGER_PRETTY_TIME_FORMAT,
        time_info
    );

    int ms = to_ms(tp) % 1000;

    string_size += std::snprintf(
        buffer + string_size, sizeof(buffer) - string_size,
        LOGGER_PRETTY_MS_FORMAT, ms
    );

    return std::string(buffer, buffer + string_size);
}

Возвращает текущее время в формате: 2018-09-23 21:58:52.642.

Да, требуется --std=c++11 или выше.

...