使用log.Println函数打印日志信息到控制台
在Go语言中,我们常常需要输出一些日志信息来帮助我们调试和监控程序的运行情况。使用log包提供的函数,我们可以很方便地在控制台输出不同级别的日志信息。
log包提供了多个函数用于输出不同级别的日志信息,其中最常用的函数是log.Println。当前函数会将传入的参数打印到标准输出,每个参数之间用空格隔开,并在最后输出一个换行符。例如:
package main
import (
"log"
)
func main() {
log.Println("Start running...")
log.Println("Doing something...")
log.Println("Finished.")
}
运行上面的程序,我们会看到输出的日志信息如下:
2021/06/28 09:45:39 Start running...
2021/06/28 09:45:39 Doing something...
2021/06/28 09:45:39 Finished.
我们可以看到,每一行日志信息都包含了输出时间和打印的内容。如果我们不想要时间戳,可以使用log.SetFlags(0)来关闭时间戳输出,例如:
log.SetFlags(0)
log.Println("Start running...")
log.Println("Doing something...")
log.Println("Finished.")
此时输出的日志信息如下:
Start running...
Doing something...
Finished.
参数可变的日志输出函数
除了log.Println函数,log包中还提供了三个参数可变的日志输出函数:log.Printf、log.Print和log.Println。其中log.Printf函数的使用方式与fmt.Printf函数类似,用法如下:
log.Printf("Some data: %v", someData)
在调用log.Printf函数时,第一个参数是带有格式化占位符的字符串,后面的参数依次代表占位符对应的值。例如:
a := 3
b := 4
log.Printf("a=%d, b=%d, a+b=%d", a, b, a+b)
输出结果如下:
2021/06/28 09:51:16 a=3, b=4, a+b=7
我们还可以使用log.Print和log.Println函数,它们不接收格式化字符串,而是直接将传入的参数打印到控制台。例如:
log.Print("Some data: ", someData)
当我们需要输出的参数较多时,使用log.Print和log.Println函数可以省略大量的格式化字符串和占位符,提高代码的可读性和编写效率。
输出到文件
除了输出到控制台,log包也支持将日志信息输出到文件中,以便我们在程序崩溃或日志文件分析时查看日志信息。log包提供的写入文件的方式有两种:分别是log.SetOutput和log.New。其中log.SetOutput函数用于将日志输出到指定的io.Writer中,例如:
logfile, _ := os.Create("app.log")
log.SetOutput(logfile)
log.Println("Start running...")
log.Println("Doing something...")
log.Println("Finished.")
通过调用os.Create函数创建了一个名为app.log的文件,并将日志输出到该文件中。此时输出的日志信息将不再显示在控制台上,而是保存到app.log文件中。
另一种写入文件的方式是使用log.New函数创建一个新的log.Logger实例,并将日志输出到指定的io.Writer中,例如:
logfile, _ := os.Create("app.log")
logger := log.New(logfile, "", log.LstdFlags)
logger.Println("Start running...")
logger.Println("Doing something...")
logger.Println("Finished.")
通过调用log.New函数,我们创建了一个新的log.Logger实例,并将日志输出到名为app.log的文件中。第二个参数""表示每行输出的日志信息之间不需要添加额外的前缀,而log.LstdFlags则表示输出时间的格式。
输出不同级别的日志信息
在实际应用场景中,我们通常会根据日志信息的重要程度来输出不同级别的日志信息。log包提供了5种不同级别的日志输出函数,分别是:Fatal、Panic、Error、Warning和Info。其中Fatal和Panic函数用于在输出日志信息后结束程序的运行,示例如下:
// Fatal函数
log.Fatal("Fatal error")
// Panic函数
log.Panic("Panic occurred")
输出以上两种函数的日志信息后,程序会分别以错误码1和panic错误的方式结束运行。而Error、Warning和Info函数用于输出不同级别的日志信息,示例如下:
// Error函数
log.Error("Error occurred")
// Warning函数
log.Warning("Warning message")
// Info函数
log.Info("Some useful information")
使用以上函数可以准确地输出不同级别的日志信息,我们可以通过配置来决定哪些级别的日志信息需要输出,并将不同级别的日志信息分别输出到不同的地方。例如,我们可以将Error级别的日志信息输出到控制台,而将Warning和Info级别的日志信息输出到文件中,示例代码如下:
func main() {
log.SetOutput(os.Stdout) // 将Error及以上级别的日志信息输出至控制台
log.SetOutput(ioutil.Discard) // 关闭Warning及以下级别的日志信息输出
logfile, _ := os.Create("app.log")
logger := log.New(logfile, "", log.LstdFlags)
logger.Println("Some useful information") // Info级别日志信息输出至文件中
logger.Warning("Warning message") // Warning级别日志信息输出至文件中
logger.Error("Error occurred") // Error级别日志信息同时输出至文件和控制台
}
在上面的代码中,我们通过调用log.SetOutput函数将Error及以上级别的日志信息输出到控制台中;并使用ioutil.Discard关闭Warning及以下级别的日志信息输出。同时,我们使用log.New函数创建了一个新的log.Logger实例,并将Info和Warning级别的日志信息输出到名为app.log的文件中。
总结
使用log包提供的日志输出函数,我们可以方便地输出不同级别的日志信息,并将日志信息输出到控制台和文件中。在实际应用中,我们可以根据需要将不同级别的日志信息输出到指定的地方,以便程序运行监控和问题排查。同时,我们可以结合其他工具和技术,如ELK和Prometheus等,来实时监控和分析程序的运行情况和日志信息,以便及时发现并解决问题。