go語言標準庫 - log

dawnchen發表於2019-04-11

一、目錄

二、log

1. 簡介

該包定義了一個結構體Logger,這個結構體上掛載了以下函式:
1.1 初始化(New)
1.2 設定log風格(SetFlags)
1.3 設定log記錄的載體(SetOutput)
1.4 設定log字首(SetPrefix)
1.5 普通記錄log(Print[f|ln])
1.6 以致命錯誤退出程式並記錄log(Fatal[f|ln])
1.7 以panic形式退出程式並記錄log(Panic[f|ln])
1.8 列印對應函式呼叫棧幀的log(Output)。
為了使用方便,標準庫中還預實現了一個標準Logger,方便我們直接函式呼叫。

2. 直接使用標準Logger

package main

import (
    "log"
    "os"
)

func main(){
    // 可通過SetOutput設定記錄載體(載體只需實現io.Writer介面)。我們這裡選擇標準輸出。
    log.SetOutput(os.Stdout)
    // 設定列印字首
    log.SetPrefix("My log:")
    // 設定列印風格
    /*  
        const (
                Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
                Ltime                         // the time in the local time zone: 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 
                LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
                LstdFlags     = Ldate | Ltime // initial values for the standard logger
        )   
    */  
    log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Llongfile)
    // 往載體中輸入日誌
    log.Println("begin log")
    // 列印風格、字首
    log.Print(log.Flags())
    log.Printf("%s\n", log.Prefix())
    // 列印當前記錄日誌的地方,和呼叫main函式的地方
    log.Output(0, "I'm caller.")
    log.Output(1, "I'm caller's caller")
    log.Output(2, "I'm caller's caller's caller")
    // 以致命錯誤退出,並記錄資訊
    log.Fatalln("I'm exit by Fatal.")
}
複製程式碼

3. 使用自定義Logger

package main

import (
    "bytes"
    "fmt"
    "log"
)

func main() {
    var (
        // 定義一個載體
        buf bytes.Buffer
        // logger初始化,引數分別是載體、字首 和 風格
        logger = log.New(&buf, "INFO: ", log.Lshortfile)
        // 定義Output閉包函式
        infof = func(info string) {
            logger.Output(2, info)
        }   
    )   
    infof("Hello world")
    // 列印載體、字首、風格
    logger.Print(logger.Flags())
    logger.Printf("%s\n", logger.Prefix())
 
    // 列印載體內容
    fmt.Print(&buf) // 也可以寫成 fmt.Print(logger.Writer())   
    
    // 以panic形式退出    
    logger.Panic("I'm exit by Panic")
}
複製程式碼

4. 將log寫入檔案中

package main

import (
	"log"
	"os"
)

func main() {
	f, err := os.OpenFile("test.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
	if nil != err {
		log.Fatal(err)
	}
	defer f.Close()
	log.SetOutput(f)
	log.Println("works")
}
複製程式碼

二、log/syslog

1. 簡介

可通過unix套接字、UDP、TCP去傳送日誌資訊。

2. TCP監聽服務端

package main

import (
	"fmt"
	"io/ioutil"
	"net"
)

func main() {
	localAddress, _ := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080")
	var tcpListener, err = net.ListenTCP("tcp", localAddress)
	if nil != err {
		fmt.Println("監聽出錯:", err)
		return
	}
	defer func() {
		tcpListener.Close()
	}()
	fmt.Println("正在等待連線...")
	var conn, err2 = tcpListener.AcceptTCP()
	if nil != err2 {
		fmt.Println("接受連線失敗:", err2)
		return
	}
	var remoteAddr = conn.RemoteAddr()
	fmt.Println("接收到一個連結:", remoteAddr)
	fmt.Println("正在讀取訊息...")
	var bys, _ = ioutil.ReadAll(conn)
	fmt.Println("接受到客戶端的訊息:", string(bys))
	// conn.Write([]byte("hello, Nice to meet you, my name is Dawn"))
	conn.Close()
}
複製程式碼

3. 直接使用標準Writer

package main

import (
	"log"
	"log/syslog"
)

func main() {
	sysLog, err := syslog.Dial("tcp", "localhost:8080", syslog.LOG_WARNING|syslog.LOG_DAEMON, "demotag")
	if nil != err {
		log.Fatal(err)
	}
	defer sysLog.Close()
	sysLog.Write([]byte("a log message.\n"))
	sysLog.Info("an info message.\n")
	sysLog.Notice("a notice message.\n")
	sysLog.Emerg("an emergency message.\n")
	sysLog.Warning("a warning message.\n")
	sysLog.Err("a err message.\n")
	sysLog.Debug("a debug message.\n")
	sysLog.Crit("a crit message.\n")
	sysLog.Alert("a alert message.\n")
}
複製程式碼

相關文章