Librerías: Logging Class for both MQL4 and MQL5

 

Logging Class for both MQL4 and MQL5:

La clase CDebugLogger es una utilidad de registro flexible y completa diseñada para su uso en entornos MQL4/5. Permite a los desarrolladores registrar mensajes en varios niveles de importancia (INFO, ADVERTENCIA, ERROR, DEBUG). Permite a los desarrolladores registrar mensajes en varios niveles de importancia (INFO, ADVERTENCIA, ERROR, DEBUG) con opciones para incluir marcas de tiempo, firmas de función, nombres de archivo y números de línea en las entradas de registro. La clase admite el registro tanto en la consola como en archivos, con la posibilidad de guardar los registros en una carpeta común y en formato CSV. Además, ofrece la funcionalidad de silenciar registros basados en palabras clave específicas, asegurando que la información sensible no se registra. Esta clase es ideal para desarrolladores que buscan implementar mecanismos de registro robustos en sus aplicaciones MQL4/5, con características personalizables que satisfacen una amplia gama de necesidades de depuración y monitorización.

Author: VitalDefender Inc.

 

Leí su nombre "Mejor clase de registro", que me llamó la atención. "Mejor" es poner el nivel bastante alto, así que tenía curiosidad por comprobarlo. Evitaré hablar de los detalles, ya que es un código de libre distribución que requiere ser indulgente.

Uso y características :

  • La idea de las palabras clave ocultas es buena. Sin embargo, la implementación es débil (ver más abajo). Y silenciará demasiados mensajes, por ejemplo si estoy usando logging. AddSilentKeyword("start"), filtrará un log usando "started" o "starting", que no es realmente lo que esperaría de un filtrado por "palabra clave".
  • El resto son características muy básicas. Por ejemplo, como el núcleo de MQL son eventos impulsados, es una necesidad para un sistema de registro para evitar inundar el registro con la misma entrada repetida, que puede suceder fácilmente con un Log() colocado en un OnTick(), OnTimer() o OnChartEvent().

Desde un punto de vista de codificación :

  • Su constructor y su Initialize() son código duplicado para las partes esenciales.
  • Su IsMessageSilent() está utilizando un bucle de comprobación para cada palabra del m_silent_keywords[] y dentro de este bucle convierte las 'keywords' a minúsculas. ¡En cada registro ! Es realmente ineficiente.
  • Tu clase es poco personalizable, por ejemplo si quiero personalizar el log para ""File Name: " + __FILE__ + "\n", tendré que modificar tu código, o derivar una clase y reescribir el método Log() por completo. Existe el mismo problema para cualquier cambio personalizado que se necesite, por ejemplo utilizando un archivo BIN.
  • Usted define una macro Print() que anulará la incorporada en MQL. Es una muy mala idea forzar al usuario de su libreria a Print() en su log.

Conclusión :

Tu librería es una correcta librería básica de Logging. Puede ser conveniente para algunos principiantes o codificadores que carecen de tiempo para construir la suya propia, proporcionándoles algunas características de registro fáciles de usar.

De ninguna manera, usar el calificativo "Mejor" está justificado. Las características son correctas pero básicas, y la implementación es de nivel amateur.

 
Alain Verleyen __FILE__ + "\n", tendré que modificar tu código, o derivar una clase y reescribir el método Log() por completo. Existe el mismo problema para cualquier cambio personalizado que se necesite, por ejemplo utilizando un archivo BIN.
  • Usted define una macro Print() que anulará la incorporada en MQL. Es una muy mala idea forzar al usuario de su libreria a Print() en su log.
  • Conclusión :

    Tu librería es una correcta librería básica de Logging. Puede ser conveniente para algunos principiantes o codificadores que carecen de tiempo para construir la suya propia, proporcionándoles algunas características de registro fáciles de usar.

    De ninguna manera, usar el calificativo "Mejor" está justificado. Las características son correctas pero básicas, y la implementación es de nivel amateur.

    Gracias por tu comentario.
    Me doy cuenta de que "mejor" puede ser una exageración en comparación con tus expectativas. Mi intención era compartir código que pudiera ser fácilmente modificado y entendido por cualquiera. Espero, sin embargo, haber hecho una pequeña contribución a la comunidad, y que la clase esté disponible para que todo el mundo pueda utilizarla. Pronto procederé a optimizar el código tal y como has sugerido.
    Gracias de nuevo por los comentarios.
     
    De nada.
     
    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.
    

    Creo que tienes que utilizar MACROS en lugar de método de clase para poder emitir el nombre de archivo, la firma de la función y el número de línea donde se produce la llamada de registro.

     
    amrali __FILE__ + "\n", tendré que modificar tu código, o derivar una clase y reescribir el método Log() por completo. Existe el mismo problema para cualquier cambio personalizado que se necesite, por ejemplo utilizando un archivo BIN.
  • Usted define una macro Print() que anulará la incorporada en MQL. Es una muy mala idea forzar al usuario de su libreria a Print() en su log.
  • Conclusión :

    Tu librería es una correcta librería básica de Logging. Puede ser conveniente para algunos principiantes o codificadores que carecen de tiempo para construir la suya propia, proporcionándoles algunas características de registro fáciles de usar.

    De ninguna manera, usar el calificativo "Mejor" está justificado. Las características son correctas pero básicas, y la implementación es de nivel amateur.

    En cuanto a la posibilidad de silenciar palabras individuales, creo que una forma eficiente es simplemente escribir 'start ', incluyendo un espacio u otro carácter. En última instancia, al igual que con otros lenguajes, la configuración de los registros tiene sentido si se hace en el Init . Como se ha mencionado, tiene que ser simple para que sea fácilmente adoptable por todos. Si crees que hay que añadir algo más, no dudes en escribirlo, e intentaré añadir el código cuando tenga tiempo. En cuanto a la función "Imprimir", todo el mundo es libre de comentarla si lo desea.

    Estoy a su disposición para cualquier otro cambio.

     
    Alain Verleyen #:
    El resto son características muy básicas. Por ejemplo, como el núcleo de MQL está dirigido por eventos, es una necesidad para un sistema de registro para evitar inundar el registro con la misma entrada repetida, lo que puede suceder fácilmente con un Log() colocado en un OnTick(), OnTimer() o OnChartEvent().

    ¿Cómo resolver este problema?

     
    hini #:

    ¿Cómo resolver este problema?

    En realidad, es simple, pero probablemente no fácil.

    Piense en su diario de salida como una lista, o una matriz. Cada elemento representa una ubicación específica en su código. Así que para cada llamada "print to journal", tienes un elemento separado.

    Cada elemento tiene su propia lista de entradas, y mientras se repitan (el mensaje es igual al anterior), se registra un contador y una marca de tiempo. Una vez que no son iguales, se imprime el último mensaje incluyendo la primera y última marca de tiempo y el contador.


    Eso debería darte una especie de filtro para evitar el spam en el registro de expertos de los terminales.

    Una vez que el programa termina, se descargan todos los mensajes que aún no se han impreso.
     
    Dominik Egert #:
    En realidad, es sencillo, pero probablemente no fácil.

    Piense en su diario de salida como una lista, o una matriz. Cada elemento representa una ubicación específica en su código. Así que para cada llamada "imprimir en el diario", usted tiene un elemento separado.

    Cada elemento tiene su propia lista de entradas, y mientras se repitan (el mensaje es igual al anterior), se registra un contador y una marca de tiempo. Una vez que no son iguales, se imprime el último mensaje incluyendo la primera y última marca de tiempo y el contador.


    Eso debería darte una especie de filtro para evitar el spam en el registro de expertos de los terminales.

    Una vez que el programa termina, vuelca todos los mensajes que aún no se han impreso.

    Gracias por su respuesta. Actualmente estoy utilizando su MQL Plus Enhanced Debugging Support biblioteca para imprimir los registros. Sin embargo, a veces se imprime una gran cantidad de registros repetitivos, y no tengo un método para resolver este problema en este momento. La solución que sugieres es un enfoque, y lo probaré cuando tenga tiempo. Requiere un diseño cuidadoso del sistema de registro.

     
    Dominik Egert #:
    En realidad, es sencillo, pero probablemente no fácil.

    Piense en su diario de salida como una lista, o una matriz. Cada elemento representa una ubicación específica en su código. Así que para cada llamada "imprimir en el diario", usted tiene un elemento separado.

    Cada elemento tiene su propia lista de entradas, y mientras se repitan (el mensaje es igual al anterior), se registra un contador y una marca de tiempo. Una vez que no son iguales, se imprime el último mensaje incluyendo la primera y última marca de tiempo y el contador.


    Eso debería darte una especie de filtro para evitar el spam en el registro de expertos de los terminales.

    Una vez que el programa termina, vuelca todos los mensajes que aún no se han impreso.
    Es simple y fácil.
     
    hini #:

    Gracias por su respuesta. Actualmente estoy usando su MQL Plus Enhanced Debugging Support biblioteca para imprimir los registros. Sin embargo, a veces se imprime una gran cantidad de registros repetitivos, y no tengo un método para resolver este problema en este momento. La solución que sugieres es un enfoque, y lo probaré cuando tenga tiempo. Requiere un diseño cuidadoso del sistema de registro.


    Podría integrarse con lib debug.

    Lib Debug, sin embargo, no pretende ser un sistema de registro, sino un registro de depuración, que le da un seguimiento completo de su código.