Я прочитал ваше название "Best Logging Class", которое привлекло мое внимание. "Лучший" - это довольно высокий уровень, поэтому мне было любопытно проверить это. Я не буду говорить о деталях, так как это свободно распространяемый код, который требует снисхождения.
Использование и возможности:
- Ваша идея со скрытыми ключевыми словами хороша. Но реализация слабая (см. ниже). И она будет замалчивать слишком много сообщений, например, если я использую протоколирование. AddSilentKeyword("start"), он будет фильтровать журнал по "started" или "starting", что совсем не то, чего я ожидал от фильтрации по "ключевому слову".
- Остальные функции являются очень базовыми. Например, так как ядром MQL являются события, система ведения журнала должна избегать переполнения журнала повторяющимися одинаковыми записями, что может легко произойти с Log(), помещенным в OnTick(), OnTimer() или OnChartEvent().
С точки зрения кодирования:
- Ваш конструктор и Initialize() дублируют код для основных частей.
- В IsMessageSilent() используется цикл проверки каждого слова из m_silent_keywords[], и внутри этого цикла вы преобразуете "ключевые слова" в нижний регистр. В каждом журнале! Это действительно неэффективно.
- Ваш класс практически не настраивается, например, если я хочу настроить лог на ""Имя файла: " + __FILE__ + "\n", мне придется модифицировать ваш код, или вывести класс и полностью переписать метод Log(). Та же проблема возникает и при любом другом изменении, например при использовании BIN-файла.
- Вы определяете макрос Print(), который будет переопределять встроенный в MQL. Это очень плохая идея - заставлять пользователя вашей библиотеки выполнять Print() в вашем журнале.
Заключение :
Ваша библиотека является правильной базовой библиотекой ведения журнала. Она может быть удобна для начинающих или тех, у кого не хватает времени на создание собственной библиотеки, предоставляя им некоторые простые в использовании функции ведения журнала.
Ни в коем случае не используйте определение "Лучшая". Функции правильные, но базовые, а реализация на любительском уровне.
Заключение :
Ваша библиотека является правильной базовой библиотекой ведения журнала. Она может быть удобна для начинающих или тех, у кого не хватает времени на создание собственной библиотеки, предоставляя им некоторые простые в использовании функции ведения журнала.
Ни в коем случае не используйте определение "Лучшая". Функции правильные, но базовые, а реализация на любительском уровне.
Я понимаю, что "лучший" может быть преувеличением по сравнению с вашими ожиданиями. Я хотел поделиться кодом, который может быть легко изменен и понятен любому. Однако я надеюсь, что сделал небольшой вклад в развитие сообщества, и класс доступен для всех. В ближайшее время я займусь оптимизацией кода, как вы предложили.
Еще раз спасибо за отзыв.
2024.09.01 14:51:25.011 Logging (EURUSD,M30) File Name: Logging.mqh Function: string CDebugLogger::FormatLogEntry(LogLevel,string) 2024.09.01 14:51 Line: 276 [INFO] Script started successfully.
Я думаю, что вы должны использовать MACROS вместо метода класса, чтобы иметь возможность выдать имя файла, сигнатуру функции и номер строки, где происходит вызов журнала.
Заключение :
Ваша библиотека является правильной базовой библиотекой ведения журнала. Она может быть удобна для начинающих или тех, у кого не хватает времени на создание собственной библиотеки, предоставляя им некоторые простые в использовании функции ведения журнала.
Ни в коем случае не используйте определение "Лучшая". Функции правильные, но базовые, а реализация на любительском уровне.
Что касается возможности глушить отдельные слова, я считаю, что эффективный способ - просто написать 'start ', включая пробел или другой символ. В конечном итоге, как и в случае с другими языками, настройка журналов имеет смысл, если она выполняется в Init. Как уже говорилось, он должен быть простым, чтобы его мог легко освоить каждый. Если вы считаете, что нужно добавить что-то еще, не стесняйтесь, напишите это, и я постараюсь добавить код, когда у меня будет время. Что касается функции "Печать", каждый может прокомментировать ее, если захочет.
Я готов к любым дальнейшим изменениям!
Остальные функции являются очень базовыми. Например, поскольку ядром MQL являются события, система ведения журнала просто необходима, чтобы избежать переполнения журнала повторяющимися одинаковыми записями, что может легко произойти при использовании Log(), помещенного в OnTick(), OnTimer() или OnChartEvent().
Как решить эту проблему?
Спасибо за ответ. В настоящее время я использую вашу библиотеку MQL Plus Enhanced Debugging Support для печати журналов. Однако иногда она печатает большое количество повторяющихся логов, и на данный момент у меня нет способа решить эту проблему. Решение, которое вы предложили, - это один из подходов, и я попробую его, когда у меня будет время. Оно требует тщательного проектирования системы ведения журналов.
Спасибо за ваш ответ. В настоящее время я использую вашу библиотеку MQL Plus Enhanced Debugging Support для печати журналов. Однако иногда она печатает большое количество повторяющихся логов, и на данный момент у меня нет способа решить эту проблему. Решение, которое вы предложили, - это один из подходов, и я попробую его, когда у меня будет время. Оно требует тщательного проектирования системы ведения журналов.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Logging Class for both MQL4 and MQL5:
Класс CDebugLogger - это гибкая и всеобъемлющая утилита для ведения журнала, предназначенная для использования в средах MQL4/5. Он позволяет разработчикам регистрировать сообщения различных уровней важности (INFO, WARNING, ERROR, DEBUG) с возможностью включения в записи журнала временных меток, сигнатур функций, имен файлов и номеров строк. Класс поддерживает запись логов как в консоль, так и в файлы, с возможностью сохранения логов в общей папке и в формате CSV. Кроме того, он предлагает функциональность для глушения журналов на основе определенных ключевых слов, что гарантирует, что конфиденциальная информация не будет записана в журнал. Этот класс идеально подходит для разработчиков, желающих внедрить надежные механизмы протоколирования в свои MQL4/5-приложения, с настраиваемыми функциями, удовлетворяющими широкий спектр потребностей в отладке и мониторинге.
Author: VitalDefender Inc.