← Назад к главному
# logger.rs - Универсальный JSONL-логгер ## 📋 Назначение модуля `Logger` - универсальный JSONL-логгер для записи событий в файлы. **Основная логика:** 1. **Создание папки сессии** - создаёт папку `logs/{session_id}` 2. **Запись событий** - пишет события в JSONL формат 3. **Разделение логов** - разные файлы для разных типов событий **Файлы:** - `logs/{session}/monitor.jsonl` - логи MONITOR - `logs/{session}/live.jsonl` - логи LIVE - `logs/{session}/system.jsonl` - системные логи - `logs/{session}/actions.jsonl` - действия (ордера) **Используется в:** - `src/main.rs` - глобальный логгер и логгер сессии - `src/live/step.rs` - логирование actions --- ## 🏗️ Структура модуля ### Структура `Logger` **Строки:** 16-19 ```rust pub struct Logger { base_dir: String, session_dir: String, } ``` **Поля:** | Поле | Тип | Описание | |------|-----|----------| | `base_dir` | String | Базовая директория (например, "logs") | | `session_dir` | String | Директория сессии (например, "logs/sess-123456") | --- ## 🔄 Основные функции ### Функция `Logger::new()` **Строки:** 22-30 **Сигнатура:** ```rust pub fn new(base: &str, session_id: &str) -> std::io::Result ``` **Параметры:** - `base` - базовая директория (например, "logs") - `session_id` - ID сессии (например, "sess-123456") **Возвращает:** - `Ok(Logger)` - логгер создан - `Err` - ошибка создания директории **Алгоритм:** ```rust let session_dir = format!("{}/{}", base, session_id); create_dir_all(&session_dir)?; Ok(Self { base_dir: base.to_string(), session_dir, }) ``` **Что делает:** - Формирует путь к директории сессии - Создаёт директорию (и все родительские) **Пример:** ``` base = "logs" session_id = "sess-123456" session_dir = "logs/sess-123456" Создаёт директорию: logs/sess-123456/ ``` --- ### Функция `Logger::write_jsonl()` **Строки:** 33-60 **Сигнатура:** ```rust fn write_jsonl( &mut self, file: &str, message: &str, data: Option<&Value>, ) -> std::io::Result<()> ``` **Параметры:** - `file` - имя файла (например, "monitor", "live", "system", "actions") - `message` - сообщение события - `data` - дополнительные данные (JSON) **Возвращает:** - `Ok(())` - запись успешна - `Err` - ошибка записи **Алгоритм:** --- #### Этап 1: Формирование пути к файлу **Строка:** 39 ```rust let path = format!("{}/{}.jsonl", self.session_dir, file); ``` **Пример:** ``` session_dir = "logs/sess-123456" file = "monitor" path = "logs/sess-123456/monitor.jsonl" ``` --- #### Этап 2: Открытие файла **Строки:** 41-44 ```rust let mut f = OpenOptions::new() .create(true) .append(true) .open(path)?; ``` **Что делает:** - Создаёт файл если его нет - Открывает в режиме дозаписи --- #### Этап 3: Генерация timestamp **Строка:** 46 ```rust let ts = Utc::now().timestamp(); ``` --- #### Этап 4: Формирование JSON объекта **Строки:** 48-54 ```rust let mut obj = serde_json::Map::new(); obj.insert("ts".into(), ts.into()); obj.insert("message".into(), message.into()); if let Some(v) = data { obj.insert("data".into(), v.clone()); } ``` **Поля JSON:** - `ts` - timestamp - `message` - сообщение - `data` - дополнительные данные (опционально) --- #### Этап 5: Сериализация и запись **Строки:** 56-57 ```rust let json = serde_json::Value::Object(obj).to_string(); writeln!(f, "{}", json)?; ``` **Пример JSON:** ```json {"ts":1771747635,"message":"Selected: MEMES_USDT","data":{"symbol":"MEMES_USDT","score":12.3}} ``` --- ### Функция `Logger::log_monitor()` **Строки:** 66-72 **Сигнатура:** ```rust pub fn log_monitor( &mut self, message: &str, data: Option<&Value>, ) -> std::io::Result<()> ``` **Алгоритм:** ```rust self.write_jsonl("monitor", message, data) ``` **Что делает:** - Записывает событие MONITOR в `monitor.jsonl` **Пример использования:** ```rust logger.log_monitor( "✅ Выбрана пара для трейдинга", Some(&serde_json::json!({ "selected_pair": "MEMES_USDT", "mode": "LIVE" })), )?; ``` **Пример записи:** ```json {"ts":1771747635,"message":"✅ Выбрана пара для трейдинга","data":{"selected_pair":"MEMES_USDT","mode":"LIVE"}} ``` --- ### Функция `Logger::log_system()` **Строки:** 74-82 **Сигнатура:** ```rust pub fn log_system( &mut self, level: &str, module: &str, message: &str, ) -> std::io::Result<()> ``` **Параметры:** - `level` - уровень логирования (INFO, ERROR, WARN) - `module` - имя модуля - `message` - сообщение **Алгоритм:** ```rust let obj = serde_json::json!({ "level": level, "module": module }); self.write_jsonl("system", message, Some(&obj)) ``` **Что делает:** - Записывает системное событие в `system.jsonl` - Включает level и module в data **Пример использования:** ```rust logger.log_system( "INFO", "balance", "Реальный баланс с Gate.io: 100.123456 USDT", )?; ``` **Пример записи:** ```json {"ts":1771747635,"message":"Реальный баланс с Gate.io: 100.123456 USDT","data":{"level":"INFO","module":"balance"}} ``` --- ### Функция `Logger::log_live()` **Строки:** 84-90 **Сигнатура:** ```rust pub fn log_live( &mut self, message: &str, data: Option<&Value>, ) -> std::io::Result<()> ``` **Алгоритм:** ```rust self.write_jsonl("live", message, data) ``` **Что делает:** - Записывает событие LIVE в `live.jsonl` **Пример использования:** ```rust logger.log_live( "🔥 LIVE режим запущен", Some(&serde_json::json!({ "pair": "MEMES_USDT", "session_equity": 100.0 })), )?; ``` **Пример записи:** ```json {"ts":1771747635,"message":"🔥 LIVE режим запущен","data":{"pair":"MEMES_USDT","session_equity":100.0}} ``` --- ### Функция `Logger::log_action()` **Строки:** 92-107 **Сигнатура:** ```rust pub fn log_action( &mut self, action: &str, price: f64, qty: f64, reason: &str, ) -> std::io::Result<()> ``` **Параметры:** - `action` - тип действия (например, "OPEN_LONG", "CLOSE_SHORT") - `price` - цена ордера - `qty` - количество - `reason` - причина **Алгоритм:** ```rust let val = serde_json::json!({ "action": action, "price": price, "qty": qty, "reason": reason }); self.write_jsonl("actions", "ACTION", Some(&val)) ``` **Что делает:** - Записывает действие в `actions.jsonl` - Включает action, price, qty, reason в data **Пример использования:** ```rust logger.log_action( "OPEN_LONG", 0.002000, 1000.0, "Вход в позицию через CoreStrategy", )?; ``` **Пример записи:** ```json {"ts":1771747635,"message":"ACTION","data":{"action":"OPEN_LONG","price":0.002,"qty":1000.0,"reason":"Вход в позицию через CoreStrategy"}} ``` --- ## 📊 Формат файлов ### monitor.jsonl ```json {"ts":1771747635,"message":"🔍 MONITOR: mode=SCAN - ищу сверхволатильные ФЬЮЧЕРСЫ (15% - 1000%)...","data":null} {"ts":1771747636,"message":"✅ Выбрана пара для трейдинга","data":{"selected_pair":"MEMES_USDT","mode":"LIVE"}} ``` --- ### live.jsonl ```json {"ts":1771747637,"message":"🔥 LIVE режим запущен","data":{"pair":"MEMES_USDT","session_equity":100.0}} {"ts":1771747638,"message":"SESSION_TP_EXIT","data":{"action":"SESSION_TP_EXIT","price":0.002050,"qty":1000.0,"reason":"TP по сессии достигнут"}} ``` --- ### system.jsonl ```json {"ts":1771747635,"message":"Система trading AI (NEW LIVE) запущена","data":{"level":"INFO","module":"main"}} {"ts":1771747636,"message":"Redis PING/PONG - сервер работает","data":{"level":"INFO","module":"main"}} ``` --- ### actions.jsonl ```json {"ts":1771747637,"message":"ACTION","data":{"action":"OPEN_LONG","price":0.002,"qty":1000.0,"reason":"Вход в позицию через CoreStrategy"}} {"ts":1771747638,"message":"ACTION","data":{"action":"CLOSE_LONG","price":0.002060,"qty":500.0,"reason":"First cut at +3%"}} ``` --- ## 📚 Связанные файлы | Файл | Связь | |------|-------| | `src/main.rs` | Использует Logger для глобального логирования и логирования сессии | | `src/live/step.rs` | Использует logger.log_action() | --- ## 🎯 Резюме **Что делает logger.rs:** 1. ✅ Создаёт папку сессии `logs/{session_id}` 2. ✅ Записывает события в JSONL формат 3. ✅ Разделяет логи по типам (monitor, live, system, actions) **Logger методы:** - `new(base, session_id)` - создание логгера - `log_monitor(message, data)` - лог MONITOR - `log_system(level, module, message)` - системный лог - `log_live(message, data)` - лог LIVE - `log_action(action, price, qty, reason)` - лог действия **Файлы:** - `logs/{session}/monitor.jsonl` - логи MONITOR - `logs/{session}/live.jsonl` - логи LIVE - `logs/{session}/system.jsonl` - системные логи - `logs/{session}/actions.jsonl` - действия (ордера) **Формат JSONL:** ```json {"ts":1771747635,"message":"...","data":{...}} ``` **Критические моменты:** - 🔥 Файлы открываются в режиме дозаписи - 🔥 Каждая запись имеет timestamp - 🔥 Дополнительные данные в поле `data` --- **Дата создания:** 2026-02-22 **Автор:** Claude Code Assistant **Версия:** 1.0