Bibliothèque: Logging Class for both MQL4 and MQL5

 

Logging Class for both MQL4 and MQL5:

La classe CDebugLogger est un utilitaire de journalisation flexible et complet conçu pour être utilisé dans les environnements MQL4/5. Elle permet aux développeurs d'enregistrer des messages à différents niveaux d'importance (INFO, WARNING, ERROR, DEBUG) avec des options permettant d'inclure des horodatages, des signatures de fonctions, des noms de fichiers et des numéros de lignes dans les entrées du journal. La classe prend en charge la journalisation vers la console et les fichiers, avec la possibilité de sauvegarder les journaux dans un dossier commun et au format CSV. En outre, elle offre une fonctionnalité permettant de réduire au silence les journaux sur la base de mots-clés spécifiques, ce qui garantit que les informations sensibles ne sont pas enregistrées. Cette classe est idéale pour les développeurs qui souhaitent mettre en œuvre des mécanismes de journalisation robustes dans leurs applications MQL4/5, avec des fonctionnalités personnalisables qui répondent à un large éventail de besoins en matière de débogage et de surveillance.

Author: VitalDefender Inc.

 

J'ai lu votre nom "Best Logging Class", ce qui a attiré mon attention. "Best" place le niveau assez haut, j'étais donc curieux de le vérifier. J'éviterai de parler des détails, car il s'agit d'un code librement distribué qui nécessite d'être indulgent.

Utilisation et fonctionnalités :

  • L'idée des mots-clés cachés est bonne. L'implémentation est cependant faible (voir ci-dessous). Et elle rendra silencieux trop de messages, par exemple si j'utilise logging. AddSilentKeyword("start"), il filtrera un log en utilisant "started" ou "starting", ce qui n'est vraiment pas ce que j'attendrais d'un filtrage par "mot-clé".
  • Les autres fonctionnalités sont très basiques. Par exemple, comme le coeur de MQL est basé sur les évènements, il est indispensable pour un système de log d'éviter d'inonder le log avec les mêmes entrées répétées, ce qui peut facilement arriver avec un Log() placé dans un OnTick(), OnTimer() ou OnChartEvent().

Du point de vue du codage :

  • Votre constructeur et votre Initialize() sont du code dupliqué pour les parties essentielles.
  • Votre IsMessageSilent() utilise une boucle de vérification pour chaque mot du m_silent_keywords[] et à l'intérieur de cette boucle vous convertissez les 'mots-clés' en minuscules. A chaque enregistrement ! C'est vraiment inefficace.
  • Votre classe est difficilement personnalisable, par exemple si je veux personnaliser le log pour ""File Name : " + __FILE__ + "\n", je devrai modifier votre code, ou dériver une classe et réécrire entièrement la méthode Log(). Le même problème se pose pour toute modification personnalisée nécessaire, par exemple l'utilisation d'un fichier BIN.
  • Vous définissez une macro Print() qui remplacera la macro intégrée de MQL. C'est une très mauvaise idée d'obliger l'utilisateur de votre librairie à Print() dans votre journal.

Conclusion :

Votre bibliothèque est une bibliothèque de journalisation de base correcte. Elle peut être pratique pour les débutants ou les codeurs qui n'ont pas le temps de construire leur propre bibliothèque, en leur fournissant des fonctionnalités de journalisation faciles à utiliser.

