2012-10-11 11 views
7

मैं अनुरोधकर्ता का आईपी पता लॉग इन करने का प्रयास कर रहा हूं, वे किस विधि का उपयोग कर रहे हैं और वे किस फ़ाइल का अनुरोध कर रहे हैं। लेकिन किसी कारण से यह केवल टर्मिनल पर आउटपुट और यह logfile.txt को बचाने नहीं करता है ...गो भाषा का उपयोग करके लॉग इन करने के लिए प्रिंट करें सरल 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

आपकी स्क्रिप्ट के रूप में किया जाता है (कंसोल के लिए प्रवेश करने) मैं तो बस क्या जरूरत है। –

उत्तर

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

मैंने FprintF जोड़ा (डब्ल्यू ... लेकिन मैं इसे logs.txt जैसे फ़ाइल में कैसे निर्देशित कर सकता हूं? (सहायता बीटीडब्ल्यू के लिए धन्यवाद।) –

+0

समाधान की रूपरेखा के लिए मेरा संशोधित उत्तर देखें। – peterSO

संबंधित मुद्दे