Какие инструменты используются для просмотра логов
Что проверяют
Видели ли вы прод. Локально логи читают через tail, но в кластере из двадцати подов такой ответ значит, что вы искали ошибку только на своей машине. Вопрос о том, как вы находите одну конкретную ошибку среди миллионов строк. Обычно следом спрашивают, как связать записи одного запроса между сервисами.
Как отвечать
Идите снизу вверх, от кода к платформе:
- в приложении: фасад SLF4J и реализация Logback или Log4j 2. В Spring Boot по умолчанию Logback, уровни
TRACE,DEBUG,INFO,WARN,ERRORменяются без перезапуска через/actuator/loggers; - формат: JSON вместо человеческого текста (например,
logstash-logback-encoder). Искать по структурированным полям дешевле, чем писать регулярки по свободной строке; - сквозной идентификатор:
traceIdиspanIdв MDC, их проставляет Micrometer Tracing или агент OpenTelemetry. Без этого логи нескольких сервисов не склеиваются в одну историю; - локально и в контейнере:
tail -f,grep,jqпо JSON-логам,docker logs -f --since 10m, в Kuberneteskubectl logs -f,--previousдля упавшего контейнера иsternсразу по нескольким подам; - централизованно: Elastic Stack или OpenSearch с Filebeat и Kibana, Grafana Loki с Alloy (индексирует метки, а не текст, поэтому заметно дешевле по диску), Graylog, из коммерческих Splunk и Datadog;
- ротация и хранение:
RollingFileAppenderс политикой по размеру и времени, разный срок хранения для горячих и холодных логов.
Хорошо закончить связкой трёх сигналов: по алерту в Grafana переходите к трейсу, из трейса по traceId к логам конкретного запроса.
Где спотыкаются
Называют только ELK и не могут объяснить, кто доставляет строки и почему они вообще попадают в Elasticsearch.
Не различают фасад и реализацию, из-за чего в проекте оказываются одновременно Log4j 2, Logback и JUL, а часть логов теряется. Отдельно стоит помнить про e.printStackTrace(): это запись мимо всей конфигурации.
Включают DEBUG на проде «на время разбора» и заливают диск. Плюс кладут в логи токены, номера карт и персональные данные, а потом это невозможно вычистить из индекса.