# CTsLogger - Простой и гибкий логгер для торговой системы ***CTsLogger*** - простая и гибкая система логирования, специально разработанная для создания и отладки торговых систем на MQL5. Основное преимущество CTsLogger - возможность временного включения отладочного режима для конкретных модулей или участков кода при сохранении более низкого глобального уровня логирования. Таким образом, вы можете получить детальное логирование определенных участков кода не "утонув" в потоке сообщений, а затем одной командой отключить его. ## Основные преимущества - **Простота использования**: Минимальная инициализация и легкий вызов методов логирования - **Гибкость отладки**: Возможность включать режим отладки для отдельных модулей даже при низком глобальном уровне логирования - **Иерархическая структура**: Поддержка иерархических идентификаторов модулей для организации логики - **Управление состоянием**: Возможность приостановки и возобновления режима отладки без потери настроек - **Надежность**: Продолжает работу даже при ошибках файловой системы (деградация до вывода в терминал) - **Минимальные зависимости**: Работает самостоятельно без необходимости подключения других компонентов ## Начало работы ```mql5 // Подключение логгера #include "CTsLogger.mqh" // Создание экземпляра CTsLogger *Logger = new CTsLogger(); // Инициализация с выводом в файл и терминал Logger.Initialize("mylog.log", true); // Установка глобального уровня логирования Logger.SetGlobalLogLevel(LOG_LEVEL_INFO); // Использование логирования Logger.Info("MyModule", "Система инициализирована"); // Важно: не забудьте освободить ресурсы по завершении delete Logger; Logger = NULL; ``` ## Уровни логирования CTsLogger поддерживает 4 уровня логирования, в порядке возрастающей детализации: 1. `LOG_LEVEL_ERROR` - только ошибки 2. `LOG_LEVEL_WARNING` - предупреждения и ошибки 3. `LOG_LEVEL_INFO` - информационные сообщения, предупреждения и ошибки 4. `LOG_LEVEL_DEBUG` - отладочные сообщения, информационные сообщения, предупреждения и ошибки ## Иерархические идентификаторы модулей CTsLogger поддерживает иерархические идентификаторы модулей, разделенные точкой, что позволяет организовать модули в логическую структуру:: ```mql5 // Включение отладки для родительского модуля Logger.EnableDebugMode("TradeModule"); // Все дочерние модули автоматически находятся в режиме отладки Logger.Debug("TradeModule.OrderExecution", "Этот лог отобразится"); Logger.Debug("TradeModule.RiskControl", "И этот тоже отобразится"); // Отключение отладки для родительского модуля Logger.DisableDebugMode("TradeModule"); // Теперь логи не будут отображаться ни для родительского, ни для дочерних модулей Logger.Debug("TradeModule", "Этот лог НЕ отобразится"); Logger.Debug("TradeModule.OrderExecution", "Этот лог тоже НЕ отобразится"); ``` Иерархия может иметь любую глубину вложенности: - "TradeModule" - "TradeModule.OrderExecution" - "TradeModule.OrderExecution.StopLoss" - "TradeModule.RiskControl.Sizing" ## Гибкое управление отладкой Основное преимущество CTsLogger - возможность временного включения отладочного режима для конкретных модулей при сохранении более низкого глобального уровня логирования. ```mql5 // Включение отладки для конкретного модуля Logger.EnableDebugMode("TradeModule.OrderExecution"); // Теперь эти сообщения будут выводиться даже при глобальном уровне INFO Logger.Debug("TradeModule.OrderExecution", "Проверка параметров..."); // Проверка, включен ли режим отладки if(Logger.IsInDebugMode("TradeModule.OrderExecution")) { // Выполнить дополнительные действия } // Отключение режима отладки Logger.DisableDebugMode("TradeModule.OrderExecution"); ``` ## Приостановка и возобновление режима отладки CTsLogger позволяет временно приостановить режим отладки для всех модулей: ```mql5 // Включаем отладку для нескольких модулей Logger.EnableDebugMode("TradeModule"); Logger.EnableDebugMode("RiskManager"); Logger.EnableDebugMode("Analytics"); // Приостанавливаем режим отладки для всех модулей Logger.PauseDebugMode(); // В этот момент отладочные сообщения не будут отображаться Logger.Debug("TradeModule", "Этот лог НЕ отобразится"); Logger.Debug("RiskManager", "Этот лог НЕ отобразится"); // Возобновляем режим отладки Logger.ResumeDebugMode(); // Теперь отладочные сообщения снова будут отображаться Logger.Debug("TradeModule", "Этот лог отобразится"); Logger.Debug("RiskManager", "Этот лог отобразится"); ``` ## Полный API ### Создание и инициализация - `CTsLogger()` - конструктор - `~CTsLogger()` - деструктор - `Initialize(string logFileName, bool logToTerminal = true)` - инициализация логгера - `SetGlobalLogLevel(ENUM_LOG_LEVEL level)` - установка глобального уровня логирования ### Методы логирования - `Error(string moduleId, string message)` - логирование ошибок - `Warning(string moduleId, string message)` - логирование предупреждений - `Info(string moduleId, string message)` - логирование информационных сообщений - `Debug(string moduleId, string message)` - логирование отладочных сообщений ### Базовое управление отладочным режимом - `EnableDebugMode(string moduleId)` - включение режима отладки для модуля - `DisableDebugMode(string moduleId)` - отключение режима отладки для модуля и всех его дочерних модулей - `IsInDebugMode(string moduleId)` - проверка, включен ли режим отладки - `EnableDebugModeAll()` - включение режима отладки для всех модулей - `DisableDebugModeAll()` - отключение глобального режима отладки с сохранением настроек модулей ### Расширенное управление отладочным режимом - `PauseDebugMode()` - временная приостановка режима отладки для всех модулей - `ResumeDebugMode()` - возобновление режима отладки для ранее настроенных модулей - `IsDebugModePaused()` - проверка, находится ли режим отладки на паузе - `ResetDebugModules()` - полный сброс всех отладочных модулей - `HasChildDebugModules(string parentModule)` - проверка наличия дочерних модулей в режиме отладки ## Примеры использования ### Базовое логирование ```mql5 // Создание и инициализация CTsLogger *Logger = new CTsLogger(); Logger.Initialize("system.log"); Logger.SetGlobalLogLevel(LOG_LEVEL_INFO); // Логирование Logger.Info("System", "Система запущена"); Logger.Warning("Trade", "Необычный объем на рынке"); Logger.Error("DataFeed", "Ошибка получения данных"); Logger.Debug("Strategy", "Расчет индикатора: RSI=70.2"); // не выведется при уровне INFO // Освобождение ресурсов delete Logger; Logger = NULL; ``` ### Отладка проблемной части кода с использованием иерархии модулей ```mql5 CTsLogger *Logger = new CTsLogger(); Logger.Initialize("debug.log"); // Включаем отладку для всего модуля ордеров Logger.EnableDebugMode("OrderManager"); // Отладочные сообщения будут видны для всех подмодулей Logger.Debug("OrderManager.Market", "Проверка рыночных ордеров"); Logger.Debug("OrderManager.Pending", "Проверка отложенных ордеров"); Logger.Debug("OrderManager.StopLoss", "Расчет уровня стоп-лосс"); // Отключаем отладку только для подмодуля рыночных ордеров Logger.DisableDebugMode("OrderManager.Market"); // Сообщение не отобразится Logger.Debug("OrderManager.Market", "Это НЕ отобразится"); // А эти сообщения продолжат отображаться Logger.Debug("OrderManager.Pending", "Это отобразится"); Logger.Debug("OrderManager.StopLoss", "Это отобразится"); // Отключаем отладку для всего модуля ордеров и его подмодулей Logger.DisableDebugMode("OrderManager"); // Освобождение ресурсов delete Logger; Logger = NULL; ``` ### Использование приостановки отладки ```mql5 CTsLogger *Logger = new CTsLogger(); Logger.Initialize("debug.log"); // Настройка множества модулей в режиме отладки Logger.EnableDebugMode("TradeModule"); Logger.EnableDebugMode("RiskManager"); Logger.EnableDebugMode("Analytics"); // Во время выполнения критической операции временно отключаем отладку Logger.PauseDebugMode(); // Выполнение операции без вывода отладочных сообщений ExecuteCriticalOperation(); // Возобновляем отладку с ранее настроенными модулями Logger.ResumeDebugMode(); // Если нужно полностью сбросить все отладочные модули Logger.ResetDebugModules(); // Освобождение ресурсов delete Logger; Logger = NULL; ``` ### Использование в советнике ```mql5 // Глобальная переменная класса CTsLogger *Logger = NULL; int OnInit() { // Создаем экземпляр логгера Logger = new CTsLogger(); Logger.Initialize("ea_" + Symbol() + ".log"); Logger.SetGlobalLogLevel(LOG_LEVEL_INFO); // Включаем отладку для конкретных модулей if(IsTesting()) { Logger.EnableDebugMode("Signal"); Logger.EnableDebugMode("OrderExecution"); } Logger.Info("Expert", "Советник инициализирован на " + Symbol()); return INIT_SUCCEEDED; } void OnDeinit(const int reason) { if(Logger != NULL) { Logger.Info("Expert", "Советник остановлен. Причина: " + string(reason)); // Освобождаем ресурсы логгера delete Logger; Logger = NULL; } } void OnTick() { if(Logger == NULL) return; Logger.Debug("Expert.OnTick", "Новый тик получен"); // Основная логика советника // При необходимости временно приостановить отладку if(IsHighVolatilityPeriod()) { Logger.PauseDebugMode(); ExecuteHighPriorityOperations(); Logger.ResumeDebugMode(); } } ``` ## Советы по оптимизации - **Используйте иерархическую структуру модулей**: - Разделяйте функциональность по логическим группам - Используйте префиксы для связанных модулей (например, "Trade.Open", "Trade.Close") - Ограничивайте глубину иерархии до 2-3 уровней для читаемости - **Управляйте отладкой эффективно**: - Включайте отладку только для проблемных модулей - Используйте PauseDebugMode() для временного отключения большого количества логов - Отключайте отладку для модулей после решения проблемы - **Управление ресурсами**: - Всегда освобождайте память, используя delete в конце работы - Устанавливайте указатель в NULL после удаления для избежания проблем с повторным использованием - Проверяйте на NULL перед использованием логгера