Bibliotheken: Logging Class for both MQL4 and MQL5

 

Logging Class for both MQL4 and MQL5:

Die Klasse CDebugLogger ist ein flexibles und umfassendes Protokollierungsprogramm, das für die Verwendung in MQL4/5-Umgebungen konzipiert wurde. Sie ermöglicht es Entwicklern, Meldungen auf verschiedenen Ebenen der Wichtigkeit (INFO, WARNING, ERROR, DEBUG) zu protokollieren, mit der Option, Zeitstempel, Funktionssignaturen, Dateinamen und Zeilennummern in die Protokolleinträge aufzunehmen. Die Klasse unterstützt die Protokollierung sowohl auf der Konsole als auch in Dateien und bietet die Möglichkeit, Protokolle in einem gemeinsamen Ordner und im CSV-Format zu speichern. Darüber hinaus bietet sie die Möglichkeit, Protokolle auf der Grundlage bestimmter Schlüsselwörter zu unterdrücken, um sicherzustellen, dass sensible Informationen nicht protokolliert werden. Diese Klasse ist ideal für Entwickler, die robuste Logging-Mechanismen in ihren MQL4/5-Anwendungen implementieren möchten, mit anpassbaren Funktionen, die eine breite Palette von Debugging- und Überwachungsanforderungen erfüllen.

Author: VitalDefender Inc.

 

Ich habe Ihren Namen "Beste Protokollierungsklasse" gelesen, was meine Aufmerksamkeit erregte. "Best" setzt das Niveau ziemlich hoch, also war ich neugierig, das zu überprüfen. Ich werde es vermeiden, über die Details zu sprechen, da es sich um einen frei verteilten Code handelt, der Nachsicht erfordert.

Verwendung und Funktionen :

  • Die Idee mit den versteckten Schlüsselwörtern ist gut. Die Implementierung ist allerdings schwach (siehe unten). Und es wird zu viele Nachrichten verschweigen, zum Beispiel wenn ich logging. AddSilentKeyword("start") verwende, wird ein Log nach "started" oder "starting" gefiltert, was wirklich nicht das ist, was ich von einer "Schlüsselwort"-Filterung erwarten würde.
  • Der Rest sind sehr grundlegende Funktionen. Da zum Beispiel der Kern von MQL ereignisgesteuert ist, ist es ein Muss für ein Log-System, um zu vermeiden, dass das Log mit wiederholten gleichen Einträgen überflutet wird, was leicht mit einem Log() in einem OnTick(), OnTimer() oder OnChartEvent() passieren kann.

Vom Standpunkt der Kodierung aus betrachtet:

  • Ihr Konstruktor und Ihre Initialize() sind doppelter Code für die wesentlichen Teile.
  • Ihre IsMessageSilent() verwendet eine Prüfschleife für jedes Wort der m_silent_keywords[] und innerhalb dieser Schleife konvertieren Sie die 'Schlüsselwörter' in Kleinbuchstaben. Bei jedem Log! Das ist wirklich ineffizient.
  • Ihre Klasse ist kaum anpassbar, wenn ich z.B. das Protokoll für ""File Name"" anpassen möchte: " + __FILE__ + "\n" anpassen möchte, muss ich Ihren Code ändern oder eine Klasse ableiten und die Log()-Methode komplett neu schreiben. Dasselbe Problem stellt sich bei jeder benutzerdefinierten Änderung, z. B. bei der Verwendung einer BIN-Datei.
  • Sie definieren ein Print()-Makro, das das in MQL eingebaute Makro außer Kraft setzt. Es ist eine sehr schlechte Idee, den Benutzer Ihrer Bibliothek zu zwingen, Print() in Ihrem Log zu verwenden.

Schlussfolgerung:

Ihre Bibliothek ist eine korrekte grundlegende Logging-Bibliothek. Sie kann Anfängern oder Programmierern, die keine Zeit haben, ihre eigene Bibliothek zu erstellen, einige einfach zu verwendende Logging-Funktionen bieten.

