Go 编程 | 连载 22 - Go 的 Log

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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 既可将日志从控制台重定向到文件中。


相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
26天前
|
存储 算法 Go
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
|
26天前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
8天前
|
Python
Python编程实战:利用闭包与装饰器优化日志记录功能
【7月更文挑战第7天】Python的闭包和装饰器简化了日志记录。通过定义如`log_decorator`的装饰器,可以在不修改原函数代码的情况下添加日志功能。当@log_decorator用于`add(x, y)`函数时,调用时自动记录日志。进一步,`timestamp_log_decorator`展示了如何创建特定功能的装饰器,如添加时间戳。这些技术减少了代码冗余,提高了代码的可维护性。
15 1
|
26天前
|
消息中间件 存储 监控
go语言并发实战——日志收集系统(六) 编写日志收集系统客户端
go语言并发实战——日志收集系统(六) 编写日志收集系统客户端
|
26天前
|
消息中间件 存储 Kafka
go语言并发实战——日志收集系统(二) Kafka简介
go语言并发实战——日志收集系统(二) Kafka简介
|
26天前
|
监控 Go
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
|
26天前
|
监控 Go
go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件
go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件
|
26天前
|
存储 JSON 监控
go语言并发实战——日志收集系统(九) 基于etcd的代码重构思考与初步实现
go语言并发实战——日志收集系统(九) 基于etcd的代码重构思考与初步实现
|
26天前
|
消息中间件 Kafka Go
go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件
go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件
|
26天前
|
存储 监控 算法
go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控
go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控