私は安全性が重要なリアルタイムシステムを使用しており、ドリフトが発生した場合、53日ごとに満月になるとブルームーンに1回現れる珍しいバグをキャッチするための唯一の方法はロギングであることがよくあります。この種のことは、あなたが主題に夢中になるので、口で泡立ち始めたら私は今謝罪します。以下はネイティブコードのデバッグログ用に書かれたものですが、そのほとんどはマネージドワールドにも適用可能です...
テキストログファイルを使用します。当たり前のように見えますが、一部の人々はバイナリログファイルを生成しようとします。それは、私がフィールドにいるときにリーダーツールを探す必要がないからです。さらに、テキストであり、デバッグが冗長な場合、フィールドエンジニアがファイルを読み取って問題を診断できる可能性が高くなります。みんなが勝ちます。
ほとんどすべてをログに記録できるシステムを設計していますが、デフォルトではすべてをオンにするわけではありません。デバッグ情報は非表示のデバッグダイアログに送信され、タイムスタンプが付けられてリストボックスに出力されます(削除前は約500行に制限されています)。接続されたデバッガ。その流用により、複数のアプリケーションからのデバッグ出力をすべてきちんとシリアル化することができます。以前は数値ログレベルを使用していました(レベルを高く設定するほど、より多くキャプチャします)。
off
errors only
basic
detailed
everything
しかし、これはあまりにも柔軟性がありません-バグに向かって進むにつれて、大量の残骸を歩き回る必要なく、必要なものだけにログインを集中させることがはるかに効率的であり、特定の種類のトランザクションまたは操作である可能性がありますエラーが発生します。すべてをオンにする必要がある場合は、自分の仕事を難しくしているだけです。より細かいものが必要です。
だから今、私はフラグシステムに基づいてロギングに切り替えるプロセスにいます。ログに記録されるすべてのものには、それがどのような操作であるかを詳細に示すフラグがあり、ログに記録されるものを定義できるチェックボックスのセットがあります。通常、そのリストは次のようになります。
#define DEBUG_ERROR 1
#define DEBUG_BASIC 2
#define DEBUG_DETAIL 4
#define DEBUG_MSG_BASIC 8
#define DEBUG_MSG_POLL 16
#define DEBUG_MSG_STATUS 32
#define DEBUG_METRICS 64
#define DEBUG_EXCEPTION 128
#define DEBUG_STATE_CHANGE 256
#define DEBUG_DB_READ 512
#define DEBUG_DB_WRITE 1024
#define DEBUG_SQL_TEXT 2048
#define DEBUG_MSG_CONTENTS 4096
このロギングシステムはリリースビルドに付属しており、デフォルトでオンになってファイルに保存されます。バグが平均して6か月に1回しか発生せず、再現する方法がない場合、バグの発生後にログを記録しておくべきであると判断するのは遅すぎます。デバッグビルドでのみ機能するロギングはまさにです。プレーン。ダム。
ソフトウェアは通常、ERROR、BASIC、STATE_CHANGE、EXCEPTIONがオンになった状態で出荷されますが、デバッグダイアログ(またはこれらが保存されるレジストリ/ ini / cfg設定)を介してフィールドで変更できます。
ああ、1つ-私のデバッグシステムは1日に1つのファイルを生成します。要件が異なる場合があります。ただし、デバッグコードは、日付、実行しているコードのバージョン、可能であれば顧客ID、システムの場所などのマーカーですべてのファイルを開始するようにしてください。現場から入ってくるログファイルのミッシュマッシュを手に入れることができ、どこから来たのか、彼らが実際にデータ自体にあるシステムのどのバージョンから来たのかの記録が必要であり、顧客を信頼することはできません/フィールドエンジニアが持っているバージョンを教えてくれます-彼らは自分が持っていると思うバージョンを教えてくれるかもしれません。さらに悪いことに、ディスク上にあるexeバージョンを報告することもありますが、交換後に再起動するのを忘れたため、古いバージョンは引き続き実行されています。コードに自分自身を教えてもらいます。
最後に、コードに独自の問題を発生させたくないので、何日も何週間も経過した後にログファイルをパージするタイマー機能を追加します(現在の時刻とファイル作成の時刻の違いを確認してください)。これは、常に実行されるサーバーアプリでは問題ありません。クライアント側のアプリでは、起動時に古いデータを削除することで取得できます。通常、エンジニアが頻繁に訪問することのないシステムでは、30日程度後にパージします。明らかにこれはログファイルのサイズにも依存しています。