如何在Go中使用chi框架仅记录404等错误请求日志?
使用Chi框架配置仅记录错误状态的请求日志
要实现只记录404、500这类错误状态(状态码≥400)的请求日志,你需要自定义日志中间件,通过捕获响应状态码来过滤日志输出。以下是具体实现方案:
自定义错误日志中间件
直接编写一个中间件,利用Chi提供的middleware.WrapResponseWriter捕获响应状态,仅在状态码符合错误条件时记录日志:
import ( "log" "net/http" "os" "time" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" ) // ErrorLogger 仅记录状态码≥400的请求日志 func ErrorLogger(next http.Handler) http.Handler { // 复用Chi默认的日志格式化器,保持日志格式一致 formatter := middleware.DefaultLogFormatter{ Logger: log.New(os.Stdout, "", log.LstdFlags), NoColor: false, // 生产环境可设为true关闭颜色输出 } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { startTime := time.Now() // 包装ResponseWriter以获取响应状态码 wrappedWriter := middleware.NewWrapResponseWriter(w, r.ProtoMajor) // 继续处理请求 next.ServeHTTP(wrappedWriter, r) // 仅当状态码≥400时记录日志 if status := wrappedWriter.Status(); status >= 400 { formatter.Log(r, wrappedWriter, time.Since(startTime), nil) } }) } // 路由配置 func main() { r := chi.NewRouter() const DEBUG_LOGS = false // 根据实际环境调整 if DEBUG_LOGS { // Debug模式下使用全量日志 r.Use(middleware.Logger) } else { // 生产模式下仅记录错误请求 r.Use(ErrorLogger) } // 后续添加路由处理... r.Get("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte("Hello World")) }) r.Get("/not-found", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) w.Write([]byte("404 Not Found")) }) http.ListenAndServe(":8080", r) }
关键说明
middleware.NewWrapResponseWriter:Chi提供的工具,用于包装原始的ResponseWriter,让我们能获取到最终的响应状态码- 状态码过滤逻辑:通过
wrappedWriter.Status()获取状态,仅在≥400时触发日志记录 - 复用默认格式化器:确保错误日志的格式和Debug模式下的全量日志一致,降低维护成本
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

