2012-10-11 19 views
7

Próbuję zarejestrować adres IP requestera, metodę, której używają oraz żądany plik. Ale z jakiegoś powodu wyjść tylko na terminalu i nie zapisać go do logfile.txt ...Drukowanie do dziennika przy użyciu usługi Go Język Prosty serwer HTTP

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) 
    } 
} 
+2

Skrypt jak jest (logowanie do konsoli) jest tylko to, co potrzebne. –

Odpowiedz

7

W funkcji Log, używasz fmt.Printf nie fmt.Fprintf.

Na przykład

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() 
} 
+0

Dodałem FprintF (w ... ale jak mogę skierować to do pliku takiego jak logs.txt? (Dzięki za pomoc przy okazji.) –

+0

Zobacz moją poprawioną odpowiedź na zarys rozwiązania. – peterSO

Powiązane problemy