大猩猩处理程序将内容写入文件。

huangapple go评论116阅读模式
英文:

gorilla handlers write to file

问题

  1. import (
  2. "github.com/gorilla/handlers"
  3. )
  4. func main(){
  5. ...
  6. err := http.ListenAndServe(":9000", access_log(r))
  7. if err != nil {
  8. log.Fatal("HTTP server: ", err)
  9. }
  10. }
  11. func access_log(r http.Handler) http.Handler {
  12. f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
  13. if err != nil {
  14. log.Panic("Access log: ", err)
  15. }
  16. return handlers.LoggingHandler(io.Writer(f), r)
  17. }

文件已创建,但每次请求时没有写入文件。

#更新

当输出写入os.Stdout时,这个方法可以工作。

  1. func access_log(r http.Handler) http.Handler {
  2. /*f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
  3. if err != nil {
  4. log.Panic("Access log: ", err)
  5. }
  6. return handlers.LoggingHandler(io.Writer(f), r)*/
  7. return handlers.LoggingHandler(os.Stdout, r)
  8. }

#更新 II

  1. func main(){
  2. runtime.GOMAXPROCS(runtime.NumCPU())
  3. r := mux.NewRouter()
  4. www := r.Host("secure.domain.com").Subrouter()
  5. www.HandleFunc("/", Handler_www)
  6. api := r.Host("api.domain.com").Subrouter()
  7. api.HandleFunc("/", Handler_api)
  8. err := http.ListenAndServe(":9000", access_log(r))
  9. if err != nil {
  10. log.Fatal("HTTP server: ", err)
  11. }
  12. }
  13. func access_log(r http.Handler) http.Handler {
  14. f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
  15. if err != nil {
  16. log.Panic("Access log: ", err)
  17. }
  18. return handlers.LoggingHandler(f, r)
  19. }
英文:
  1. import (
  2. "github.com/gorilla/handlers"
  3. )
  4. func main(){
  5. ...
  6. err := http.ListenAndServe(":9000", access_log(r))
  7. if err != nil {
  8. log.Fatal("HTTP server: ", err)
  9. }
  10. }
  11. func access_log(r http.Handler) http.Handler {
  12. f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
  13. if err != nil {
  14. log.Panic("Access log: ", err)
  15. }
  16. return handlers.LoggingHandler(io.Writer(f), r)
  17. }

The file is created but nothing is written to the file on each request

#update

This works when the output is written to os.Stdout

  1. func access_log(r http.Handler) http.Handler {
  2. /*f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
  3. if err != nil {
  4. log.Panic("Access log: ", err)
  5. }
  6. return handlers.LoggingHandler(io.Writer(f), r)*/
  7. return handlers.LoggingHandler(os.Stdout, r)
  8. }

#update II

  1. func main(){
  2. runtime.GOMAXPROCS(runtime.NumCPU())
  3. r := mux.NewRouter()
  4. www := r.Host("secure.domain.com").Subrouter()
  5. www.HandleFunc("/", Handler_www)
  6. api := r.Host("api.domain.com").Subrouter()
  7. api.HandleFunc("/", Handler_api)
  8. err := http.ListenAndServe(":9000", access_log(r))
  9. if err != nil {
  10. log.Fatal("HTTP server: ", err)
  11. }
  12. }
  13. func access_log(r http.Handler) http.Handler {
  14. f, err := os.OpenFile("log/access.log", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
  15. if err != nil {
  16. log.Panic("Access log: ", err)
  17. }
  18. return handlers.LoggingHandler(f, r)
  19. }

答案1

得分: 4

尝试从一个工作示例开始,如“制作和使用HTTP中间件”中所述:

  1. package main
  2. import (
  3. "github.com/gorilla/handlers"
  4. "net/http"
  5. "os"
  6. )
  7. func main() {
  8. finalHandler := http.HandlerFunc(final)
  9. logFile, err := os.OpenFile("server.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
  10. if err != nil {
  11. panic(err)
  12. }
  13. http.Handle("/", handlers.LoggingHandler(logFile, finalHandler))
  14. http.ListenAndServe(":3000", nil)
  15. }
  16. func final(w http.ResponseWriter, r *http.Request) {
  17. w.Write([]byte("OK"))
  18. }

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

在你的情况下:

  1. return handlers.LoggingHandler(f, r)
英文:

Try starting from a working example, as described in "Making and Using HTTP Middleware":

  1. package main
  2. import (
  3. "github.com/gorilla/handlers"
  4. "net/http"
  5. "os"
  6. )
  7. func main() {
  8. finalHandler := http.HandlerFunc(final)
  9. logFile, err := os.OpenFile("server.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
  10. if err != nil {
  11. panic(err)
  12. }
  13. http.Handle("/", handlers.LoggingHandler(logFile, finalHandler))
  14. http.ListenAndServe(":3000", nil)
  15. }
  16. func final(w http.ResponseWriter, r *http.Request) {
  17. w.Write([]byte("OK"))
  18. }

The handlers.LoggingHandler() uses the file directly, not io.Writer(f).

In your case:

  1. return handlers.LoggingHandler(f, r)

huangapple
  • 本文由 发表于 2015年4月13日 18:48:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/29603488.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定