http - gorilla 处理程序写入文件

标签 http go

import (
    "github.com/gorilla/handlers"
)

func main(){
    ...

    err := http.ListenAndServe(":9000", access_log(r))
    if err != nil {
        log.Fatal("HTTP server: ", err)
    }
}

func access_log(r http.Handler) http.Handler {
    f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
    if err != nil {
        log.Panic("Access log: ", err)
    }

    return handlers.LoggingHandler(io.Writer(f), r)
}

文件已创建,但每次请求时不会向文件写入任何内容

更新

当输出写入os.Stdout时,这才起作用

func access_log(r http.Handler) http.Handler {
    /*f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
    if err != nil {
        log.Panic("Access log: ", err)
    }

    return handlers.LoggingHandler(io.Writer(f), r)*/

    return handlers.LoggingHandler(os.Stdout, r)
}

更新二

func main(){
    runtime.GOMAXPROCS(runtime.NumCPU())

    r := mux.NewRouter()

    www := r.Host("secure.domain.com").Subrouter()
    www.HandleFunc("/", Handler_www)

    api := r.Host("api.domain.com").Subrouter()
    api.HandleFunc("/", Handler_api)

    err := http.ListenAndServe(":9000", access_log(r))
    if err != nil {
        log.Fatal("HTTP server: ", err)
    }
}

func access_log(r http.Handler) http.Handler {
    f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
    if err != nil {
        log.Panic("Access log: ", err)
    }

    return handlers.LoggingHandler(f, r)
}

最佳答案

尝试从一个工作示例开始,如“Making and Using HTTP Middleware”中所述:

package main

import (
  "github.com/gorilla/handlers"
  "net/http"
  "os"
)

func main() {
  finalHandler := http.HandlerFunc(final)

  logFile, err := os.OpenFile("server.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
  if err != nil {
    panic(err)
  }

  http.Handle("/", handlers.LoggingHandler(logFile, finalHandler))
  http.ListenAndServe(":3000", nil)
}

func final(w http.ResponseWriter, r *http.Request) {
  w.Write([]byte("OK"))
}

handlers.LoggingHandler()直接使用该文件,而不是io.Writer(f) .

就您而言:

return handlers.LoggingHandler(f, r)

关于http - gorilla 处理程序写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29603488/

相关文章:

go - 从文件名中删除路径

http - 使用 Go 发出经过身份验证的代理请求?

http - Firefox 加载页面两次(或 3 次),在 firebug 中显示为 Abort 200

.htaccess - 将 http 重定向到 https(不包括子域)

web-services - 基于 HMAC over HTTP 或基于 HTTPS 的单 token 的身份验证系统是否更昂贵?

javascript - 拒绝在 chrome 中获取不安全的 header "Location",在 firefox 中没有内容

Gorm加载相关数据

http - Cookie 详细信息 - 名称和数据

Golang括号语法解释

database - 如何将 +0000 UTC 转换为 +0100 CET