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 实现多目标输出。
相关推荐
君鼎26 分钟前
IO复用详解——C/C++
开发语言·c++
Clown9530 分钟前
go-zero(十八)结合Elasticsearch实现高效数据检索
开发语言·elasticsearch·golang
愚润求学30 分钟前
【Linux】动静态库的使用
linux·运维·服务器·开发语言·c++·笔记
bing_15832 分钟前
Spring Boot 项目中什么时候会抛出 FeignException?
java·spring boot·后端
写代码写到手抽筋41 分钟前
C++性能优化之访存优化(未完)
开发语言·c++
Dovis(誓平步青云)1 小时前
基于面向对象设计的C++日期推算引擎:精准高效的时间运算实现与运算重载工程化实践
开发语言·c++·经验分享·笔记
Java&Develop1 小时前
springboot + mysql8降低版本到 mysql5.7
java·spring boot·后端
sg_knight1 小时前
从单体架构到微服务:架构演进之路
java·spring boot·spring·spring cloud·微服务·云原生·架构
夜晚中的人海1 小时前
【C语言】初阶数据结构相关习题(二)
c语言·开发语言·数据结构
武昌库里写JAVA1 小时前
MacOS Python3安装
java·开发语言·spring boot·学习·课程设计