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

go标准库log模块学习笔记

一、日志输出

log模块有三个日志输出函数,分别为:

  1. Print \ Printf \ Println
  2. Panic \ Panicf \ Panicln
  3. Fatal \ Fatalf \ Fatalln
  • Printf对应普通日志,可以多条持续记录
  • Panic打印后,会抛出异常,可以使用recover捕获;抛出异常后,后面的代码将不再执行。
  • Fatal打印日志后,直接调用os.Exit(1) 退出程序。

1.1 普通日志

package mainimport ("log""os"
)func main() {log.Print("这是一条普通日志")log.Printf("格式化日志: %d", 100)log.Println("带换行的日志9")
}

1.2 Paic日志

注意:log.Panic("触发panic")执行后,程序将抛出异常,后面的代码不会执行。

defer声明的函数是延迟函数,在main函数执行完后调用,此时,可以捕获main抛出的异常。

执行好,

package mainimport ("fmt""log""os"
)func main() {defer func() {if err := recover(); err != nil {log.Println("捕获到 panic:", err)}}()//输出日志并触发 panic,可被 recover 捕获, 触发后, 后面的代码将不执行。log.Panic("触发panic")log.Println("此条日志不会打印")
}

1.3 致命日志

注意:log.Fatal("程序终止")  执行后,程序将退出。

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

二、设置前缀、输出位置、日志格式

2.1 SetPrefix和Prefix

SetPrefix函数用于设置前缀, Prefix函数用于获取前缀

package mainimport ("fmt""log"
)func main() {log.SetPrefix("[APP] ") // 设置前缀fmt.Println("当前前缀: ", log.Prefix())
}

2.2 设置日志输出位置

2.2.1 设置单文件输出

package mainimport ("log""os"
)func main() {file, _ := os.Create("app.log")defer file.Close()log.SetOutput(file)log.Println("这条日志写入文件")
}

2.2.2 设置多方式输出

package mainimport ("io""log""os"
)func main() {// 输出到控制台和文件file, _ := os.Create("fileLog.txt")multiWrite := io.MultiWriter(os.Stdout, file)log.SetOutput(multiWrite)log.Println("同时输出到控制台和文件")
}

2.3 设置日志格式

常用标志常量:

  • Ldate:显示日期(如 2006/01/02)
  • Ltime:显示时间(如 15:04:05)
  • Lmicroseconds:显示微秒
  • Llongfile:完整文件名(如 /app/main.go:20)
  • Lshortfile:短文件名(如 main.go:20)
  • LUTC:使用 UTC 时间
package mainimport "log"func main() {//自定义日志格式log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)log.Println("自定义格式")
}

三、自定义日志对象

通过 log.New 创建独立日志实例,避免全局设置冲突。

package mainimport ("log""os"
)func main() {// 自定义日志对象logger := log.New(os.Stdout, "[APP] ", log.Ldate|log.Ltime|log.Lshortfile)logger.Print("自定义日志")file, _ := os.Create("custom.log")logger.SetOutput(file)logger.Println("写入文件")
}

四、模拟日志级别

标准库 log 不支持内置级别,但可通过前缀模拟。

package mainimport ("log""os"
)func main() {// 模拟日志级别infoLog := log.New(os.Stdout, "[INFO]", log.LstdFlags)errorLog := log.New(os.Stderr, "[ERROR]", log.LstdFlags|log.Lshortfile)infoLog.Println("服务启动成功")errorLog.Println("数据库连接失败")
}

http://www.lryc.cn/news/603677.html

相关文章:

  • Gartner发布2025年数据安全技术成熟度曲线:29项最新数据安全相关技术发展和应用趋势
  • 2025-07-29 学习记录--LaTeX-LaTeX知识点总结
  • 从硬编码到自主智能体:营销AI的20年技术演进与未来展望
  • decoupleQ:通过将参数解耦为整数与浮点数,实现2比特后训练统一量化
  • AI搜索SEO优化解决方案指南
  • 基于Dify构建本地化知识库智能体:从0到1的实践指南
  • 6、微服务架构常用十种设计模式
  • elememtor 添加分页功能
  • Vant:轻量可靠的移动端 Vue 组件库深度解析
  • prometheus_client 调用统计
  • HBase、MongoDB 和 Redis 的区别详解
  • Ubuntu 抽取系统制作便于chroot的镜像文件
  • P1020 [NOIP 1999 提高组] 导弹拦截
  • 动态库示例
  • 代码随想录算法训练营第三十五天
  • BGP团体属性
  • MybatisPlus-20.插件功能-通用分页实体与MP转换
  • 【IQA技术专题】纹理相似度图像评价指标DISTS
  • AAA 与 FTP:网络认证授权及文件传输的原理与实践
  • 如何在 Ubuntu 24.04 或 22.04 Linux 上安装和运行 Redis 服务器
  • Redis的持久化策略-AOF和RDB(详细图解)
  • 广告投放数据与管理全解析:从数据解读到高效运营
  • ansible 使用更高版本的python版本
  • 设计一个高可用、可拓展、监控报警系统,使用普罗米修斯和grafana,并给出go实现
  • 第2章 cmd命令基础:常用基础命令(1)
  • SQL排查、分析海量数据以及锁机制
  • 微算法科技(NASDAQ:MLGO)应用区块链联邦学习(BlockFL)架构,实现数据的安全传输
  • Java:为什么需要通配符捕获(wildcard capture)
  • 大文件的切片上传和断点续传前后端(Vue+node.js)具体实现
  • 巡台效率:精准胜勤快