ライブラリ: Logging Class for both MQL4 and MQL5

 

Logging Class for both MQL4 and MQL5:

CDebugLoggerクラスは、MQL4/5環境で使用するために設計された、柔軟で包括的なロギング・ユーティリティです。タイムスタンプ、関数シグネチャ、ファイル名、および行番号をログ・エントリに含めるオプションを使用して、開発者はさまざまな重要度レベル (INFO、WARNING、ERROR、DEBUG) でメッセージをログできます。このクラスは、コンソールとファイルの両方へのロギングをサポートしており、ログを共通のフォルダとCSV形式で保存することができます。さらに、特定のキーワードに基づいてログを消音する機能を提供し、 機密情報がログに記録されないようにします。このクラスは、MQL4/5アプリケーションに堅牢なロギング機構を実装しようとしている開発者にとって理想的であり、デバッグやモニタリングの幅広いニーズに応えるカスタマイズ可能な機能を備えています。

Author: VitalDefender Inc.

 

あなたの "Best Logging Class "という名前を読んで興味を持ちました。"Best "というのはかなり高いレベルなので、気になって調べてみました。フリーで配布されているコードなので、詳細は割愛する。

使い方と特徴

  • 隠しキーワードのアイデアは良い。しかし、実装が弱い(下記参照)。また、例えばロギングを使っている場合、サイレント・メッセージが多すぎる。AddSilentKeyword("start")を使うと、"started "や "starting "を使ってログをフィルタリングしてしまう。
  • 残りは非常に基本的な機能である。例えば、MQLのコアはイベント・ドリブンであるため、ログ・システムが同じエントリーの繰り返しでログを溢れさせないようにすることは必須です。これは、OnTick()、OnTimer()、またはOnChartEvent()の中にLog()を置くことで簡単に起こります。

コーディングの観点からは :

  • コンストラクタとInitialize()は、本質的な部分で重複しています。
  • IsMessageSilent()は、m_silent_keywords[]の各単語のループ・チェックを使用しており、このループの中で'keywords'を小文字に変換しています。各ログで!実に非効率的だ。
  • 例えば、""ファイル名:" +__FILE__+ "\n"" のログをカスタマイズしたい場合、あなたのコードを修正するか、クラスを派生させてLog()メソッドを完全に書き直す必要があります。例えば、BINファイルを使用する場合など、どのようなカスタム変更が必要であれ、同じ問題があります。
  • MQL組み込みのものをオーバーライドするPrint()マクロを定義します。ログのPrint()をライブラリのユーザーに強制するのは、非常に悪い考えです。

結論.

あなたのライブラリは正しい基本的なログ・ライブラリです。初心者や自作する時間がないコーダーにとっては、使いやすいロギング機能を提供できるので便利でしょう。

