Go log包详解

之前看到一句话,一个程序员开始重视日志的时候才是这个程序员从程序员迈向工程师的时候。

在程序开发中,日志是一个非常重要的工具,它可以帮助我们记录和追踪程序的运行状态和错误信息。在Go语言中,log 包是一个基础的标准库,提供了许多日志相关的功能。本文将介绍 log 包的常用函数以及如何配置和使用日志。

常用函数

log 包提供了一些常用的函数,可以方便地打印日志信息。这些函数包括 Print、Printf、Println、Fatal、Fatalf、Fatalln、Panic、Panicf 和 Panicln。它们的功能类似,区别在于添加换行符(ln)和是否触发程序的退出或崩溃。

func Print(v ...interface{})
func Printf(format string, v ...interface{})
func Println(v ...interface{})

func Fatal(v ...interface{})
func Fatalf(format string, v ...interface{})
func Fatalln(v ...interface{})

func Panic(v ...interface{})
func Panicf(format string, v ...interface{})
func Panicln(v ...interface{})

// demo

func printDemo() {
	log.Print("Test Print")
	log.Println("Test Print")
	log.Printf("Test Print")
}

// 输出
2023/05/25 17:37:06 Test Print
2023/05/25 17:37:06 Test Print
2023/05/25 17:37:06 Test Print

Logger类型配置日志

其实整个log包内的这些函数都是由一个Logger类型配置的,默认情况下logger只会返回对应的日志的时间信息,如果我们想设置更多的信息,log包下有一些类型可以让我们自行配置:

const (
	Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
	Ltime                         // the time in the local time zone: 01:23:23
	Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
	Llongfile                     // full file name and line number: /a/b/c/d.go:23
	Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
	LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
	Lmsgprefix                    // move the "prefix" from the beginning of the line to before the message
	LstdFlags     = Ldate | Ltime // initial values for the standard logger
)

默认是LstdFlags,如果我们想配置别的类型只需要,使用SetFlags函数即可,比如Llongfile可以看到整个文件在系统中的位置。

func Flags() int 
func SetFlags(flag int)

配置日志前缀

和flag一样,log标准库,也支持我们自行配置每行日志的前缀信息

func Prefix() string
func SetPrefix(prefix string)

Prefix函数可以让我们的到前缀是什么,比如下面这样:

func prefixDemo() {
	log.SetPrefix("TestPrefix: ")

	log.Print("Test Print")
	log.Println("Test Print")
	log.Printf("Test Print")
	log.Println(log.Prefix())
}

// 输出

TestPrefix: 2023/05/25 17:43:57 Test Print
TestPrefix: 2023/05/25 17:43:57 Test Print
TestPrefix: 2023/05/25 17:43:57 Test Print
TestPrefix: 2023/05/25 17:43:57 TestPrefix: 

配置日志输出位置

我们还可以通过log配置日志输出位置

func SetOutput(w io.Writer)

比如我们可以打开一个log.txt文件来保存所有的日志信息,

logFile, err := os.OpenFile("./log.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
	if err != nil {
		panic(err)
	}

	fmt.Println(log.Prefix())
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
	log.SetOutput(logFile)
	log.Println("Test")

// 输出在文件里的详细信息
2023/05/25 17:47:13.688674 /Users/lixin/xxx/test-std/test-log/log.go:24: Test

其实你打开具体的SetOutput、SetPrefix、SetFlag这些函数,其实都是配置一个已经在log包下创建好的logger结构体。

// SetOutput函数
// SetOutput sets the output destination for the standard logger.
func SetOutput(w io.Writer) {
	std.SetOutput(w)
}

// std 其实只是使用log包下New出来的一个 Logger实例
var std = New(os.Stderr, "", LstdFlags)

所以理论上我们也可以自己New出来一个Logger实例,然后让我们自己New出来的实例去打印日志,实际上许多项目就是这么做的,比如mixin的logger就是自己封装一个log,总共才70行的代码https://github.com/MixinNetwork/mixin/blob/master/logger/log.go。

创建自己的logger

func newLogger() {
	logger := log.New(os.Stdout, "<Test Prefix>", log.LstdFlags)
	logger.Println("Test logger")
}

// 输出
<Test Prefix>2023/05/25 17:58:35 Test logger

总结

log 包是Go语言官方提供的基础日志库,它提供了一些常用的函数和配置选项,可以方便地记录和输出日志信息。然而,它的功能相对简单,如果有更复杂的需求,我们可以选择使用其他成熟的日志库,例如 zap 等。无论使用何种日志库,重视日志的记录和分析对于程序开发和维护都是至关重要的。

全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务