【go从零单排】Logging
🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
在 Go 语言中,log 包提供了一种简单的方式来记录日志。它支持多种日志级别和格式,可以将日志输出到不同的目标(如标准输出、文件等)。
设置日志前缀和标志
你可以使用 log.SetPrefix() 和 log.SetFlags() 来设置日志的前缀和格式标志。
- 前缀:在每条日志信息前添加特定的字符串。
- 标志:控制日志输出的内容,例如时间戳、文件名和行号等。
💻代码
基本用法
package main
import (
//bytes: 提供了操作字节切片的功能。
//fmt: 提供格式化输入和输出的功能。
//log: 提供基本的日志记录功能。
//os: 提供与操作系统交互的功能,例如文件操作。
//log/slog: 提供结构化日志记录功能(在 Go 1.21 中引入)。
"bytes"
"fmt"
"log"
"log/slog"
"os"
)
func main() {
//使用标准日志记录器打印一条消息:“standard logger”。
log.Println("standard logger")
//设置日志记录器的标志,包含标准时间格式和微秒,并打印一条消息:“with micro”。
log.SetFlags(log.LstdFlags | log.Lmicroseconds)
log.Println("with micro")
//设置日志记录器的标志,包含标准时间格式和短文件名(文件名和行号),并打印一条消息:“with file/line”。
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("with file/line")
//设置日志记录器的标志,包含标准时间格式和短文件名(文件名和行号),并打印一条消息:“with file/line”。
mylog := log.New(os.Stdout, "my:", log.LstdFlags)
mylog.Println("from mylog")
//更改 mylog 的前缀为 "ohmy:",并打印一条消息:“from mylog”。
mylog.SetPrefix("ohmy:")
mylog.Println("from mylog")
//创建一个 bytes.Buffer 类型的变量 buf,并创建一个新的日志记录器 buflog,将输出写入 buf,带有前缀 "buf:"。
var buf bytes.Buffer
buflog := log.New(&buf, "buf:", log.LstdFlags)
buflog.Println("hello")
//打印 buf 中的内容,输出为:“from buflog:hello”。
fmt.Print("from buflog:", buf.String())
//创建一个 JSON 日志处理器 jsonHandler,将输出写入标准错误(os.Stderr)
jsonHandler := slog.NewJSONHandler(os.Stderr, nil)
//使用该处理器创建一个新的结构化日志记录器 myslog。
myslog := slog.New(jsonHandler)
myslog.Info("hi there")
//使用 myslog 打印一条信息日志:“hello again”,附带一些键值对数据(key: val 和 age: 25)。
myslog.Info("hello again", "key", "val", "age", 25)
}
//输出
//2024/11/13 16:54:04 standard logger
//2024/11/13 16:54:04.976166 with micro
//2024/11/13 16:54:04 post.go:24: with file/line
//my:2024/11/13 16:54:04 from mylog
//ohmy:2024/11/13 16:54:04 from mylog
//from buflog:buf:2024/11/13 16:54:04 hello
//{"time":"2024-11-13T16:54:04.976206+08:00","level":"INFO","msg":"hi there"}
//{"time":"2024-11-13T16:54:04.976227+08:00","level":"INFO","msg":"hello again","key":"val","age":25}
输出到文件
package main
import (
"log"
"os"
)
func main() {
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal(err)
}
defer file.Close()
log.SetOutput(file)
log.Println("This message will be logged to a file.")
}
使用结构化日志
package main
import (
"log/slog"
"os"
)
func main() {
handler := slog.NewJSONHandler(os.Stderr, nil)
logger := slog.New(handler)
logger.Info("This is a structured log message", "key", "value", "age", 30)
}
💪无人扶我青云志,我自踏雪至山巅。