当前位置: 首页 > news >正文

GO自带日志库log包解释

GO自带日志库log包解释

package mainimport ("log""os"
)func init() {// 配置日志输出格式log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)// 配置前缀log.SetPrefix("order:")// 配置输出位置logFile, err := os.OpenFile("./test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)if err != nil {log.Panic("打开日志文件异常")}log.SetOutput(logFile)
}func main() {log.Println("golang技术栈-老郭,log标准库测试")
}

下面按执行顺序,把 testdata/demo.go 的 20 来行代码逐句拆开讲,尤其聚焦在标准库 log 的用法上。先整体看下文件结构:

  1. 导入包
  2. init():程序启动时自动运行,用来做日志系统的“一次性配置”
  3. main():业务入口,实际写一条日志

──────────────────────

  1. 导入区
import ("log""os"
)
  • log:Go 自带的轻量级日志库,开箱即用。
  • os:用来跟操作系统交互,这里主要用来打开(或创建)日志文件。

──────────────────────
2. init() 函数 —— 日志系统的“装修阶段”

init()main() 之前自动且只执行一次,常用于配置全局资源。下面 3 步骤依次完成“格式”“前缀”“输出目标”的设置。

a) 配置日志格式:log.SetFlags

log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

log.SetFlags 接收一个 bitmask,决定每条日志前面要自动加哪些信息。

  • log.Ldate2006/01/02
  • log.Ltime15:04:05
  • log.Lshortfile文件名:行号(例如 demo.go:18)。
    | 把三项“或”在一起,所以最终日志行会长这样:
2024/06/10 15:30:21 demo.go:18 your message...

如果不调用 SetFlags,默认只带 Ldate | Ltime

b) 配置统一前缀:log.SetPrefix

log.SetPrefix("order:")

给所有日志行再添一个字符串前缀,这里写了 "order:"。继续延伸刚才示例:

order:2024/06/10 15:30:21 demo.go:18 your message...

常用来区分不同模块或组件打出的日志。

c) 把日志写到文件:log.SetOutput

logFile, err := os.OpenFile("./test.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)
...
log.SetOutput(logFile)

解释这几行:

  1. os.OpenFile 打开或创建 ./test.log
    os.O_CREATE:如果文件不存在就创建。
    os.O_WRONLY:只写。
    os.O_APPEND:每次写都追加到文件末尾,不会覆盖旧内容。
    权限 0644:文件所有者可读写,组和其他用户只读。

  2. 错误处理:若返回 err != nil,直接 log.Panic(...)log.Panic 会打印信息后触发 panic,程序立即中断。这算是简单暴力的“初始化失败立刻退出”。

  3. log.SetOutput(logFile) 把 log 的默认输出从 “终端的 stderr” 改成了 test.log 文件。所以之后的 log.Println 都会写入该文件,而不是显示在控制台。

──────────────────────
3. main() —— 正式写一条日志

func main() {log.Println("golang技术栈-老郭,log标准库测试")
}
  • log.Println 等价 fmt.Println+前缀+换行,会按照刚才配置好的“前缀 + 时间 + 文件行号”格式输出。
  • 因为 SetOutput 指向了 test.log,所以这行文字会被追加到日志文件末尾,而不是打印在终端。

──────────────────────
关键知识点小结

  1. log 包四大基本函数
    SetFlags(bitmask):决定“固定装饰信息”
    SetPrefix(string):统一前缀
    SetOutput(io.Writer):输出目的地(默认 stderr,可改成文件、网络、甚至多路复用 writer)
    • 各种写日志:Print/Printf/Println, Fatal*(写完后 os.Exit(1)),Panic*(写完后 panic

  2. 为什么放在 init()
    Go 会在 main() 之前依次执行所有文件里的 init(),适合做一次性全局配置;写在这里不会被业务逻辑误删或漏写。

  3. 文件句柄要不要关闭?
    严格来说,程序结束前最好 defer logFile.Close();不过 Demo 很短,进程结束时内核会回收句柄。

  4. 如果要按天分割日志或增加日志级别(INFO/WARN/ERROR),log 包本身就不支持,需要再封一层或改用社区库(如 logrus, zap, zerolog 等)。

这样,你就清晰地了解了如何利用 Go 标准库 log 在几行代码内完成“日志格式化 + 自定义前缀 + 输出到文件”的常见需求。

相关文章:

  • RAG->大模型搜索search-R1
  • Java中高并发线程池的相关面试题详解
  • AE之番外篇
  • 模型上下文协议(MCP)实践指南
  • 深入解析默认值工具类:DefaultUtil
  • TF-IDF算法详解与实践总结
  • 上海市计算机学会竞赛平台第六届上海市青少年算法竞赛网络赛(青年组)平方的和
  • Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
  • 【2025CVPR】花粉识别新标杆:HieraEdgeNet多尺度边缘增强框架详解
  • 【PhysUnits】17.6 Unit基础结构(unit.rs)
  • python模拟键盘 鼠标操作 通过ctypes调用Windows API实现底层输入模拟
  • Android Studio 问题:Android Studio 一直开在 Updating indexes
  • 使用Mvnd加速Maven构建速度
  • 深度学习核心概念:优化器、模型可解释性与欠拟合
  • TI以太网PHY收发器晶体选择和规格
  • OpenGL学习20250610
  • 定时器任务——若依源码分析
  • 376. Wiggle Subsequence
  • Windows cmd中文乱码解决方法(Windows控制台中文乱码、CMD乱码、控制台乱码、Command Prompt命令提示符cmd.exe乱码)
  • docker 安装运行mysql8.4.4
  • 成都网站设计培训/营业推广经典案例
  • 访问量大的网站选择多少流量的服务器何时/免费seo搜索优化
  • 民政局网站建设方案/关键词排名优化软件价格
  • 网站建设中 什么意思/百度怎么转人工客服
  • 犀牛建模教程/免费seo教程分享
  • 长沙网站推广智投未来/网站seo关键词