Go语言的标准库 log
模块提供了基础的日志记录功能,支持日志输出、格式控制、输出位置设置等。以下是核心方法及示例说明:
1. 基础日志输出
Print
, Printf
, Println
输出日志信息,不终止程序。
package mainimport "log"func main() {log.Print("这是一条普通日志") // 输出: 2023/10/01 12:00:00 这是一条普通日志log.Printf("格式化日志: %d", 100) // 输出: 2023/10/01 12:00:00 格式化日志: 100log.Println("带换行的日志") // 输出: 2023/10/01 12:00:00 带换行的日志
}
2. 致命错误日志(终止程序)
Fatal
, Fatalf
, Fatalln
输出日志并调用 os.Exit(1)
终止程序。
func main() {log.Fatal("程序终止") // 输出日志并退出,状态码1log.Fatalf("错误代码: %d", 404) // 同上,支持格式化log.Fatalln("终止日志") // 同上,自动换行
}
3. 触发 Panic(可捕获异常)
Panic
, Panicf
, Panicln
输出日志并触发 panic
,可被 recover
捕获。
func main() {defer func() {if err := recover(); err != nil {log.Println("捕获到 panic:", err)}}()log.Panic("触发 panic") // 输出日志并触发 panic
}
// 输出:
// 2023/10/01 12:00:00 触发 panic
// 2023/10/01 12:00:00 捕获到 panic: 触发 panic
4. 设置日志前缀
SetPrefix
和 Prefix
自定义日志前缀,用于标识日志来源(如模块名)。
func main() {log.SetPrefix("[APP] ") // 设置前缀log.Println("启动服务") // 输出: [APP] 2023/10/01 12:00:00 启动服务fmt.Println("当前前缀:", log.Prefix()) // 输出: 当前前缀: [APP]
}
5. 设置日志输出位置
SetOutput
将日志输出到文件、缓冲区或其他 io.Writer
接口。
func main() {// 输出到文件file, _ := os.Create("app.log")defer file.Close()log.SetOutput(file)log.Println("这条日志写入文件") // 内容写入 app.log// 输出到控制台和文件(多目标)multiWriter := io.MultiWriter(os.Stdout, file)log.SetOutput(multiWriter)log.Println("同时输出到控制台和文件")
}
6. 控制日志格式
Flags
和 SetFlags
设置日志的显示格式(日期、时间、文件名等)。
func main() {// 默认格式:日期 + 时间(LstdFlags = Ldate | Ltime)log.Println("默认格式") // 输出: 2023/10/01 12:00:00 默认格式// 自定义格式(显示毫秒和文件名)log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)log.Println("自定义格式") // 输出: 2023/10/01 12:00:00.000000 main.go:20: 自定义格式
}
常用标志常量:
Ldate
:显示日期(如2006/01/02
)Ltime
:显示时间(如15:04:05
)Lmicroseconds
:显示微秒Llongfile
:完整文件名(如/app/main.go:20
)Lshortfile
:短文件名(如main.go:20
)LUTC
:使用 UTC 时间
7. 自定义日志对象
通过 log.New
创建独立日志实例,避免全局设置冲突。
func main() {// 创建自定义日志实例logger := log.New(os.Stdout, "[CUSTOM] ", log.Ldate|log.Ltime)logger.Println("自定义日志") // 输出: [CUSTOM] 2023/10/01 12:00:00 自定义日志// 设置输出到文件file, _ := os.Create("custom.log")logger.SetOutput(file)logger.Println("写入文件")
}
8. 模拟日志级别
标准库 log
不支持内置级别,但可通过前缀模拟。
func main() {// 定义不同级别的日志函数infoLog := log.New(os.Stdout, "[INFO] ", log.LstdFlags)errorLog := log.New(os.Stderr, "[ERROR] ", log.LstdFlags|log.Lshortfile)infoLog.Println("服务启动成功") // 输出: [INFO] 2023/10/01 12:00:00 服务启动成功errorLog.Println("数据库连接失败") // 输出: [ERROR] 2023/10/01 12:00:00 main.go:30: 数据库连接失败
}
总结
- 核心方法:
- 输出日志:
Print
,Fatal
,Panic
系列 - 格式控制:
SetFlags
,SetPrefix
,SetOutput
- 独立实例:
log.New
- 输出日志:
- 适用场景:
- 简单日志需求(无分级日志)
- 快速记录程序运行状态或错误
- 自定义输出到文件、网络等位置
- 扩展建议:
- 复杂需求(如日志分级、轮转)可使用第三方库(如
zap
,logrus
)。 - 通过
io.MultiWriter
实现多目标输出。
- 复杂需求(如日志分级、轮转)可使用第三方库(如