ws-log-proxy/README.md
2026-01-23 10:05:12 +07:00

6.0 KiB
Raw Permalink Blame History

WebSocket Log Proxy - Логирующий WebSocket прокси для анализа WebSocket соединений

WebSocket реверс-прокси на Go, который логирует все WebSocket соединения и сообщения для анализа WebSocket API.

Возможности

  • Перехват и логирование WebSocket подключений (connect/disconnect)
  • Логирование всех входящих сообщений (от клиента к серверу)
  • Логирование всех исходящих сообщений (от сервера к клиенту)
  • Поддержка текстовых и бинарных сообщений
  • Автоматическое форматирование JSON в логах
  • Красивый консольный вывод и JSON формат
  • Сохранение оригинальных заголовков и путей
  • Двунаправленная пересылка сообщений в реальном времени

Установка

go mod download

Использование

Способ 1: Через аргументы командной строки

go run main.go ws://echo.websocket.org

Способ 2: Через переменные окружения

export TARGET_URL=ws://echo.websocket.org
export PORT=8080  # опционально, по умолчанию 8020
go run main.go

Способ 3: Сборка и запуск

go build -o ws-log-proxy
./ws-log-proxy ws://echo.websocket.org

Примеры

Базовое использование

# Запуск прокси на порту 8020, перенаправление на ws://echo.websocket.org
go run main.go ws://echo.websocket.org

# В другом терминале подключаемся через прокси
# Используя wscat (npm install -g wscat)
wscat -c ws://localhost:8020

# Или используя Python
python3 -c "import websocket; ws = websocket.create_connection('ws://localhost:8020'); ws.send('Hello'); print(ws.recv())"

С кастомным портом

PORT=3000 go run main.go ws://echo.websocket.org

С защищенным WebSocket (WSS)

go run main.go wss://secure-websocket-server.com

Логирование в файл

go run main.go ws://echo.websocket.org 2>&1 | tee ws-logs.txt

Формат логов

Прокси выводит логи в двух форматах:

  1. Человекочитаемый формат - красивый вывод в консоль с разделителями
  2. JSON формат - структурированные данные для дальнейшей обработки

Каждая запись содержит:

  • Временную метку
  • События подключения/отключения
  • Направление сообщений (incoming/outgoing)
  • Тип сообщения (text/binary)
  • Содержимое сообщений
  • Заголовки HTTP запроса

Пример вывода

================================================================================
[2024-01-15 10:30:45] WebSocket CONNECT
Remote: 127.0.0.1:52341
URL: /echo

Headers:
  Upgrade: websocket
  Connection: Upgrade
  Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
================================================================================

--------------------------------------------------------------------------------
[2024-01-15 10:30:46] ← INCOMING Message (Text)
Remote: 127.0.0.1:52341

Message:
{
  "type": "hello",
  "message": "Hello, WebSocket!"
}
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
[2024-01-15 10:30:46] → OUTGOING Message (Text)
Remote: 127.0.0.1:52341

Message:
{
  "type": "echo",
  "message": "Hello, WebSocket!"
}
--------------------------------------------------------------------------------

================================================================================
[2024-01-15 10:30:50] WebSocket DISCONNECT
Remote: 127.0.0.1:52341
URL: /echo
================================================================================

JSON формат лога

В конце каждой сессии выводится полный JSON лог со всеми сообщениями:

{
  "connection": {
    "timestamp": "2024-01-15T10:30:45Z",
    "event": "connect",
    "remote_addr": "127.0.0.1:52341",
    "url": "/echo",
    "headers": {...}
  },
  "messages": [
    {
      "timestamp": "2024-01-15T10:30:46Z",
      "direction": "incoming",
      "message": "{\"type\":\"hello\"}",
      "message_type": 1,
      "remote_addr": "127.0.0.1:52341"
    },
    {
      "timestamp": "2024-01-15T10:30:46Z",
      "direction": "outgoing",
      "message": "{\"type\":\"echo\"}",
      "message_type": 1,
      "remote_addr": "127.0.0.1:52341"
    }
  ]
}

Примечания

  • JSON сообщения автоматически форматируются для лучшей читаемости
  • Бинарные сообщения отображаются как [Binary: N bytes]
  • Все оригинальные заголовки сохраняются и передаются на целевой сервер
  • Прокси поддерживает как обычные WebSocket (ws://), так и защищенные (wss://)
  • Сообщения логируются в реальном времени по мере их передачи

Отличия от HTTP версии

  • Логирует WebSocket соединения вместо HTTP запросов/ответов
  • Поддерживает двунаправленный поток сообщений
  • Логирует каждое сообщение отдельно
  • Отслеживает события подключения и отключения