2016-11-05 125 views
0

我新使用的語言,仍然學習,需要幫助。我怎樣才能用go語言將我的應用程序日誌寫入類似PHP phalcon框架的「.log」文件?如何將日誌寫入golang中的.log文件?

我有搜索谷歌和得到去語言教程,但沒有簡單的理解的例子。我嘗試了一些例子,但日誌文本不會連續寫入。這裏是我用來學習日誌記錄的例子,我認爲它完全錯了。

package main 

import (
    "bufio" 
    "fmt" 
    "io/ioutil" 
    "os" 
    "time" 
) 

func check(e error) { 
    if e != nil { 
     panic(e) 
    } 
} 



func main() { 

    now := time.Now() 
    dt := now.Format("2006-01-02") 

    dt2 := now.Format("2006-01-02 15:04:05") 

    // To start, here's how to dump a string (or just 
    // bytes) into a file. 
    d1 := []byte("hello\ngo11\n" + dt2) 
    err := ioutil.WriteFile("/Users/my/Documents/work/src/logs/log-"+dt+".log", d1, 0644) 
    check(err) 

    // For more granular writes, open a file for writing. 
    f, err := os.Create("/Users/my/Documents/work/src/logs/log1.log") 
    check(err) 

    // It's idiomatic to defer a `Close` immediately 
    // after opening a file. 
    defer f.Close() 

    // You can `Write` byte slices as you'd expect. 
    d2 := []byte{115, 111, 109, 101, 10} 
    n2, err := f.Write(d2) 
    check(err) 
    fmt.Printf("wrote %d bytes\n", n2) 

    // A `WriteString` is also available. 
    n3, err := f.WriteString("writes\n" + dt) 
    fmt.Printf("wrote %d bytes\n", n3) 

    // Issue a `Sync` to flush writes to stable storage. 
    f.Sync() 

    // `bufio` provides buffered writers in addition 
    // to the buffered readers we saw earlier. 
    w := bufio.NewWriter(f) 
    n4, err := w.WriteString("buffered\n") 
    fmt.Printf("wrote %d bytes\n", n4) 

    // Use `Flush` to ensure all buffered operations have 
    // been applied to the underlying writer. 
    w.Flush() 

} 

回答

5

你正在嘗試很多不同的東西,很難說你的目標什麼特別,但如果你只是想將日誌寫入一個文件,這裏有一個例子:

package main 

import (
     "log" 
     "os" 
) 

func main() { 

     //create your file with desired read/write permissions 
     f, err := os.OpenFile("filename", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) 
     if err != nil { 
       log.Fatal(err) 
     } 

     //defer to close when you're done with it, not because you think it's idiomatic! 
     defer f.Close() 

     //set output of logs to f 
     log.SetOutput(f) 

     //test case 
     log.Println("check to make sure it works") 

} 
1

我建議看看Lumberjack。它可以很好地處理多個文件條件下的滾動日誌。我正在將它用於流媒體網絡傳感器。

0

我有我的記錄器做到這一點,這裏是一個例子。 發送消息給我的IRC發送錯誤,sendSMS發送錯誤給我的手機。 在我的配置文件我有:

var ErrorFile = "error.log" 

type errorLog struct { 
} 

func (e errorLog) Write(p []byte) (n int, err error) { 
fmt.Println("Error: " + string(p)) 
if config.Verbose == 0 { 
    file, _ := os.OpenFile(config.ErrorFile, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) 
    file.WriteString(string(p)) 
    sendMSG(string(p)) 
    sendSMS(string(p)) 
    // Close the file when the surrounding function exists 
    defer file.Close() 
} 

    return n, err 
} 

// Logger is a helpper method to print out a more useful error message 
var Logger = log.New(errorLog{}, "", log.Lmicroseconds|log.Lshortfile) 
1
import (
    "os/exec" 
) 

func main() { 
    // check error here... 
    exec.Command("/bin/sh", "-c", "echo "+err.Error()+" >> log.log").Run() 
}