Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

Logging V2 for both MQL4 and MQL5 - библиотека для MetaTrader 5

Просмотров:
32
Рейтинг:
(4)
Опубликован:
\MQL5\Include\ \MQL5\Experts\ \MQL5\Scripts\
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

CDebugLogger Class V2: Комплексная утилита протоколирования для MQL4/5

Класс CDebugLogger - это мощная и гибкая утилита протоколирования, специально разработанная для сред MQL4/5. Это незаменимый инструмент для разработчиков, которым необходимо точно контролировать, отлаживать и отслеживать поведение своих приложений.

В новой версии класса CDebugLogger я ввел несколько улучшений, чтобы расширить его функциональность и универсальность. Среди этих улучшений - механизм дебаггинга для предотвращения чрезмерной записи логов в системах, управляемых событиями, таких как OnTick, OnTimer и OnChartEvent, а также новые опции фильтрации и глушения, помогающие разработчикам сосредоточиться на наиболее важных записях логов.

Я решил выпустить эту обновленную версию в виде отдельной кодовой базы, чтобы дать пользователям свободу выбора реализации, которая лучше всего соответствует их потребностям. Независимо от того, предпочитаете ли вы оригинальную версию или эту улучшенную, теперь у вас есть возможность выбрать инструмент для ведения логов, который соответствует вашему рабочему процессу и требованиям проекта.

Ниже мы рассмотрим ключевые особенности и возможности этого усовершенствованного класса.

Ключевые особенности

  • Несколько уровней ведения журнала: Класс CDebugLogger поддерживает ведение журнала на разных уровнях важности, включая INFO, WARNING, ERROR и DEBUG. Это позволяет разработчикам фильтровать и фокусироваться на сообщениях особой важности.
  • Включение временных меток: Разработчики могут включать в сообщения журнала временные метки в настраиваемых форматах. Эта функция очень важна для отслеживания точного времени событий и отладки проблем, чувствительных к времени.
  • Файловое протоколирование: Класс обеспечивает надежную поддержку записи логов в файлы. Разработчики могут включить или отключить ведение журнала в файлах, указать путь к файлу журнала и выбрать, сохранять ли журналы в общей папке. Кроме того, журналы могут быть сохранены в формате CSV, что упрощает их разбор и анализ.
  • Контекстная информация: Для повышения наглядности сообщений журнала класс CDebugLogger позволяет включать сигнатуры функций, имена файлов и номера строк. Эта контекстная информация помогает точно определить местоположение проблем в коде.
  • Тихие ключевые слова: Уникальной особенностью этого класса является возможность глушить журналы, содержащие определенные ключевые слова. Это особенно полезно для предотвращения записи конфиденциальной информации, такой как пароли или конфиденциальные данные.
  • Фильтр ключевых слов: Еще одной уникальной особенностью этого класса является возможность фильтрации журналов, содержащих определенные ключевые слова. Это особенно полезно для отладки, поскольку позволяет сосредоточиться только на тех журналах, которые имеют отношение к конкретным проблемам. Разработчики могут сузить вывод журнала, включив в него только сообщения, содержащие определенные термины, что облегчает выявление и решение проблем, связанных с этими терминами, и не перегружает журнал не относящимися к делу записями.
  • Отказ от ведения журнала событий: Для предотвращения спама в журналах и чрезмерной регистрации в системах, управляемых событиями (например, OnTick, OnTimer и OnChartEvent), класс CDebugLogger включает механизм дебаггинга. Эта функция обеспечивает временное подавление повторяющихся записей в журнале от одного и того же события, позволяя регистрировать только уникальные или значительные изменения. Это особенно полезно для уменьшения шума в журналах и предотвращения снижения производительности в средах с высокой частотой событий.

Пример использования

Ниже приведен пример инициализации и использования класса CDebugLogger:

// Инициализируем регистратор с записью в файл на уровне INFO
CDebugLogger logger(INFO, true, "log.txt", true, TIME_DATE | TIME_MINUTES, false, true, true, true);

// Записать простое сообщение
logger.Log(INFO, "This is an info message");

// Заглушите ключевое слово
logger.AddSilentKeyword("password");

// Записать сообщение, которое будет заглушено
logger.Log(INFO, "User entered password: 1234");

// Включите регистрацию файлов
logger.EnableFileLogging(true, "debug.log", false);

