Go 的 log 日志接口使用方法

2022年11月20日 1195点热度 0人点赞 0条评论
内容纲要

使用

Go 中常用的 log 方法:

Print/Printf/Println : 打印日志信息
Panic/Panicf/Panicln : 打印日志信息后,以拼装好的字符串为参数调用 Panic
Fatal/Fatalf/Fatalln : 打印日志信息后,os.Exit(1) 退出程序

New 一个 Logger 的定义如下:

func New(out io.Writer, prefix string, flag int) *Logger {
    return &Logger{out: out, prefix: prefix, flag: flag}
}

type Logger struct {
    mu     sync.Mutex // ensures atomic writes; protects the following fields
    prefix string     // prefix on each line to identify the logger (but see Lmsgprefix)
    flag   int        // properties
    out    io.Writer  // destination for output
    buf    []byte     // for accumulating text to write
}

例如,日志写入文件中:

package main

import (
    "fmt"
    "log"
    "os"
    "time"
)

func main() {
    fn := fmt.Sprint("log-", time.Now().Unix(), ".log")
    logFile, _ := os.Create(fn)
    defer logFile.Close()

    logger := log.New(logFile, "[Debug]", log.Ldate|log.Ltime|log.Lshortfile)
    logger.Println("test debug message")
    logger.SetPrefix("[Info]")
    logger.Println("test info message")

}

file

logger.SetPrefix("[Info]") 可以重新设置前缀;

log.Ldate|log.Ltime|log.Lshortfile 设置日志的 flags,示例中一共有三个枚举,可以让日志附加信息。

生成效果:2022/11/20 09:09:39 main.go:16

log.Ldate 生成 2022/11/20
log.Ltime 生成 09:09:39
log.Lshortfile 生成 main.go:16,表示日志来源于源代码的具体位置。

只打印到控制台:

    logger := log.New(os.Stdout, "[Debug]", log.Ldate|log.Ltime|log.Lshortfile)

file

封装日志

参考 https://www.cnblogs.com/tigerzhouv587/p/11498630.html

package main

import (
    "io"
    "io/ioutil"
    "log"
    "os"
)

var (
    Trace   *log.Logger // 记录所有日志
    Info    *log.Logger // 重要的信息
    Warning *log.Logger // 需要注意的信息
    Error   *log.Logger // 致命错误
)

func init() {
    file, err := os.OpenFile("file", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalln("Failed to open error log file:", err)
    }

    Trace = log.New(ioutil.Discard, "TRACE: ", log.Ltime|log.Lshortfile)
    Info = log.New(os.Stdout, "Info: ", log.Ltime|log.Lshortfile)
    Warning = log.New(os.Stdout, "Warning: ", log.Ltime|log.Lshortfile)
    Error = log.New(io.MultiWriter(file, os.Stderr), "Error", log.Ltime|log.Lshortfile)
}

func main() {
    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")
}

io.MultiWriter(file, os.Stderr) ,可以将一个 IO 流,同时写入到多个 IO 流中。

痴者工良

高级程序员劝退师

文章评论