Go log包
Go标准库log提供基本的日志记录功能。
基本日志函数
log.Print
Go
import "log"
// 基本输出
log.Print("hello")
// 输出:2026/05/14 10:30:45 hello
log.Println("hello", "world")
// 输出:2026/05/14 10:30:45 hello world
// 带格式
log.Printf("Name: %s, Age: %d", "Tom", 25)
// 输出:2026/05/14 10:30:45 Name: Tom, Age: 25
默认输出到标准错误,带时间戳。
log.Fatal
Go
// 输出日志并退出进程
log.Fatal("critical error")
// 输出:2026/05/14 10:30:45 critical error
// 然后调用os.Exit(1)
// Fatal不执行defer语句
log.Panic
Go
// 输出日志并panic
log.Panic("panic error")
// 输出日志后调用panic()
// Panic可被recover捕获
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
}
}()
log.Panic("error")
Print系列对比
| 函数 | 行为 | 示例 |
|---|---|---|
| 输出日志 | log.Print(msg) | |
| Println | 输出+换行 | log.Println(msg) |
| Printf | 格式化输出 | log.Printf("%d", n) |
| Fatal | 输出+退出 | log.Fatal(err) |
| Fatalln | 输出+换行+退出 | log.Fatalln(err) |
| Fatalf | 格式化+退出 | log.Fatalf("%s", err) |
| Panic | 输出+panic | log.Panic(err) |
| Panicln | 输出+换行+panic | log.Panicln(err) |
| Panicf | 格式化+panic | log.Panicf("%s", err) |
自定义Logger
log.New创建Logger
Go
// 创建自定义Logger
var logger = log.New(os.Stdout, "INFO: ", log.LstdFlags)
logger.Println("message")
// 输出:INFO: 2026/05/14 10:30:45 message
// 参数:输出目标,前缀,标志
输出到文件
Go
// 日志写入文件
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
defer file.Close()
logger := log.New(file, "APP: ", log.LstdFlags)
logger.Println("application started")
生产环境推荐日志写入文件。
Logger方法
SetPrefix
Go
logger := log.New(os.Stdout, "", log.LstdFlags)
// 设置前缀
logger.SetPrefix("ERROR: ")
logger.Println("something wrong")
// 输出:ERROR: 2026/05/14 10:30:45 something wrong
SetOutput
Go
logger := log.New(os.Stdout, "", log.LstdFlags)
// 更改输出目标
file, _ := os.OpenFile("log.txt", os.O_CREATE|os.O_APPEND, 0644)
logger.SetOutput(file)
SetFlags
Go
// 设置日志标志
logger.SetFlags(log.LstdFlags | log.Lshortfile)
logger.Println("message")
// 输出:2026/05/14 10:30:45 main.go:42: message
日志标志
标志常量
Go
const (
Ldate = 1 << iota // 日期:2026/05/14
Ltime // 时间:10:30:45
Lmicroseconds // 微秒:10:30:45.123456
Llongfile // 文件路径:/a/b/c/main.go:42
Lshortfile // 文件名:main.go:42
LUTC // UTC时间
Lmsgprefix // 前缀在消息前
LstdFlags = Ldate | Ltime // 标准格式
)
组合使用
Go
// 多个标志组合
logger := log.New(os.Stdout, "APP: ", log.Ldate|log.Ltime|log.Lshortfile)
logger.Println("message")
// 输出:APP: 2026/05/14 10:30:45 main.go:42: message
标志效果表
| 标志 | 输出示例 |
|---|---|
| Ldate | 2026/05/14 |
| Ltime | 10:30:45 |
| Lmicroseconds | 10:30:45.123456 |
| Llongfile | /path/to/main.go:42 |
| Lshortfile | main.go:42 |
| LstdFlags | 2026/05/14 10:30:45 |
全局Logger配置
log.SetOutput
Go
// 设置全局Logger输出
file, _ := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE, 0644)
log.SetOutput(file)
log.Println("global log")
log.SetPrefix
Go
// 设置全局前缀
log.SetPrefix("MAIN: ")
log.Println("message")
// 输出:MAIN: 2026/05/14 10:30:45 message
log.SetFlags
Go
// 设置全局标志
log.SetFlags(log.LstdFlags | log.Lshortfile)
日志示例
分级日志
Go
// 不同级别Logger
var (
infoLog = log.New(os.Stdout, "INFO: ", log.LstdFlags)
warnLog = log.New(os.Stdout, "WARN: ", log.LstdFlags)
errorLog = log.New(os.Stderr, "ERROR: ", log.LstdFlags|log.Lshortfile)
)
func main() {
infoLog.Println("application started")
warnLog.Println("config missing, using defaults")
errorLog.Println("database connection failed")
}
日志轮转示例
Go
// 每日新文件
func dailyLogFile() *os.File {
date := time.Now().Format("2006-01-02")
name := fmt.Sprintf("app-%s.log", date)
file, _ := os.OpenFile(name, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
return file
}
logger := log.New(dailyLogFile(), "APP: ", log.LstdFlags)
log.Logger方法
| 方法 | 用途 | 示例 |
|---|---|---|
| 输出日志 | logger.Print(msg) | |
| Printf | 格式化输出 | logger.Printf("%d", n) |
| Println | 输出+换行 | logger.Println(msg) |
| Fatal | 输出+退出 | logger.Fatal(err) |
| Panic | 输出+panic | logger.Panic(err) |
| SetPrefix | 设置前缀 | logger.SetPrefix("APP") |
| SetOutput | 设置输出 | logger.SetOutput(file) |
| SetFlags | 设置标志 | logger.SetFlags(log.Ldate) |
注意事项
Go
// 1. log不提供日志级别过滤
// 推荐使用第三方库如logrus、zap
// 2. Fatal不执行defer
func main() {
defer fmt.Println("cleanup") // 不执行
log.Fatal("error")
}
// 3. 默认输出到stderr
// 适合错误日志,非正常输出
// 4. 单线程安全
// Logger并发写入安全
要点总结
- Print/Println/Printf输出日志
- Fatal输出后调用os.Exit(1)
- Panic输出后调用panic()
- log.New创建自定义Logger
- SetPrefix设置日志前缀
- SetOutput更改输出目标
- SetFlags设置时间格式
- LstdFlags是默认格式
- Lshortfile显示文件名和行号
- 输出到文件用OpenFile
- log包适合简单日志需求
- 生产推荐第三方日志库
📝 发现内容有误?点击此处直接编辑