原生日志模块
全局日志输出方法
go
package main
import (
"log"
"log/slog"
)
func main() {
slog.Debug("user-login", "user-id", 1001, "user-ip", "192.168.1.1") // 默认不显示
slog.Info("user-login", "user-id", 1001, "user-ip", "192.168.1.1")
slog.Warn("user-login", "user-id", 1001, "user-ip", "192.168.1.1")
slog.Error("user-login", "user-id", 1001, "user-ip", "192.168.1.1")
// 基本输出方法
log.Print("print")
log.Printf("printf")
log.Println("println")
// 致命错误方法(会退出程序)
log.Fatal("fatal")
// log.Fatalf("fatalf")
// log.Fatalln("fatalln")
// Panic 方法(会触发 panic, 然后终止程序)
// log.Panic("panic")
// log.Panicf("panicf")
// log.Panicln("panicln")
}自定义日志输出格式
控制输出的 Flags
| 常量 | 值 | 说明 | 示例效果 |
|---|---|---|---|
log.Ldate | 1 | 日期 (本地时间) | 2026/03/14 |
log.Ltime | 2 | 时间 (本地时间) | 14:20:00 |
log.Lmicroseconds | 4 | 微秒精度 (配合 Ltime) | 14:20:00.123456 |
log.Llongfile | 8 | 完整文件路径和行号 | /home/user/main.go:10 |
log.Lshortfile | 16 | 仅文件名和行号 | main.go:10 |
log.LUTC | 32 | 使用 UTC 时间而非本地时间 | - |
log.Lmsgprefix | 64 | 将前缀放在头部信息之前 (Go 1.9+) | [INFO] 2026/... |
log.LstdFlags | - | 默认组合: Ldate / Ltime | 2026/03/14 14:20:00 |
go
package main
import (
"log"
"log/slog"
)
func main() {
log.SetFlags(log.LstdFlags | log.Lmicroseconds | log.Llongfile)
log.SetPrefix("[MY-APP-1]")
// [MY-APP-1]2026/03/14 06:50:44.055273 /app/app1/main.go:14: INFO user-login user-id=1001 user-ip=192.168.1.1
slog.Debug("user-login", "user-id", 1001, "user-ip", "192.168.1.1") // 默认不显示
slog.Info("user-login", "user-id", 1001, "user-ip", "192.168.1.1")
slog.Warn("user-login", "user-id", 1001, "user-ip", "192.168.1.1")
slog.Error("user-login", "user-id", 1001, "user-ip", "192.168.1.1")
// 基本输出方法
log.Print("print")
log.Printf("printf")
log.Println("println")
// 致命错误方法(会退出程序)
log.Fatal("fatal")
// log.Fatalf("fatalf")
// log.Fatalln("fatalln")
// Panic 方法(会触发 panic, 然后终止程序)
// log.Panic("panic")
// log.Panicf("panicf")
// log.Panicln("panicln")
}自定义 logger 实例
在实际开发中, 我们可能会创建自己的 logger 实例, 以便将日志输出到指定的位置, 比如文件/日志数据库
go
package main
import (
"io"
"log"
"os"
"time"
)
func main() {
logFilename := time.Now().Format("2006-01-02.log")
file, err := os.OpenFile(logFilename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal("无法打开日志文件:", err)
}
defer file.Close()
// 创建一个同时输出到 stdout 和文件的 logger(多路复用)
// 所谓的多路复用: 既要输出到控制台(stdout)又要输出到文件内容中
mw := io.MultiWriter(os.Stdout, file)
// 设置输出格式/前缀 -> 实例化
logPrefixs := "[MY-APP-1] "
loggerInst := log.New(mw, logPrefixs, log.LstdFlags|log.Lmicroseconds|log.Llongfile)
// 输出测试
loggerInst.Println("服务启动...")
}