当前位置: 首页 > 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.dtcms.com/a/303999.html

相关文章:

  • spring cloud sentinel 动态规则配置
  • css3之三维变换详说
  • Windows系统ffmpeg.dll丢失怎么办?从错误分析到永久修复的完整流程
  • FPGA实现SRIO高速接口与DSP交互,FPGA+DSP异构方案,提供3套工程源码和技术支持
  • 处理订单过期但支付成功的系统设计:平衡用户体验与业务规则
  • 设计模式:中介者模式 Mediator
  • Oracle发布MCP Server,自然语言交互说“人话”
  • Kubernetes高级调度01
  • 设计模式十三:代理模式(Proxy Pattern)
  • pygame 模拟放飞气球
  • hive专题面试总结
  • Python 日期时间格式化与解析的瑞士军刀:`strftime()` 与 `strptime()`
  • 三、Linux用户与权限管理详解
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现各种食物的类型检测识别(C#代码UI界面版)
  • 学习嵌入式的第三十四天-数据结构-(2025.7.29)数据库
  • 小杰数据结构(one day)——心若安,便是晴天;心若乱,便是阴天。
  • 【数据可视化-75】北京密云区2025年7月暴雨深度分析:Python + Pyecharts 炫酷大屏可视化(含完整数据、代码)
  • Prometheus + Grafana + Micrometer 监控方案详解
  • Java:为什么需要通配符捕获(wildcard capture)
  • HbuilderX开发小程序
  • 定制开发开源AI智能名片S2B2C商城小程序对流量重构与价值提升的作用研究
  • 使用git托管keil工程
  • React函数组件的“生活管家“——useEffect Hook详解
  • C++:stack与queue的使用
  • 40+个常用的Linux指令——下
  • 基于变频与移相混合控制(PFM+PSM)的全桥LLC谐振变换器仿真模型
  • 机械臂抓取的无模型碰撞检测代码
  • 仿函数+优先级队列priority_queue的模拟实现
  • P2910 [USACO08OPEN] Clear And Present Danger S
  • AutoGen Agent 使用指南