在 Go 語言中使用 Log 包

來源:互聯網
上載者:User
Linux 在許多方面相對於 Windows 來說都是獨特的,在 Linux 中編寫程式也不例外。標準輸出,標準 err 和 null devices 的使用不僅是一個好主意,也是一個原則。如果您的程式將記錄日誌資訊,則最好遵循目標約定。這樣,您的程式將相容所有 Mac/Linux 工具和託管環境。Go 在標準庫中有一個 log 包和 logger 類型。使用 log 包將為您提供成為優秀公民 (譯註:指 log 包相容性非常好) 所需的一切。您將能夠寫入所有標準裝置,自訂檔案或支援 io.Writer 介面的任何目標。我提供了一個非常簡單的樣本,它將協助您開始使用 logger :```gopackage mainimport ( "io" "io/ioutil" "log" "os")var ( Trace *log.Logger Info *log.Logger Warning *log.Logger Error *log.Logger)func Init( traceHandle io.Writer, infoHandle io.Writer, warningHandle io.Writer, errorHandle io.Writer) { Trace = log.New(traceHandle, "TRACE: ", log.Ldate|log.Ltime|log.Lshortfile) Info = log.New(infoHandle, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile) Warning = log.New(warningHandle, "WARNING: ", log.Ldate|log.Ltime|log.Lshortfile) Error = log.New(errorHandle, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile)}func main() { Init(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr) Trace.Println("I have something standard to say") Info.Println("Special Information") Warning.Println("There is something you need to know about") Error.Println("Something has failed")}```運行此程式時,您將獲得以下輸出:```INFO: 2013/11/05 18:11:01 main.go:44: Special InformationWARNING: 2013/11/05 18:11:01 main.go:45: There is something you need to know aboutERROR: 2013/11/05 18:11:01 main.go:46: Something has failed```您會注意到沒有顯示 Trace logging (譯註:追蹤記錄器)。讓我們看看代碼,找出原因。查看 Trace logging 部分的代碼:```govar Trace *log.LoggerTrace = log.New(traceHandle, "TRACE: ", log.Ldate|log.Ltime|log.Lshortfile)Init(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr)Trace.Println("I have something standard to say")```該代碼建立一個名為 Trace 的包級變數,它是一個指向 log.Logger 對象的指標。然後在 Init 函數內部建立一個新的 log.Logger 對象。log.New 函數的參數如下:```gofunc New(out io.Writer, prefix string, flag int) *Logger``````out: The out variable sets the destination to which log data will be written. // 譯註 out 變數設定將寫入日誌資料的目標prefix: The prefix appears at the beginning of each generated log line. // 譯註 首碼出現在每個產生的日誌行的開頭。flags: The flag argument defines the logging properties. // 譯註 flag 參數定義日誌記錄屬性```Flags:```goconst ( // Bits or’ed together to control what’s printed. There is no control over the // order they appear (the order listed here) or the format they present (as // described in the comments). A colon appears after these items: // 2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message Ldate = 1 << iota // the date: 2009/01/23 Ltime // the time: 01:23:23 Lmicroseconds // microsecond resolution: 01:23:23.123123. assumes Ltime. Llongfile // full file name and line number: /a/b/c/d.go:23 Lshortfile // final file name element and line number: d.go:23. overrides Llongfile LstdFlags = Ldate | Ltime // initial values for the standard logger)```在此樣本程式中,Trace 的目標是 ioutil.Discard 。這是一個 null device (譯註:對應 /dev/null 相當於垃圾桶,訊息直接丟棄),所有寫入調用都可以成功而不做任何事情。因此,使用 Trace 寫入時,終端視窗中不會顯示任何內容。再來看看 Info 的代碼:```govar Info *log.LoggerInfo = log.New(infoHandle, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)Init(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr)Info.Println("Special Information")```對於 Info (譯註:訊息記錄器),os.Stdout 傳入到 init 函數給了 infoHandle 。這意味著當您使用 Info 寫訊息時,訊息將通過標準輸出顯示在終端視窗中。最後,看下 Error 的代碼:```govar Error *log.LoggerError = log.New(errorHandle, "ERROR: ", // 譯註: 原文是 INFO 與原始定義不同,應該是筆誤,故直接修改 log.Ldate|log.Ltime|log.Lshortfile)Init(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr)Error.Println("Something has failed") // 譯註: 原文是 Special Information 與原始定義不同,應該是筆誤,故直接修改```這次 os.Stderr 傳入到 Init 函數給了 errorHandle 。這意味著當您使用 Error 寫訊息時,該訊息將通過標準錯誤顯示在終端視窗中。但是,將這些訊息傳遞給 os.Stderr 允許運行程式的其他應用程式知道發生了錯誤。由於支援 io.Writer 介面的任何目標都可以接受,因此您可以建立和使用檔案:```gofile, err := os.OpenFile("file.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil { log.Fatalln("Failed to open log file", output, ":", err)}MyFile = log.New(file, "PREFIX: ", log.Ldate|log.Ltime|log.Lshortfile)```在範例程式碼中,開啟一個檔案,然後將其傳遞給 log.New 函數。現在,當您使用 MyFile 進行寫入時,資料將寫到 file.txt 裡。您還可以讓 logger (譯註:記錄器) 同時寫入多個目標。```gofile, err := os.OpenFile("file.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err != nil { log.Fatalln("Failed to open log file", output, ":", err)}multi := io.MultiWriter(file, os.Stdout)MyFile := log.New(multi, "PREFIX: ", log.Ldate|log.Ltime|log.Lshortfile)```這裡資料將寫入到檔案和標準輸出裡。注意在處理 OpenFile 的任何錯誤時使用 log.Fatalln 方法。 log 包提供了一個可以配置的初始 logger。以下是使用具有標準配置的日誌的樣本程式:```gopackage mainimport ( "log")func main() { log.Println("Hello World")}```以下是輸出:```2013/11/05 18:42:26 Hello World```如果想要刪除或更改輸出格式,可以使用 log.SetFlags 方法:```gopackage mainimport ( "log")func main() { log.SetFlags(0) log.Println("Hello World")}```以下是輸出:```Hello World```現在所有格式都已刪除。如果要將輸出發送到其他目標,請使用 log.SetOutput :```gopackage mainimport ( "io/ioutil" "log")func main() { log.SetOutput(ioutil.Discard) log.Println("Hello World")}```現在終端視窗上不會顯示任何內容。您可以使用任何支援io.Writer 介面的目標。基於這個例子,我為我的所有程式編寫了一個新的日誌包:go get github.com/goinggo/tracelog我希望在開始編寫Go程式時我就知道 log 和 loggers 。期待將來能夠看到我寫的更多日誌包。

via: https://www.ardanlabs.com/blog/2013/11/using-log-package-in-go.html

作者:William Kennedy 譯者:chaoshong 校對:polaris1119

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

167 次點擊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.