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 实现多目标输出。
相关推荐
有梦想的攻城狮7 分钟前
【一起来学kubernetes】29、NFS使用详解
云原生·容器·kubernetes·nfs·网络文件系统
闪电麦坤9512 分钟前
C#:Time.deltaTime
开发语言·c#
这个懒人40 分钟前
Kubernetes深度解析:云原生时代的容器编排引擎
云原生·容器·kubernetes
Alfadi联盟 萧瑶2 小时前
Python-Django入手
开发语言·python·django
codingandsleeping3 小时前
浏览器的缓存机制
前端·后端
-代号95273 小时前
【JavaScript】十二、定时器
开发语言·javascript·ecmascript
勘察加熊人3 小时前
c++实现录音系统
开发语言·c++
self-discipline6343 小时前
【Java】Java核心知识点与相应面试技巧(七)——类与对象(二)
java·开发语言·面试
wei3872452323 小时前
java笔记02
java·开发语言·笔记
追逐时光者3 小时前
面试官问:你知道 C# 单例模式有哪几种常用的实现方式?
后端·.net