ところで、「ベスト」という修飾語を使うことは正当化されません。機能は正しいが基本的であり、実装は素人レベルである。

 
Alain Verleyen __FILE__+ "\n"" のログをカスタマイズしたい場合、あなたのコードを修正するか、クラスを派生させてLog()メソッドを完全に書き直す必要があります。例えば、BINファイルを使用する場合など、どのようなカスタム変更が必要であれ、同じ問題があります。
  • MQL組み込みのものをオーバーライドするPrint()マクロを定義します。ログの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を使用する必要があると思います。

     
    amrali __FILE__+ "\n"" のログをカスタマイズしたい場合、あなたのコードを修正するか、クラスを派生させてLog()メソッドを完全に書き直す必要があります。例えば、BINファイルを使用する場合など、どのようなカスタム変更が必要であれ、同じ問題があります。
  • MQL組み込みのものをオーバーライドするPrint()マクロを定義します。ログのPrint()をライブラリのユーザーに強制するのは非常に悪い考えです。
  • 結論.

    あなたのライブラリは正しい基本的なログ・ライブラリです。初心者や自作する時間がないコーダーにとっては、使いやすいロギング機能を提供できるので便利でしょう。

    ところで、「ベスト」という修飾語を使うことは正当化されません。機能は正しいが基本的であり、実装は素人レベルである。

    個々の単語を無音にする機能については、スペースや他の文字を含めて単に「start」と書くのが効率的な方法だと思う。結局のところ、他の言語と同様、ログの設定はInit .NETで行うのが理にかなっている。前述したように、誰もが簡単に採用できるようにシンプルである必要があります。もし他に追加する必要があると思うことがあれば、遠慮なく書いてください。印刷」機能については、みなさんが望むなら自由にコメントアウトしてください。

    それ以上の変更には対応します!

     
    Alain Verleyen #:
    残りは非常に基本的な機能です。例えば、MQLの中核はイベント駆動であるため、OnTick()、OnTimer()、またはOnChartEvent()の中にLog()を配置することで簡単に起こり得る、同じエントリーの繰り返しでログが溢れるのを避けるためのログ・システムは必須です。

    この問題を解決するには?

     
    hini #:

    この問題を解決するには?

    実は簡単なのだが、おそらく簡単ではないだろう。

    出力ジャーナルをリストか配列のように考えてみよう。各要素はコード内の特定の場所を表します。つまり、"print to journal "を呼び出すたびに、個別の要素があることになります。

    各要素にはそれぞれエントリーのリストがあり、それらが繰り返される限り(メッセージが前回と等しい限り)、カウンターとタイムスタンプが記録されます。それらが等しくなければ、最初と最後のタイムスタンプとカウンターを含む最後のメッセージを表示する。


    これで、端末のエキスパート・ログにスパムを送らないようにする一種のフィルターができるはずだ。

    プログラムが終了したら、まだプリントされていないメッセージをすべて吐き出す。
     
    Dominik Egert #:
    実際、簡単なことではあるが、おそらく簡単ではないだろう。

    出力ジャーナルはリストか配列だと考えてほしい。各要素はコード内の特定の場所を表します。つまり、"print to journal "を呼び出すたびに、別々の要素があることになります。

    各要素にはそれぞれエントリーのリストがあり、それらが繰り返される限り(メッセージが前回と等しい)、カウンターとタイムスタンプが記録されます。それらが等しくなくなると、最初と最後のタイムスタンプとカウンターを含む最後のメッセージが印刷されます。


    これで、端末のエキスパート・ログにスパムが発生しないように、一種のフィルターができるはずだ。

    プログラムが終了したら、まだ出力されていないメッセージをすべて吐き出す。

    ご回答ありがとうございます。現在、MQL Plus Enhanced Debugging Supportライブラリを使用してログを印刷しています。しかし、時々大量の繰り返しログが印刷されることがあり、今のところこの問題を解決する方法がありません。ご指摘の解決策は一つの方法ですので、時間があるときに試してみます。ロギングシステムを慎重に設計する必要があります。

     
    Dominik Egert #:
    実際、簡単なことではあるが、おそらく簡単ではないだろう。

    出力ジャーナルはリストか配列だと考えてほしい。各要素はコード内の特定の場所を表します。つまり、"print to journal "を呼び出すたびに、別々の要素があることになります。

    各要素にはそれぞれエントリーのリストがあり、それらが繰り返される限り(メッセージが前回と等しい)、カウンターとタイムスタンプが記録されます。それらが等しくなくなると、最初と最後のタイムスタンプとカウンターを含む最後のメッセージが印刷されます。


    これで、端末のエキスパート・ログにスパムが発生しないように、一種のフィルターができるはずだ。

    プログラムが終了したら、まだ出力されていないメッセージをすべて吐き出す。
    シンプルで簡単だ。
     
    hini #:

    ご回答ありがとうございます。現在、貴社のMQL Plus Enhanced Debugging Supportライブラリを使用してログを印刷しています。しかし、時々繰り返しのログが大量に出力されることがあり、今のところこの問題を解決する方法がありません。ご指摘の解決策は一つの方法ですので、時間があるときに試してみます。ロギングシステムを慎重に設計する必要があります。


    lib debugと統合することもできます。

    しかし、lib debugはロギング機能ではなく、コードの完全なトレースを与えるデバッグ・ログを意図しています。