← Назад к вопросам

Откуда брать лоды

2.0 Middle🔥 171 комментариев
#Язык C++#Linux и операционные системы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Откуда брать логи в C++ приложении

В C++ backend разработке логи — это критически важный инструмент для отладки и мониторинга. Рассмотрю основные источники и способы получения логов.

1. Логирование в самом приложении

Встроенное логирование через cout/cerr (плохой способ)

std::cout << "User logged in: " << user_id << std::endl;
std::cerr << "Error occurred" << std::endl;

Проблемы: нет уровней логирования, сложно фильтровать, не масштабируется.

2. Профессиональные логирующие библиотеки

spdlog — рекомендуемая для production

#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"

auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("app.log");
auto logger = std::make_shared<spdlog::logger>("file_logger", file_sink);

logger->info("Application started");
logger->error("Database connection failed: {}", error_msg);
logger->debug("User {} accessed resource {}", user_id, resource_id);

Преимущества: уровни (debug, info, warn, error), ротация файлов, асинхронное логирование, форматирование.

Boost.Log — мощная альтернатива

#include <boost/log/trivial.hpp>

BOOST_LOG_TRIVIAL(info) << "Processing request";
BOOST_LOG_TRIVIAL(error) << "Failed to connect to database";

3. Системные логи

Linux/Unix — syslog

#include <syslog.h>

openlog("myapp", LOG_PID, LOG_USER);
syslog(LOG_INFO, "Application started");
syslog(LOG_ERR, "Error: %s", strerror(errno));
closelog();

Логи попадают в /var/log/syslog или /var/log/messages.

4. Файловая система

Прямая запись в файл

#include <fstream>

std::ofstream log_file("app.log", std::ios::app);
log_file << "[" << get_timestamp() << "] " << message << std::endl;

Проблема: слабое форматирование, нет ротации. Используй spdlog вместо этого.

5. Стандартные потоки

stdout и stderr

./myapp > app.log 2> app.error.log  # Перенаправление из shell

6. Контейнеры и оркестрация

Docker — логирование в контейнер

std::cout << "Log message" << std::endl;  // Попадает в docker logs
docker logs container_name
docker logs -f container_name  # Follow mode

Kubernetes

kubectl logs pod-name
kubectl logs -f pod-name -n namespace

7. Удаленное логирование

Отправка в centralized log system

// spdlog с TCP sink
#include "spdlog/sinks/tcp_sink.h"

auto tcp_sink = std::make_shared<spdlog::sinks::tcp_sink_mt>("log.server.com", 5000);
auto logger = std::make_shared<spdlog::logger>("remote", tcp_sink);

Популярные системы: ELK Stack (Elasticsearch-Logstash-Kibana), Graylog, Splunk, Loki.

8. Структурированное логирование

JSON логи для machine-readable формата

// Используй spdlog с форматом JSON
logger->info("user_action", spdlog::sinks::json_sink{{
  {"user_id", 123},
  {"action", "login"},
  {"timestamp", get_iso8601_timestamp()}
}});

Рекомендуемый подход для production

Используй spdlog:

  1. Логирование в файл с ротацией
  2. Уровни: DEBUG для development, INFO для production
  3. Асинхронное логирование для минимизации overhead'а
  4. JSON формат для удобной обработки
  5. Отправка критических ошибок в удаленный сервис мониторинга

Лучшие практики:

  • Логируй достаточно информации для отладки
  • Не логируй чувствительные данные (пароли, токены)
  • Используй разные уровни логирования
  • Ротируй логфайлы, чтобы не заполнили диск
  • Централизуй логи для анализа множества серверов
Откуда брать лоды | PrepBro