Go 编程 | 连载 22 - Go 的 Log

简介: Go 编程 | 连载 22 - Go 的 Log

一、Go 的 Log

日志是用来记录程序运行期间发生的情况,无论程序需不需要调试或者是否发生错误,都会产生日志,日志对于立即程序的运行过程或者排查错误原因非常有帮助。

很多应用程序都提供了日志功能,日志功能可以用来监听程序的健康状况、跟踪问题以及发现问题等。

Go 语言提供了 log 包,可以让应用程序能够将日志写入终端或者文件中。

package main
import (
   "fmt"
   "log"
)
func main(){
   log.Println("这是 Go 语言的日志信息")
   fmt.Println("fmt.Printf 标准输出函数信息")
   println("内置 print 函数输出")
}
复制代码

执行上述代码,输出结果如下:

image.png

上述输出结果中 log 标准库下的 Println 函数的输出内容比较醒目而且带有日志输出的时间,fmt.Printlnfmt 包下的标准输出函数,println 是 Go 内置的标准输出\错误函数,虽然输出内容比 fmt.Println 醒目,但是没有日志输出时间。

Log 除了可以记录程序的运行过程外还可以记录程序发生的致命错误

package main
import (
   "errors"
   "fmt"
   "log"
)
func main(){
   div(1, 0)
   fmt.Println(div(2,1))
}
func div(x, y int) (res interface{}, err error){
   if y == 0 {
      res = nil
      err = errors.New("除数不能为 0")
      log.Fatal(err)
      return
   } else {
      res = x / y
      return
   }
}
复制代码

执行上述代码,输出结果如下:

image.png

可以看出程序 log.Fatal 函数不仅输出了报错信息,并且使程序退出不再往下执行。

程序的日志不仅可以输出到终端,还可以记录到文件中,方便日后的追溯,将日志写入文件可以使用 Go 语言本身提供的功能也可以使用操作系统提供的功能

package main
import (
   "log"
   "os"
)
func main(){
   f, err := os.OpenFile("2022-09-02.log", os.O_APPEND | os.O_CREATE | os.O_RDWR, 0777)
   if err != nil {
      log.Fatal(err)
   }
   defer f.Close()
   log.SetOutput(f)
   for i := 1; i < 5; i++ {
      log.Printf("Log iteration %d", i)
   }
}
复制代码

上述代码中 0777 表示存储日志信息文件的权限为可读可写可执行,执行上述代码,查看项目目录下的 2022-09-01.log 文件。

image.png

当然还可以使用操作系统提供的功能将日志输出从终端重定向到文件

// filename: ex3.go
package main
import (
   "log"
)
func main(){
   for i := 1; i < 5; i++ {
      log.Printf("Log iteration %d", i)
   }
}
复制代码

在终端中执行命令 go run ex3.go > 2022-09-03.log 2>&1 既可将日志从控制台重定向到文件中。


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
5月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
174 2
|
10月前
|
设计模式 缓存 算法
Go如何进行高质量编程与性能调优实践
本文介绍了Go语言高质量编程与性能调优的实践方法。高质量编程包括良好的编码习惯(如清晰注释、命名规范)、代码风格与设计(如MVC模式)、简洁明了的代码原则,以及单元测试与代码重构的重要性。性能调优方面,涵盖算法优化、数据结构选择、I/O优化、内存管理、并行与并发处理优化及代码层面的改进。通过这些方法,可有效提升代码质量和系统性能。
205 13
|
10月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
249 10
|
存储 JSON Go
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
269 10
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
282 7
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
261 1
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
291 4
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
496 7
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)