Go 语言中的日志模块非常强大,可以帮助我们方便地记录程序运行时的信息和错误。在这篇博客中,我们将介绍如何使用 Go 语言的日志模块来记录程序运行时的信息和错误。
我们使用了不同的日志级别来记录不同严重程度的信息。Debug 级别的日志信息用于调试程序,Info 级别的日志信息用于记录一般运行情况,Warning 级别的日志信息用于记录可能出现问题的情况,Error 级别的日志信息用于记录错误信息,而 Fatal 级别的日志信息则会导致程序立即退出
你可以使用Go标准库中的log包来实现日志记录功能。下面是根据自己自定义格式,生成info_20230414.log 格式日志的模板文件。
loggers.go 文件内容如下:
package utils
import (
"fmt"
"log"
"os"
"sync"
"time"
)
var (
once sync.Once
f *os.File
)
// 获取当前时间戳,格式为[年-月-日 时:分:秒]
func getTimeStamp() string {
return time.Now().Format("2006-01-02 15:04:05")
}
// 记录info级别的日志,带时间戳
func Info(message string) {
// 保证只执行一次,打开日志文件并保存文件句柄到f变量
once.Do(func() {
// 生成日志文件名,格式为 "info_20230327.log"
logFileName := "./log/info_" + time.Now().Format("20060102") + ".log"
// 打开一个日志文件
var err error
f, err = os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
// 设置日志输出到文件
log.SetOutput(f)
// 设置日志前缀和格式
log.SetFlags(log.Flags() &^ (log.Ldate | log.Ltime))
})
defer f.Close()
// 在日志信息前加上时间戳,之后记录日志
res:="["+getTimeStamp()+"]"+" "+fmt.Sprintf(message)
log.Printf(res)
}
// 记录Debug级别的日志,带时间戳
func Debug(message string) {
// 保证只执行一次,打开日志文件并保存文件句柄到f变量
once.Do(func() {
// 生成日志文件名,格式为 "debug_20230327.log"
logFileName := "./log/debug_" + time.Now().Format("20060102") + ".log"
// 打开一个日志文件
var err error
f, err = os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
// 设置日志输出到文件
log.SetOutput(f)
// 设置日志前缀和格式
log.SetFlags(log.Flags() &^ (log.Ldate | log.Ltime))
})
defer f.Close()
// 在日志信息前加上时间戳,之后记录日志
res:="["+getTimeStamp()+"]"+" "+fmt.Sprintf(message)
log.Printf(res)
}
// 记录Warn级别的日志,带时间戳
func Warn(message string) {
// 保证只执行一次,打开日志文件并保存文件句柄到f变量
once.Do(func() {
// 生成日志文件名,格式为 "warn_20230327.log"
logFileName := "./log/warn_" + time.Now().Format("20060102") + ".log"
// 打开一个日志文件
var err error
f, err = os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
// 设置日志输出到文件
log.SetOutput(f)
// 设置日志前缀和格式
log.SetFlags(log.Flags() &^ (log.Ldate | log.Ltime))
})
defer f.Close() // 延迟执行 file.Close() 方法
// 在日志信息前加上时间戳,之后记录日志
res:="["+getTimeStamp()+"]"+" "+fmt.Sprintf(message)
log.Printf(res)
}
// 记录Warn级别的日志,带时间戳
func Error(message string) {
// 保证只执行一次,打开日志文件并保存文件句柄到f变量
once.Do(func() {
// 生成日志文件名,格式为 "error_20230327.log"
logFileName := "./log/error_" + time.Now().Format("20060102") + ".log"
// 打开一个日志文件
var err error
f, err = os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
// 设置日志输出到文件
log.SetOutput(f)
// 设置日志前缀和格式
log.SetFlags(log.Flags() &^ (log.Ldate | log.Ltime))
})
defer f.Close() // 延迟执行 file.Close() 方法
// 在日志信息前加上时间戳,之后记录日志
res:="["+getTimeStamp()+"]"+" "+fmt.Sprintf(message)
log.Printf(res)
}