Bibliotecas: Logging Class for both MQL4 and MQL5

 

Logging Class for both MQL4 and MQL5:

A classe CDebugLogger é um utilitário de registro flexível e abrangente projetado para uso em ambientes MQL4/5. Ela permite que os desenvolvedores registrem mensagens em vários níveis de importância (INFO, WARNING, ERROR, DEBUG) com opções para incluir registros de data e hora, assinaturas de funções, nomes de arquivos e números de linhas nas entradas de registro. A classe suporta o registro em log no console e em arquivos, com a capacidade de salvar os logs em uma pasta comum e no formato CSV. Além disso, oferece a funcionalidade de silenciar os logs com base em palavras-chave específicas, garantindo que informações confidenciais não sejam registradas. Essa classe é ideal para desenvolvedores que desejam implementar mecanismos robustos de registro em seus aplicativos MQL4/5, com recursos personalizáveis que atendem a uma ampla gama de necessidades de depuração e monitoramento.

Author: VitalDefender Inc.

 

Li seu nome "Melhor classe de registro", o que me chamou a atenção. "Melhor" está colocando o nível bem alto, então fiquei curioso para verificar isso. Evitarei falar sobre os detalhes, pois se trata de um código distribuído gratuitamente que requer indulgência.

Uso e recursos:

  • Sua ideia de palavras-chave ocultas é boa. No entanto, a implementação é fraca (veja abaixo). E ela silenciará muitas mensagens, por exemplo, se eu estiver usando logging. AddSilentKeyword("start"), ele filtrará um registro usando "started" ou "starting", o que não é realmente o que eu esperaria de uma filtragem por "palavra-chave".
  • O restante são recursos muito básicos. Por exemplo, como o núcleo da MQL é orientado por eventos, é necessário que um sistema de registro evite inundar o registro com a mesma entrada repetida, o que pode acontecer facilmente com um Log() colocado em um OnTick(), OnTimer() ou OnChartEvent().

Do ponto de vista da codificação:

  • Seu construtor e seu Initialize() são códigos duplicados para as partes essenciais.
  • Seu IsMessageSilent() está usando um loop de verificação para cada palavra do m_silent_keywords[] e, dentro desse loop, você converte as "palavras-chave" para minúsculas. Em cada registro! Isso é realmente ineficiente.
  • Sua classe é pouco personalizável, por exemplo, se eu quiser personalizar o registro para ""File Name: " + __FILE__ + "\n", terei de modificar seu código ou derivar uma classe e reescrever totalmente o método Log(). Há o mesmo problema para qualquer alteração personalizada necessária, por exemplo, usando um arquivo BIN.
  • Você define uma macro Print() que substituirá a macro interna do MQL. É uma péssima ideia forçar o usuário da sua biblioteca a imprimir() no seu log.

Conclusão:

Sua biblioteca é uma biblioteca de registro básica correta. Ela pode ser conveniente para alguns iniciantes ou programadores que não têm tempo para criar a sua própria, fornecendo a eles alguns recursos de registro fáceis de usar.

De forma alguma, o uso do qualificador "Melhor" é justificado. Os recursos são corretos, mas básicos, e a implementação é de nível amador.

 
Alain Verleyen __FILE__ + "\n", terei de modificar seu código ou derivar uma classe e reescrever totalmente o método Log(). Há o mesmo problema para qualquer alteração personalizada necessária, por exemplo, usando um arquivo BIN.
  • Você define uma macro Print() que substituirá a macro interna do MQL. É uma péssima ideia forçar o usuário da sua biblioteca a usar Print() no seu log.
  • Conclusão:

    Sua biblioteca é uma biblioteca de registro básica correta. Ela pode ser conveniente para alguns iniciantes ou programadores que não têm tempo para criar a sua própria, fornecendo a eles alguns recursos de registro fáceis de usar.

    De forma alguma, o uso do qualificador "Melhor" é justificado. Os recursos são corretos, mas básicos, e a implementação é de nível amador.

    Obrigado pelo seu comentário.
    Entendo que "melhor" pode ser um exagero em relação às suas expectativas. Minha intenção era compartilhar um código que pudesse ser facilmente modificado e compreendido por qualquer pessoa. Espero, no entanto, ter feito uma pequena contribuição para a comunidade, e a classe está disponível para uso de todos. Em breve, continuarei a otimizar o código conforme sua sugestão.
    Mais uma vez, obrigado pelo feedback.
     
    Você é muito bem-vindo.
     
    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.
    

    Acho que você precisa usar MACROS em vez de métodos de classe para poder emitir o nome do arquivo, a assinatura da função e o número da linha em que a chamada de registro ocorre.

     
    amrali __FILE__ + "\n", terei de modificar seu código ou derivar uma classe e reescrever totalmente o método Log(). Há o mesmo problema para qualquer alteração personalizada necessária, por exemplo, usando um arquivo BIN.
  • Você define uma macro Print() que substituirá a macro interna do MQL. É uma péssima ideia forçar o usuário da sua biblioteca a usar Print() no seu log.
  • Conclusão:

    Sua biblioteca é uma biblioteca de registro básica correta. Ela pode ser conveniente para alguns iniciantes ou programadores que não têm tempo para criar a sua própria, fornecendo a eles alguns recursos de registro fáceis de usar.

    De forma alguma, o uso do qualificador "Melhor" é justificado. Os recursos são corretos, mas básicos, e a implementação é de nível amador.

    Quanto à capacidade de silenciar palavras individuais, acredito que uma maneira eficiente é simplesmente escrever 'start', incluindo um espaço ou outro caractere. Em última análise, como em outras linguagens, a configuração dos registros faz sentido se for feita no Init . Conforme mencionado, ele precisa ser simples para que possa ser adotado facilmente por todos. Se você achar que algo mais precisa ser adicionado, sinta-se à vontade para escrever, e tentarei adicionar o código quando tiver tempo. Com relação à função "Imprimir", todos podem comentá-la, se desejarem.

    Estou à disposição para quaisquer outras alterações!

     
    Alain Verleyen #:
    O restante são recursos muito básicos. Por exemplo, como o núcleo da MQL é orientado por eventos, é necessário que um sistema de registro evite inundar o registro com a mesma entrada repetida, o que pode acontecer facilmente com um Log() colocado em um OnTick(), OnTimer() ou OnChartEvent().

    Como resolver esse problema?

     
    hini #:

    Como resolver esse problema?

    Na verdade, é simples, mas provavelmente não é fácil.

    Pense em seu diário de saída como uma lista ou uma matriz. Cada elemento representa um local específico em seu código. Portanto, para cada chamada "print to journal", você tem um elemento separado.

    Cada elemento tem sua própria lista de entradas e, desde que elas se repitam (a mensagem é igual à anterior), um contador e um registro de data e hora são gravados. Quando não forem iguais, você imprimirá a última mensagem, incluindo o primeiro e o último registro de data e hora e o contador.


    Isso deve lhe dar uma espécie de filtro para evitar spam no registro especializado dos terminais.

    Quando o programa termina, você descarta todas as mensagens ainda não impressas.
     
    Dominik Egert #:
    Na verdade, é simples, mas provavelmente não é fácil.

    Pense em seu diário de saída como uma lista ou uma matriz. Cada elemento representa um local específico em seu código. Portanto, para cada chamada "print to journal", você tem um elemento separado.

    Cada elemento tem sua própria lista de entradas e, enquanto elas se repetirem (a mensagem é igual à anterior), um contador e um carimbo de data/hora são registrados. Quando não forem iguais, você imprime a última mensagem, incluindo o primeiro e o último registro de data e hora e o contador.


    Isso deve lhe dar uma espécie de filtro para evitar spam no log de especialistas dos terminais.

    Quando o programa termina, você descarta todas as mensagens ainda não impressas.

    Obrigado por sua resposta. Atualmente, estou usando a biblioteca MQL Plus Enhanced Debugging Support para imprimir logs. No entanto, às vezes ela imprime uma grande quantidade de registros repetitivos, e não tenho um método para resolver esse problema no momento. A solução que você sugeriu é uma abordagem, e eu a tentarei quando tiver tempo. Ela requer um projeto cuidadoso do sistema de registro.

     
    Dominik Egert #:
    Na verdade, é simples, mas provavelmente não é fácil.

    Pense em seu diário de saída como uma lista ou uma matriz. Cada elemento representa um local específico em seu código. Portanto, para cada chamada "print to journal", você tem um elemento separado.

    Cada elemento tem sua própria lista de entradas e, enquanto elas se repetirem (a mensagem é igual à anterior), um contador e um carimbo de data/hora são registrados. Quando não forem iguais, você imprime a última mensagem, incluindo o primeiro e o último registro de data e hora e o contador.


    Isso deve lhe dar uma espécie de filtro para evitar spam no log de especialistas dos terminais.

    Quando o programa termina, você descarta todas as mensagens ainda não impressas.
    É simples e fácil.
     
    hini #:

    Obrigado por sua resposta. No momento, estou usando sua biblioteca MQL Plus Enhanced Debugging Support para imprimir registros. No entanto, às vezes ela imprime uma grande quantidade de registros repetitivos, e não tenho um método para resolver esse problema no momento. A solução que você sugeriu é uma abordagem, e eu a tentarei quando tiver tempo. Ela exige um projeto cuidadoso do sistema de registro.


    Ele poderia ser integrado à depuração da biblioteca.

    No entanto, a Lib Debug não se destina a ser um recurso de registro, mas um registro de depuração, que fornece um rastreamento completo do seu código.