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

embedded/2025/4/1 7:17:47/

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. 设置日志前缀

SetPrefixPrefix

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

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. 控制日志格式

FlagsSetFlags

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

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 实现多目标输出。

http://www.ppmy.cn/embedded/177746.html

相关文章

HTML输出流

HTML 输出流 JavaScript 中**「直接写入 HTML 输出流」**的核心是通过 document.write() 方法向浏览器渲染过程中的数据流动态插入内容。以下是详细解释&#xff1a; 一、HTML 输出流的概念 1. 动态渲染过程 HTML 文档的加载是自上而下逐行解析的。当浏览器遇到 <script&…

数仓架构告别「补丁」时代!全新批流一体 Domino 架构终结“批流缝合”

在数字化转型的浪潮中&#xff0c;企业对数据处理的需求日益复杂多变&#xff0c;传统的批处理和流处理架构已难以满足日益增长的性能和时效性要求。在此背景下&#xff0c;YMatrix CEO 姚延栋发布了深度文章《数仓架构告别「补丁」时代&#xff01;全新批流一体 Domino 架构终…

Opencv 图像读取与保存问题

本文仅对 Opencv图像读取与保存进行阐述&#xff0c;重在探讨图像读取与保存过程中应注意的细节问题。 1 图像读取 首先看一下&#xff0c;imread函数的声明&#xff1a; // C: Mat based Mat imread(const string& filename, int flags1 );// C: IplImage based IplImage*…

第21周:RestNet-50算法实践

目录 前言 理论知识 1.CNN算法发展 2.-残差网络的由来 一、导入数据 二、数据处理 四、编译 五、模型评估 六、总结 前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 理论知识 1.CNN算法发展 该图列举出…

C++20新特性:std::assume_aligned详解

文章目录 一、概述二、函数定义与语法三、使用方法与注意事项1. 使用方法2. 注意事项 四、性能优化原理五、实际应用场景六、编译器支持情况七、总结 一、概述 C20引入了std::assume_aligned&#xff0c;这是一个非常实用的特性&#xff0c;用于告知编译器某个指针所指向的对象…

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline&#xff1a;端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE&#xff08;Variational AutoEncoder&#xff09;图像尺寸与 UNet 和 VAE 的关系EMA&#xff08;Exponential Moving…

重学Java基础篇—什么是快速失败(fail-fast)和安全失败(fail-safe)?

快速失败&#xff08;fail-fast&#xff09; 和 安全失败&#xff08;fail-safe&#xff09; 是两种不同的迭代器设计策略&#xff0c;主要用于处理集合&#xff08;如 List、Map&#xff09;在遍历过程中被修改的场景。 它们的核心区别在于对并发修改的容忍度和实现机制。 1…

QT登录注册模块(客户端)

一、整体架构分析 本模块采用典型的C/S架构设计&#xff0c;客户端使用Qt框架实现GUI界面和本地数据交互功能。代码结构包含5个核心文件&#xff1a; main.cpp&#xff1a;应用程序入口mainwindow.h/cpp&#xff1a;主窗口逻辑实现registerdialog.h/cpp&#xff1a;注册对话…