// Удалите замолчавшее ключевое слово
logger.RemoveSilentKeyword("password");

// Выведите сообщение после удаления ключевого слова из списка молчания
logger.Log(INFO, "User entered password: 1234");

// Добавьте ключевое слово для фильтрации журналов
logger.AddFilterKeyword("success");

// Занесите в журнал сообщение, которое будет отфильтровано
logger.Log(INFO, "Operation failed");

// Запишите в журнал сообщение, которое пройдет фильтр
logger.Log(INFO, "Operation successful");

// Удалите ключевое слово из фильтра
logger.RemoveFilterKeyword("success");

// Инициализация с помощью общей функции Log
logging.Initialize(WARNING, true, "warnings.log", true, TIME_SECONDS, true, false, true, true);

// Занесите предупреждение в журнал, используя общую функцию Log
Log(WARNING, "This is a warning message");

Пример сценария

Чтобы использовать класс CDebugLogger в сценарии, просто включите необходимую библиотеку в начало файла, как показано ниже:

//--- Важно включить этот заголовочный файл перед всеми остальными
#include <Logging.mqh>  


//+------------------------------------------------------------------+
//| Функция запуска программы сценария|
//+------------------------------------------------------------------+
void OnStart()
{
   //--- Инициализируем регистратор с уровнем INFO, ведя запись в файл
   //--- Включение временных меток и сохранение в формате CSV
   int log_options = 0; // FILENAME | LINE | FUNCSIG;
   logging.Initialize(INFO, true, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, true);

   //--- Выведите в журнал простое информационное сообщение
   Log(INFO, "Script started successfully.");

   //--- Выведите предупреждающее сообщение
   Log(WARNING, "This is a warning message.");

   //--- Выведите сообщение об ошибке
   Log(ERROR, "This is an error message.");

   //--- Выведите в журнал отладочное сообщение
   Log(DEBUG, "This is a debug message for debugging purposes.");

   //--- Добавьте ключевое слово для блокировки журналов, содержащих 'password'.
   logging.AddSilentKeyword("password");

   //--- Попытка зарегистрировать сообщение, содержащее ключевое слово silenced
   Log(INFO, "User entered password: 12348"); // Это сообщение будет заглушено

   //--- Удалите ключевое слово "молчание".
   logging.RemoveSilentKeyword("password");

   //--- Запишите сообщение снова, теперь оно будет занесено в журнал
   Log(INFO, "User entered password: 1234");

   //--- Используйте общую функцию Log для регистрации сообщения
   Log(INFO, "This message is logged using the generic Log function.");

   //--- Используйте макрос Print для регистрации сообщения на уровне INFO
   Print("This message is logged using the Print macro.");

   //--- Продемонстрируйте ведение журнала с различными комбинациями опций
   logging.Initialize(INFO, true, "log_with_options.txt", true, TIME_DATE | TIME_MINUTES, false, FILENAME | LINE, true);
   Log(INFO, "This log includes only the file name and line number.");

   logging.Initialize(INFO, true, "log_with_funcsig.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, FUNCSIG, true);
   Log(INFO, "This log includes only the function signature.");

   logging.Initialize(INFO, true, "log_custom_order.txt", true, TIME_MINUTES, false, LINE | FILENAME | FUNCSIG, true);
   Log(INFO, "This log includes line number, file name, and function signature in a custom order.");

   //--- Добавьте ключевое слово для фильтрации журналов, содержащих 'important'
   logging.AddFilterKeyword("important");

   //--- Выведите несколько сообщений для демонстрации работы фильтра
   Log(INFO, "This is an important message."); // Это сообщение будет видно
   Log(INFO, "This is a regular message.");    // Это сообщение не будет отображаться

   //--- Удалите ключевое слово filter, чтобы показать все журналы.
   logging.RemoveFilterKeyword("important");

   //--- Выведите в журнал финальное сообщение о завершении работы скрипта
   Log(INFO, "Script execution completed.");
}

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

Timestamp,Level,Message
"2024.09.01 18:31:44","INFO","Script started successfully."
"2024.09.01 18:31:44","WARNING","This is a warning message."
"2024.09.01 18:31:44","ERROR","This is an error message."
"2024.09.01 18:31:44","DEBUG","This is a debug message for debugging purposes."
"2024.09.01 18:31:44","INFO","User entered password: 1234"
"2024.09.01 18:31:44","INFO","This message is logged using the generic Log function."
"2024.09.01 18:31:44","INFO","This message is logged using the Print macro."
Timestamp,Level,Message,Filename,Line
"2024.09.01 18:31","INFO","This log includes only the file name and line number.","Logging.mq5","135"
Timestamp,Level,Message,Funcsig
"2024.09.01 18:31:44","INFO","This log includes only the function signature.","void OnStart()"
Timestamp,Level,Message,Filename,Line,Funcsig
"18:31","INFO","This log includes line number, file name, and function signature in a custom order.","Logging.mq5","141","void OnStart()"
"18:31","INFO","This is an important message.","Logging.mq5","147","void OnStart()"
"18:31","INFO","Script execution completed.","Logging.mq5","154","void OnStart()"


Пример советника

#include <Logging.mqh>

//+------------------------------------------------------------------+
//| Функция инициализации эксперта|
//+------------------------------------------------------------------+
int OnInit()
{  int log_options = LINE | FUNCSIG; // FILENAME | LINE | FUNCSIG; или 0
   logging.Initialize(INFO, false, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, false);
//--- создайте таймер
   EventSetMillisecondTimer(1);
//---
   return(INIT_SUCCEEDED); }
//+------------------------------------------------------------------+
//| Функция деинициализации эксперта|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- уничтожить таймер
   EventKillTimer(); }