En aucun cas, l'utilisation du qualificatif "meilleur" n'est justifiée. Les fonctionnalités sont correctes mais basiques, et l'implémentation est d'un niveau amateur.

 
Alain Verleyen __FILE__ + "\n", je devrai modifier votre code, ou dériver une classe et réécrire entièrement la méthode Log(). Le même problème se pose pour toute modification personnalisée nécessaire, par exemple l'utilisation d'un fichier BIN.
  • Vous définissez une macro Print() qui remplacera la macro intégrée de MQL. C'est une très mauvaise idée de forcer l'utilisateur de votre bibliothèque à utiliser Print() dans votre journal.
  • Conclusion :

    Votre bibliothèque est une bibliothèque de journalisation de base correcte. Elle peut être pratique pour les débutants ou les codeurs qui n'ont pas le temps de construire leur propre bibliothèque, en leur fournissant des fonctionnalités de journalisation faciles à utiliser.

    En aucun cas, l'utilisation du qualificatif "meilleur" n'est justifiée. Les fonctionnalités sont correctes mais basiques, et l'implémentation est d'un niveau amateur.

    Merci pour votre commentaire.
    Je me rends compte que le terme "meilleur" est peut-être exagéré par rapport à vos attentes. Mon intention était de partager un code facilement modifiable et compréhensible par tous. J'espère cependant avoir apporté une petite contribution à la communauté et que la classe est disponible pour tout le monde. Je vais bientôt procéder à l'optimisation du code comme vous l'avez suggéré.
    Merci encore pour vos commentaires.
     
    Vous êtes les bienvenus.
     
    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.
    

    Je pense que vous devez utiliser des MACROS au lieu de méthodes de classe pour pouvoir émettre le nom du fichier, la signature de la fonction et le numéro de ligne où l'appel au journal s'est produit.

     
    amrali __FILE__ + "\n", je devrai modifier votre code, ou dériver une classe et réécrire entièrement la méthode Log(). Le même problème se pose pour toute modification personnalisée nécessaire, par exemple l'utilisation d'un fichier BIN.
  • Vous définissez une macro Print() qui remplacera la macro intégrée de MQL. C'est une très mauvaise idée de forcer l'utilisateur de votre bibliothèque à utiliser Print() dans votre journal.
  • Conclusion :

    Votre bibliothèque est une bibliothèque de journalisation de base correcte. Elle peut être pratique pour les débutants ou les codeurs qui n'ont pas le temps de construire leur propre bibliothèque, en leur fournissant des fonctionnalités de journalisation faciles à utiliser.

    En aucun cas, l'utilisation du qualificatif "meilleur" n'est justifiée. Les fonctionnalités sont correctes mais basiques, et l'implémentation est d'un niveau amateur.

    En ce qui concerne la possibilité de réduire au silence des mots individuels, je pense qu'un moyen efficace est d'écrire simplement "début", en incluant un espace ou un autre caractère. En fin de compte, comme pour d'autres langages, la configuration des journaux a du sens si elle est effectuée dans l'Init . Comme je l'ai dit, il faut que ce soit simple pour que tout le monde puisse l'adopter. Si vous pensez que quelque chose d'autre doit être ajouté, n'hésitez pas à l'écrire, et j'essaierai d'ajouter le code quand j'aurai le temps. En ce qui concerne la fonction "Imprimer", chacun est libre de la commenter s'il le souhaite.

    Je suis disponible pour toute autre modification !

     
    Alain Verleyen #:
    Les autres sont des fonctionnalités très basiques. Par exemple, étant donné que le cœur de MQL est axé sur les événements, il est indispensable de disposer d'un système de journalisation afin d'éviter d'inonder le journal avec des entrées identiques répétées, ce qui peut facilement se produire avec un Log() placé dans un OnTick(), OnTimer() ou OnChartEvent().

    Comment résoudre ce problème ?

     
    hini #:

    Comment résoudre ce problème ?

    En fait, c'est simple, mais probablement pas facile.

    Considérez votre journal de sortie comme une liste, ou un tableau. Chaque élément représente un emplacement spécifique dans votre code. Ainsi, pour chaque appel "print to journal", vous disposez d'un élément distinct.

    Chaque élément a sa propre liste d'entrées, et tant qu'elles se répètent (le message est égal au précédent), un compteur et un horodatage sont enregistrés. Une fois qu'ils ne sont plus égaux, vous imprimez le dernier message, y compris le premier et le dernier horodatage et le compteur.


    Cela devrait vous donner une sorte de filtre pour éviter de spammer le journal des experts du terminal.

    Lorsque le programme se termine, tous les messages qui n'ont pas encore été imprimés sont supprimés.
     
    Dominik Egert #:
    En fait, c'est simple, mais probablement pas facile.

    Considérez votre journal de sortie comme une liste ou un tableau. Chaque élément représente un emplacement spécifique dans votre code. Ainsi, pour chaque appel "print to journal", vous disposez d'un élément distinct.

    Chaque élément possède sa propre liste d'entrées, et tant qu'elles se répètent (le message est égal au précédent), un compteur et un horodatage sont enregistrés. Une fois qu'ils ne sont plus égaux, vous imprimez le dernier message, y compris le premier et le dernier horodatage et le compteur.


    Cela devrait vous donner une sorte de filtre pour éviter de spammer le journal de l'expert des terminaux.

    Une fois le programme terminé, vous videz tous les messages qui n'ont pas encore été imprimés.

    Je vous remercie de votre réponse. J'utilise actuellement votre bibliothèque MQL Plus Enhanced Debugging Support pour imprimer les journaux. Cependant, il arrive qu'une grande quantité de journaux répétitifs soit imprimée et je n'ai pas de méthode pour résoudre ce problème pour le moment. La solution que vous avez suggérée est une approche, et je l'essaierai quand j'aurai le temps. Elle nécessite une conception minutieuse du système de journalisation.

     
    Dominik Egert #:
    En fait, c'est simple, mais probablement pas facile.

    Considérez votre journal de sortie comme une liste ou un tableau. Chaque élément représente un emplacement spécifique dans votre code. Ainsi, pour chaque appel "print to journal", vous disposez d'un élément distinct.

    Chaque élément possède sa propre liste d'entrées, et tant qu'elles se répètent (le message est égal au précédent), un compteur et un horodatage sont enregistrés. Une fois qu'ils ne sont plus égaux, vous imprimez le dernier message, y compris le premier et le dernier horodatage et le compteur.


    Cela devrait vous donner une sorte de filtre pour éviter de spammer le journal de l'expert des terminaux.

    Une fois le programme terminé, vous videz tous les messages qui n'ont pas encore été imprimés.
    C'est simple ET facile.
     
    hini #:

    Je vous remercie de votre réponse. J'utilise actuellement votre bibliothèque MQL Plus Enhanced Debugging Support pour imprimer les journaux. Cependant, il arrive qu'elle imprime un grand nombre de journaux répétitifs et je n'ai pas de méthode pour résoudre ce problème pour le moment. La solution que vous avez suggérée est une approche, et je l'essaierai quand j'aurai le temps. Elle nécessite une conception minutieuse du système de journalisation.


    Il pourrait être intégré à lib debug.

    Lib Debug n'est cependant pas destiné à être un système de journalisation, mais un journal de débogage, vous donnant une trace complète de votre code.