Как просматривать логи приложения в C++ без графического интерфейса (GUI)?

«Как просматривать логи приложения в C++ без графического интерфейса (GUI)?» — вопрос из категории Linux и ОС, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, конечно. В C++ логи обычно пишутся в стандартные потоки вывода (std::cout, std::cerr) или в файлы. Для просмотра используются консольные утилиты.

1. Запись логов в C++:

#include <iostream>
#include <fstream>
#include <chrono>
#include <iomanip>

void log_to_file(const std::string& message) {
    std::ofstream log_file("app.log", std::ios::app); // Открываем для добавления
    if (log_file.is_open()) {
        auto now = std::chrono::system_clock::now();
        auto now_time = std::chrono::system_clock::to_time_t(now);
        log_file << std::put_time(std::localtime(&now_time), "%Y-%m-%d %H:%M:%S")
                 << " | " << message << std::endl;
    }
}

int main() {
    std::cout << "Информационное сообщениеn"; // stdout
    std::cerr << "Сообщение об ошибкеn";       // stderr
    log_to_file("Запуск приложения");
    return 0;
}

2. Просмотр логов в Linux/Unix:

  • cat app.log – вывести весь файл.
  • tail -f app.log – выводить новые записи в реальном времени (слежение).
  • grep "ERROR" app.log – фильтрация по ключевому слову.
  • less app.log – постраничный просмотр с поиском.

3. Перенаправление потоков при запуске:

# Все выводы (stdout и stderr) в файл
./my_app > output.log 2>&1

# stdout в один файл, stderr в другой
./my_app > stdout.log 2> stderr.log

# stdout в файл, stderr в консоль
./my_app > output.log

4. Использование системного журнала (syslog):

#include <syslog.h>

int main() {
    openlog("my_cpp_app", LOG_PID | LOG_CONS, LOG_USER);
    syslog(LOG_INFO, "Приложение запущено (PID = %d)", getpid());
    syslog(LOG_ERR, "Критическая ошибка!");
    closelog();
    return 0;
}

Просмотр: journalctl -t my_cpp_app или tail -f /var/log/syslog.