ロギングは、ユーザーが何をしているかについてのストーリーを伝えることになっていることを知っています。例えば:
ユーザー1がモノを作成しました
ユーザー2がモノを削除しました
ユーザー1がモノにアクセスしようとしてエラーが発生しました
これは非常に便利ですが、さらに便利なのは、すべての単一のHTTPリクエストに関する詳細情報があることです。
HTTP GET /Index、UserAgent="..."、Username="..."、HttpResponseStatus 200
HTTP POST/Index/123、UserAgent = "..."、Username = "..."、HttpResponseStatus 201
HTTP DELETE /Index/123、UserAgent="..."、Username="..."、HttpResponseStatus 200
HTTP GET /Index/123、UserAgent="..."、Username="..."、HttpResponseStatus 500
ユーザーがエラーに至るまでに行ったすべてのリクエストに関する情報があると、デバッグ時に非常に役立ちますが、この種の情報は分析領域に少し行き渡り、非常に多くのリクエスト(HTTP GET/Index x 1000)でログを汚染します。
何年も前に、私はあなたがすべてをログに記録すべきではないと教えられました。ログは上記のように「ストーリーを伝える」必要があります。
少し最近のC#/ MVC/ASP.NETの世界では、この種のロギングは Serilog に組み込まれているように思われます "Enrichers" はデフォルトで要求レベルのプロパティをログに記録します:
var logger = new LoggerConfiguration()
.Destructure.UsingAttributes()
.Enrich.With(new HttpRequestIdEnricher())
.Enrich.With(new UserNameEnricher())
.Enrich.With(new HttpRequestRawUrlEnricher())
.Enrich.With(new HttpRequestUserAgentEnricher())
.Enrich.With(new HttpRequestTypeEnricher())
.Enrich.WithProperty("ApplicationRole", "Web")
.Enrich.FromLogContext()
.WriteTo.Seq(ConfigurationManager.AppSettings["SeqServer"])
.CreateLogger();
Seq と組み合わせて、これらのHTTPリクエストを照会し、従来のログステートメントと照合して、ユーザーのWebアプリケーションとの対話のより詳細なストーリーを伝えることができます。
この種のロギングは今や良い習慣と考えられていますか、それともHTTPレベルのログを照合するより良い方法がありますか?
私は「はい」と「いいえ」の両方を言いますが、これが理由です。
はい、すべてのリクエストをログに記録する必要があります。
いいえ、ログに記録するべきではありません。
それでも意味がない場合は、拡大させてください。 :)実行する必要がありますが、実行するのはアプリケーションの仕事ではありません。 ASP.NETを使用している場合は、IIS server?IISがすべてのリクエストをログに記録するようにすでに設定されているはずです。そうでない場合は、変更を確認してください。アプリケーションは、自身の責任の範囲内にあるすべてのものをログに記録する必要があります。生のリクエストでは必ずしも認識されないもの(このユーザーがこれを行ったことなど)。
すべてのログ(リクエスト、認証、アプリなど)がログアグリゲーターに確実に送られるようにすることもできます(本番アプリの場合も必要です)。これにより、あなたが言うように「詳細なストーリー」を簡単に伝えることができ、ハッカーが侵入して、ログをいじくって活動を隠そうとするのを防ぎます。
最近のストレージと帯域幅の安さ、および集中ログの可用性により、すべてのログがより簡単になり、リアルタイムでログをフィルターできると思います。必要に応じて冗長にして、ログの「ストーリー」を読み取る機能に影響を与えないようにすることができます。
集中ロギングを使用していない場合でも、ほとんどのロギングフレームワークは、いくつかの基準に基づいてログを異なるファイルに分離することをサポートしているため、生のHTTPログを1つのファイルに送信し、ログの「ストーリー」を別のファイルに送信できます。