Skip to content

原生日志模块

全局日志输出方法

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.Ldate1日期 (本地时间)2026/03/14
log.Ltime2时间 (本地时间)14:20:00
log.Lmicroseconds4微秒精度 (配合 Ltime)14:20:00.123456
log.Llongfile8完整文件路径和行号/home/user/main.go:10
log.Lshortfile16仅文件名和行号main.go:10
log.LUTC32使用 UTC 时间而非本地时间-
log.Lmsgprefix64将前缀放在头部信息之前 (Go 1.9+)[INFO] 2026/...
log.LstdFlags-默认组合: Ldate / Ltime2026/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("服务启动...")
}

开源日志处理包

Released under the MIT License.