You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:05:17