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

Как разобраться в проблеме, если все логи смешаны в Logstash?

2.2 Middle🔥 151 комментариев
#DevOps и инфраструктура

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

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

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

Анализ смешанных логов в Logstash

Это частая проблема в микросервисной архитектуре, когда логи от разных сервисов, потоков и запросов смешиваются в едином хранилище. Я применяю структурированный подход для отладки.

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

Первым шагом должно быть внедрение структурированного логирования — логи в JSON формате с контекстными полями.

import logging
import json
from pythonjsonlogger import jsonlogger
import uuid
from contextvars import ContextVar

request_id_var: ContextVar[str] = ContextVar("request_id", default=None)
trace_id_var: ContextVar[str] = ContextVar("trace_id", default=None)

class StructuredLogFormatter(jsonlogger.JsonFormatter):
    def add_fields(self, log_record, record, message_dict):
        super().add_fields(log_record, record, message_dict)
        log_record["request_id"] = request_id_var.get()
        log_record["trace_id"] = trace_id_var.get()
        log_record["service_name"] = "my-service"

2. Middleware для трассировки

@app.middleware("http")
async def add_request_context(request: Request, call_next):
    request_id = request.headers.get("X-Request-ID", str(uuid.uuid4()))
    trace_id = request.headers.get("X-Trace-ID", str(uuid.uuid4()))
    
    request_id_var.set(request_id)
    trace_id_var.set(trace_id)
    
    response = await call_next(request)
    response.headers["X-Request-ID"] = request_id
    response.headers["X-Trace-ID"] = trace_id
    return response

3. Kibana поиск

service_name: "auth-service" AND level: ERROR
user_id: "user-123" AND timestamp >= 2024-01-01T00:00:00Z
duration_ms: >= 1000 AND path: "/api/*"

4. Скрипт анализа логов

import json
from collections import defaultdict

def analyze_logs(log_file: str, request_id: str = None):
    logs_by_service = defaultdict(list)
    errors = []
    
    with open(log_file, "r") as f:
        for line in f:
            try:
                log = json.loads(line)
            except json.JSONDecodeError:
                continue
            
            if request_id and log.get("request_id") != request_id:
                continue
            
            service = log.get("service_name", "unknown")
            logs_by_service[service].append(log)
            
            if log.get("level") == "ERROR":
                errors.append(log)
    
    return logs_by_service, errors

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

1. request_id в каждом логе — связывает логи одного запроса 2. trace_id для распределённых систем — отслеживает микросервисы 3. Структурированный JSON — упрощает парсинг и поиск 4. Контекст сервиса — группирует логи по источникам 5. Метаданные — duration_ms, user_id, status_code для анализа

Инструменты

grep "request_id" /var/log/app.log | jq "."
jq -s "sort_by(.timestamp)" /var/log/app.log
jq "select(.level == \"ERROR\")" /var/log/app.log

Структурированные логи с правильной трассировкой превращают хаос в упорядоченную диагностику.

Как разобраться в проблеме, если все логи смешаны в Logstash? | PrepBro