ホームページ  >  記事  >  バックエンド開発  >  Go の HTTP ファイル サーバーで 404 エラーをログに記録するにはどうすればよいですか?

Go の HTTP ファイル サーバーで 404 エラーをログに記録するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 20:40:29937ブラウズ

How to Log 404 Errors in Go's HTTP File Server?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。