HTTP ファイル サーバーでの 404 エラーのログ記録
http.FileServer を使用してディレクトリからファイルを提供する場合、ログを記録する方法がすぐにはわかりませんサーバー コンソールで HTTP 404 エラー (ファイルが見つかりません) が発生する。ブラウザーに「404 ページが見つかりません」というメッセージが表示される場合がありますが、この情報は http.FileServer によって自動的に記録されません。
これに対処するには、両方の http.StripPrefix によって返されるハンドラーの機能を拡張する必要があります。および http.FileServer。これを行うには、それらをカスタム ハンドラーまたはハンドラー関数でラップし、ラッパーを登録します。
ラッパー実装は、ラップされたハンドラーを呼び出します。ラップされたハンドラーが戻った後、ラッパーは HTTP 応答ステータス コードを検査できます。エラー (特に HTTP 404 Not Found) を示している場合、ラッパーはこれを適切にログに記録できます。
ただし、http.ResponseWriter は応答ステータス コードの取得をサポートしていません。これを解決するには、http.ResponseWriter をラップし、後で取得できるようにステータス コードを保存するカスタム StatusRespWr を作成します。
StatusRespWr の実装は次のとおりです。
<code class="go">type StatusRespWr struct { http.ResponseWriter // We embed http.ResponseWriter status int } func (w *StatusRespWr) WriteHeader(status int) { w.status = status // Store the status for our own use w.ResponseWriter.WriteHeader(status) }</code>
次に、 http.Handler をラップします:
<code class="go">func wrapHandler(h http.Handler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { srw := &StatusRespWr{ResponseWriter: w} h.ServeHTTP(srw, r) if srw.status >= 400 { // 400+ codes are error codes log.Printf("Error status code: %d when serving path: %s", srw.status, r.RequestURI) } } }</code>
最後に、メイン関数でファイル サーバーを作成し、それをラップし、ラップされたハンドラーを登録します:
<code class="go">http.HandleFunc("/o/", wrapHandler(http.StripPrefix("/o", http.FileServer(http.Dir("/test"))))) panic(http.ListenAndServe(":8181", nil))</code>
If a request存在しないファイルに対して作成された場合、次のメッセージがログに記録されます:
2015/12/01 11:47:40 Error status code: 404 when serving path: /o/sub/b.txt2
以上がGo の HTTP ファイル サーバーで 404 エラーをログに記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。