int counter = 0;
datetime last_time = 0; //--- Сохраняет последний раз, когда счетчик был обновлен
//+------------------------------------------------------------------+
//| Функция таймера|
//+------------------------------------------------------------------+
void OnTimer()
{  logging.BeginEvent(); //--- Начните новое событие
   Log(INFO, "Sample message");
   Log(INFO, "Another message");
   Log(INFO, "Sample message"); 
//--- Получите текущее время
   datetime current_time = TimeLocal();
//--- Проверьте, прошло ли не менее 2 секунд с момента последнего обновления счетчика.
   if (current_time - last_time >= 2)
   {  //--- Обновите счетчик
      counter++;
      //--- Обновление последнего времени
      last_time = current_time;
      //--- Занесите в журнал сообщение с новым значением счетчика
      Log(INFO, "Counter value: " + IntegerToString(counter));
      //--- Вы также можете записать в журнал другое сообщение
      Log(INFO, "Updated after 2 seconds"); }
   else
   {  //--- Выведите в журнал сообщение о том, что таймер активен, но счетчик не изменился
      Log(INFO, "Timer active but counter unchanged"); } }

Пример вывода данных из терминала MT5:

2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 43 Function: void OnTimer() [INFO] Sample message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 44 Function: void OnTimer() [INFO] Another message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 45 Function: void OnTimer() [INFO] Sample message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 55 Function: void OnTimer() [INFO] Counter value: 1
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:29.605 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged
2024.09.22 13:00:31.001 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 55 Function: void OnTimer() [INFO] Counter value: 2
2024.09.22 13:00:31.001 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:31.017 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged
2024.09.22 13:00:33.001 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 55 Function: void OnTimer() [INFO] Counter value: 3
2024.09.22 13:00:33.001 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:33.016 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged


Заключение

Класс CDebugLogger - это бесценный инструмент для любого разработчика MQL4/5. Благодаря широкому набору настраиваемых функций он позволяет вести точный журнал и мониторинг приложений, облегчая отладку и повышая эффективность работы приложения. Нужна ли вам простая регистрация сообщений или подробная контекстная информация, класс CDebugLogger обеспечивает надежное и эффективное решение, соответствующее вашим потребностям в разработке.

Для получения дополнительной информации о классе CDebugLogger или для изучения других передовых инструментов и решений посетите сайт StormWave Technologies.

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/52298

Position Risk Calculation Tool Position Risk Calculation Tool

Индикатор, который динамически рассчитывает риск (в процентах и деньгах) на основе размера лота и стоп-лосса

Dashboard Panel for displaying information on the chart Dashboard Panel for displaying information on the chart

Этот код показывает, как можно создать приборную панель для отображения всей необходимой информации на графике

YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя

Скрипт рисует уровни Рудолфа Акселя

YURAZ_MCCH YURAZ_MCCH

Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.