Auf keinen Fall ist die Bezeichnung "Beste" gerechtfertigt. Die Funktionen sind korrekt, aber grundlegend, und die Implementierung ist von amateurhaftem Niveau.

 
Alain Verleyen __FILE__ + "\n" anpassen möchte, muss ich Ihren Code ändern oder eine Klasse ableiten und die Log()-Methode komplett neu schreiben. Dasselbe Problem stellt sich bei jeder benutzerdefinierten Änderung, z. B. bei der Verwendung einer BIN-Datei.
  • Sie definieren ein Print()-Makro, das das in MQL eingebaute Makro außer Kraft setzt. Es ist eine sehr schlechte Idee, den Benutzer Ihrer Bibliothek zu zwingen, Print() in Ihrem Log zu verwenden.
  • Schlussfolgerung:

    Ihre Bibliothek ist eine korrekte grundlegende Logging-Bibliothek. Sie kann Anfängern oder Programmierern, die keine Zeit haben, ihre eigene Bibliothek zu erstellen, einige einfach zu verwendende Logging-Funktionen bieten.

    Auf keinen Fall ist die Bezeichnung "Beste" gerechtfertigt. Die Funktionen sind korrekt, aber grundlegend, und die Implementierung ist von amateurhaftem Niveau.

    Vielen Dank für Ihren Kommentar.
    Mir ist klar, dass "am besten" im Vergleich zu Ihren Erwartungen eine Übertreibung sein könnte. Meine Absicht war es, einen Code zur Verfügung zu stellen, der von jedem leicht verändert und verstanden werden kann. Ich hoffe jedoch, dass ich einen kleinen Beitrag für die Gemeinschaft geleistet habe und die Klasse für jeden zur Verfügung steht. Ich werde den Code bald optimieren, wie Sie vorgeschlagen haben.
    Nochmals vielen Dank für das Feedback.
     
    Sie sind herzlich willkommen.
     
    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.
    

    Ich denke, Sie müssen MACROS anstelle von Klassenmethoden verwenden, um den Dateinamen, die Funktionssignatur und die Zeilennummer, in der der Protokollaufruf erfolgt, ausgeben zu können.

     
    amrali __FILE__ + "\n" anpassen möchte, muss ich Ihren Code ändern oder eine Klasse ableiten und die Log()-Methode komplett neu schreiben. Dasselbe Problem stellt sich bei jeder benutzerdefinierten Änderung, z. B. bei der Verwendung einer BIN-Datei.
  • Sie definieren ein Print()-Makro, das das in MQL eingebaute Makro außer Kraft setzt. Es ist eine sehr schlechte Idee, den Benutzer Ihrer Bibliothek zu zwingen, Print() in Ihrem Log zu verwenden.
  • Schlussfolgerung:

    Ihre Bibliothek ist eine korrekte grundlegende Logging-Bibliothek. Sie kann Anfängern oder Programmierern, die keine Zeit haben, ihre eigene Bibliothek zu erstellen, einige einfach zu verwendende Logging-Funktionen bieten.

    Auf keinen Fall ist die Bezeichnung "Beste" gerechtfertigt. Die Funktionen sind korrekt, aber grundlegend, und die Implementierung ist von amateurhaftem Niveau.

    Was die Möglichkeit betrifft, einzelne Wörter stumm zu schalten, so glaube ich, dass eine effiziente Möglichkeit darin besteht, einfach "start" zu schreiben, einschließlich eines Leerzeichens oder eines anderen Zeichens. Letztendlich ist die Konfiguration der Protokolle, wie bei anderen Sprachen auch, sinnvoll, wenn sie im Init erfolgt. Wie bereits erwähnt, muss es einfach sein, damit es von jedem leicht übernommen werden kann. Wenn Sie der Meinung sind, dass noch etwas hinzugefügt werden muss, können Sie es gerne aufschreiben, und ich werde versuchen, den Code hinzuzufügen, wenn ich Zeit habe. Was die Funktion "Drucken" angeht, so kann jeder sie auskommentieren, wenn er möchte.

    Ich stehe für alle weiteren Änderungen zur Verfügung!

     
    Alain Verleyen #:
    Der Rest sind sehr grundlegende Funktionen. Da zum Beispiel der Kern von MQL ereignisgesteuert ist, ist es ein Muss für ein Protokollsystem, um zu vermeiden, dass das Protokoll mit wiederholten gleichen Einträgen überflutet wird, was leicht mit einem Log() in einem OnTick(), OnTimer() oder OnChartEvent() passieren kann.

    Wie lässt sich dieses Problem lösen?

     
    hini #:

    Wie lässt sich dieses Problem lösen?

    Eigentlich ist es ganz einfach, aber wahrscheinlich nicht leicht.

    Stellen Sie sich Ihr Ausgabejournal als eine Liste oder ein Array vor. Jedes Element steht für eine bestimmte Stelle in Ihrem Code. Für jeden Aufruf von "print to journal" haben Sie also ein eigenes Element.

    Jedes Element hat seine eigene Liste von Einträgen, und solange sie sich wiederholen (Nachricht ist gleich der vorherigen), wird ein Zähler und Zeitstempel aufgezeichnet. Sobald sie nicht mehr gleich sind, wird die letzte Nachricht einschließlich des ersten und letzten Zeitstempels und des Zählers ausgegeben.


    Damit haben Sie eine Art Filter, um zu verhindern, dass das Expertenprotokoll des Terminals überschwemmt wird.

    Sobald das Programm endet, werden alle noch nicht gedruckten Nachrichten gelöscht.
     
    Dominik Egert #:
    Eigentlich ist es einfach, aber wahrscheinlich nicht leicht.

    Stellen Sie sich Ihr Ausgabejournal als eine Liste oder ein Array vor. Jedes Element steht für eine bestimmte Stelle in Ihrem Code. Für jeden Aufruf von "print to journal" haben Sie also ein eigenes Element.

    Jedes Element hat seine eigene Liste von Einträgen, und solange sie sich wiederholen (Nachricht ist gleich der vorherigen), werden ein Zähler und ein Zeitstempel aufgezeichnet. Sobald sie nicht mehr gleich sind, wird die letzte Nachricht einschließlich des ersten und letzten Zeitstempels und des Zählers gedruckt.


    Damit sollten Sie eine Art Filter haben, um zu verhindern, dass das Expertenprotokoll des Terminals überschwemmt wird.

    Sobald das Programm beendet ist, werden alle noch nicht gedruckten Nachrichten gelöscht.

    Vielen Dank für Ihre Antwort. Ich verwende derzeit Ihre Bibliothek MQL Plus Enhanced Debugging Support zum Drucken von Protokollen. Manchmal wird jedoch eine große Menge an sich wiederholenden Protokollen gedruckt, und ich habe im Moment keine Methode, um dieses Problem zu lösen. Die von Ihnen vorgeschlagene Lösung ist ein Ansatz, und ich werde sie ausprobieren, sobald ich Zeit habe. Sie erfordert einen sorgfältigen Entwurf des Protokollierungssystems.

     
    Dominik Egert #:
    Eigentlich ist es einfach, aber wahrscheinlich nicht leicht.

    Stellen Sie sich Ihr Ausgabejournal als eine Liste oder ein Array vor. Jedes Element steht für eine bestimmte Stelle in Ihrem Code. Für jeden Aufruf von "print to journal" haben Sie also ein eigenes Element.

    Jedes Element hat seine eigene Liste von Einträgen, und solange sie sich wiederholen (Nachricht ist gleich der vorherigen), werden ein Zähler und ein Zeitstempel aufgezeichnet. Sobald sie nicht mehr gleich sind, wird die letzte Nachricht einschließlich des ersten und letzten Zeitstempels und des Zählers gedruckt.


    Damit sollten Sie eine Art Filter haben, um zu verhindern, dass das Expertenprotokoll des Terminals überschwemmt wird.

    Sobald das Programm beendet ist, werden alle noch nicht gedruckten Nachrichten gelöscht.
    Das ist einfach UND leicht.
     
    hini #:

    Vielen Dank für Ihre Antwort. Ich verwende derzeit Ihre Bibliothek MQL Plus Enhanced Debugging Support zum Drucken von Protokollen. Manchmal wird jedoch eine große Menge von sich wiederholenden Protokollen gedruckt, und ich habe im Moment keine Methode, um dieses Problem zu lösen. Die von Ihnen vorgeschlagene Lösung ist ein Ansatz, und ich werde sie ausprobieren, sobald ich Zeit habe. Sie erfordert einen sorgfältigen Entwurf des Protokollierungssystems.


    Es könnte mit Lib Debug integriert werden.

    Lib Debug ist jedoch nicht als Protokollierungseinrichtung gedacht, sondern als Debug-Protokoll, das eine vollständige Rückverfolgung des Codes ermöglicht.