使用Go Language Simple HTTP Server打印到日志

时间:2012-10-11 00:34:50

标签: go

我正在尝试记录请求者的IP地址,他们正在使用什么方法以及他们请求的文件。但由于某种原因,它只在终端上输出,而不是将其保存到logfile.txt ...

package main

import (
  "fmt"
  "net/http"
  "log"
  "encoding/json"
  "io/ioutil"
)

type Options struct {
  Path string
  Port string
}

func Log(handler http.Handler) http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    fmt.Printf("%s %s %s\n", r.RemoteAddr, r.Method, r.URL)
    handler.ServeHTTP(w, r)
  })
}

func main() {

  op := &Options{Path: "./", Port: "8001"}

  data, _ := ioutil.ReadFile("./config.json")

  json.Unmarshal(data, op)

  http.Handle("/", http.FileServer(http.Dir(op.Path)))
  err := http.ListenAndServe(":" + op.Port, Log(http.DefaultServeMux))
  if err != nil {
    log.Fatal("ListenAndServe: ", err)
  }
}

1 个答案:

答案 0 :(得分:7)

Log功能中,您使用fmt.Printf而不是fmt.Fprintf

例如,

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

var logFile *os.File

func Log(handler http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(logFile, "%s %s %s\n", r.RemoteAddr, r.Method, r.URL)
        handler.ServeHTTP(w, r)
    })
}

func main() {
    var err error
    logFile, err = os.Create("logfile.txt")
    if err != nil {
        log.Fatal("Log file create:", err)
        return
    }
    defer logFile.Close()
}