← Назад к главному
# 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