# Пакетная отправка логов - Серверная часть ## Новый endpoint для пакетной отправки логов ### POST `/logs/batch` Принимает JSON с массивом логов и сохраняет их в базу данных одним запросом. #### Формат запроса: ```json { "logs": [ { "type": "nmea", "message": "$GPGGA,123456.00,5542.1234,N,03741.5678,E,1,08,1.0,545.4,M,46.9,M,,*47", "color": "#8AB4F8", "timestamp": 1642248000000 }, { "type": "errors", "message": "[2024-01-15 12:00:00] AIS_PARSE_ERROR: Ошибка парсинга AIS: Неверная контрольная сумма", "color": "#FF8A80", "timestamp": 1642248001000 }, { "type": "ships", "message": "MMSI: 123456789 | Class A: lat=55.123456, lon=37.123456, course=45.0, speed=12.5", "color": "#FF5733", "timestamp": 1642248002000 }, { "type": "ble", "message": "BLE Data from AA:BB:CC:DD:EE:FF: $GPGGA,123456.00,5542.1234,N,03741.5678,E,1,08,1.0,545.4,M,46.9,M,,*47", "color": "#8AB4F8", "timestamp": 1642248003000 } ] } ``` #### Реализация на Python (Flask): ```python @app.route("/logs/batch", methods=["POST"]) def add_logs_batch(): try: data = request.get_json() logs = data.get("logs", []) if not logs: return "No logs provided", 400 # Подготавливаем данные для batch INSERT log_data = [] for log in logs: log_data.append(( log.get("type", "unknown"), log.get("message", ""), log.get("color", "#FFFFFF"), datetime.fromtimestamp(log.get("timestamp", 0) / 1000) if log.get("timestamp") else datetime.now() )) # Batch INSERT всех логов одним запросом with get_conn() as conn: with conn.cursor() as cur: cur.executemany( "INSERT INTO logs (log_type, message, color, ts) VALUES (%s, %s, %s, %s)", log_data ) conn.commit() return f"Added {len(logs)} logs successfully", 200 except Exception as e: print(f"Error processing batch logs: {e}") return f"Error: {str(e)}", 500 ``` ## Преимущества пакетной отправки: ✅ **Производительность**: 1 HTTP запрос вместо N запросов ✅ **Надежность**: Retry на уровне пакета ✅ **Контроль нагрузки**: Отправка раз в секунду ✅ **Все логи сохраняются**: Ничего не теряется ✅ **Меньше нагрузки на сервер**: Batch INSERT вместо множественных INSERT ## Типы логов: - `nmea` - NMEA сообщения (синий цвет) - `errors` - Ошибки парсинга (красный цвет) - `ships` - Информация о кораблях (уникальный цвет по MMSI) - `ble` - BLE данные (синий цвет) ## Обработка ошибок: - При ошибке HTTP запроса логи возвращаются в буфер - Retry происходит автоматически через секунду - Сервер возвращает HTTP 200 при успехе, 500 при ошибке