Go 语言标准库中log模块详细功能介绍与示例

Go语言的标准库 log 模块提供了基础的日志记录功能,支持日志输出、格式控制、输出位置设置等。以下是核心方法及示例说明:


1. 基础日志输出

Print, Printf, Println

输出日志信息,不终止程序。

go 复制代码
package main

import "log"

func main() {
    log.Print("这是一条普通日志")       // 输出: 2023/10/01 12:00:00 这是一条普通日志
    log.Printf("格式化日志: %d", 100)    // 输出: 2023/10/01 12:00:00 格式化日志: 100
    log.Println("带换行的日志")         // 输出: 2023/10/01 12:00:00 带换行的日志
}

2. 致命错误日志(终止程序)

Fatal, Fatalf, Fatalln

输出日志并调用 os.Exit(1) 终止程序。

go 复制代码
func main() {
    log.Fatal("程序终止")             // 输出日志并退出,状态码1
    log.Fatalf("错误代码: %d", 404)    // 同上,支持格式化
    log.Fatalln("终止日志")           // 同上,自动换行
}

3. 触发 Panic(可捕获异常)

Panic, Panicf, Panicln

输出日志并触发 panic,可被 recover 捕获。

go 复制代码
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. 设置日志前缀

SetPrefixPrefix

自定义日志前缀,用于标识日志来源(如模块名)。

go 复制代码
func main() {
    log.SetPrefix("[APP] ")          // 设置前缀
    log.Println("启动服务")            // 输出: [APP] 2023/10/01 12:00:00 启动服务
    fmt.Println("当前前缀:", log.Prefix()) // 输出: 当前前缀: [APP] 
}

5. 设置日志输出位置

SetOutput

将日志输出到文件、缓冲区或其他 io.Writer 接口。

go 复制代码
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. 控制日志格式

FlagsSetFlags

设置日志的显示格式(日期、时间、文件名等)。

go 复制代码
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 创建独立日志实例,避免全局设置冲突。

go 复制代码
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 不支持内置级别,但可通过前缀模拟。

go 复制代码
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 实现多目标输出。
相关推荐
iCxhust4 分钟前
c# U盘映像生成工具
开发语言·单片机·c#
yangzhi_emo43 分钟前
ES6笔记2
开发语言·前端·javascript
ai小鬼头1 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
emplace_back2 小时前
C# 集合表达式和展开运算符 (..) 详解
开发语言·windows·c#
jz_ddk2 小时前
[学习] C语言数学库函数背后的故事:`double erf(double x)`
c语言·开发语言·学习
萧曵 丶2 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
xiaolang_8616_wjl2 小时前
c++文字游戏_闯关打怪2.0(开源)
开发语言·c++·开源
收破烂的小熊猫~2 小时前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
老任与码2 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba