Log
日志系统不仅是服务器运维和程序开发的基础工具,还为系统的稳定性、性能优化和安全性提供了重要保障,在服务器操作、警告、调试、错误等方面发挥了重要作用。
log
Go语言内置了log包,可直接使用。
import "log"
格式
日志的一般格式为[prefix] DateTime ShortFilePath info
prefix:一般为INFO、WARN、ERROR、DEBUG等日志级别类型。DateTime:即c产生日志的时间。ShortFilePath:即所产生日志得文件路径。info:即日志具体信息。
[INFO] 2024/08/24 01:02:03 main.go(20) loginfo
Prefix
使用log.SetPrefix方法可设置日志前缀:
log.SetPrefix("[INFO]")
打印日志
log包提供了Print、Fatal、Panic等方法集合可进行日志打印:
log.Print("This is log 1\r\n")
log.Printf("This is log %d\r\n", 2)
log.Println("This is log 3")
log.Fatalf("This is fatal log %d\r\n", 4)
log.Panicf("This is a panic error: %s", "File does not open !!!")
/**
[INFO]2024/08/24 16:42:42 This is log 1
[INFO]2024/08/24 16:42:42 This is log 2
[INFO]2024/08/24 16:42:42 This is log 3
[INFO]2024/08/24 16:42:42 This is fatal log 4
exit status 1
*/
Fatal
Fatal相关方法有log.Fatal、log.Fatalf、log.Fatalln。
调用Fatal后会退出程序的运行,之前的同步代码会执行,之后的同步代码被阻塞,defer不执行。
package main
import (
"log"
)
func main() {
log.Println("1")
defer func() {
log.Println("2")
}()
log.Fatalln("3")
defer func() {
log.Println("4")
}()
log.Println("5")
}
/*
2024/08/24 16:53:29 1
2024/08/24 16:53:29 3
exit status 1
*/
Fatal适用于如网络、文件、连接等相关的问题。此类问题往往是不能被容忍的,因为会导致依赖于此的程序极大可能性失败,也可能导致整个服务都无法正常运行。
Panic
Panic相关方法有log.Panic、log.Panicf、log.Panicln。
调用Panic后,之前的同步代码和defer会执行,之后的同步的代码和defer被阻断。
package main
import (
"log"
)
func main() {
log.Println("1")
defer func() {
log.Println("2")
}()
log.Panicln("3")
defer func() {
log.Println("4")
}()
log.Println("5")
}
/*
2024/08/24 16:57:35 1
2024/08/24 16:57:35 3
2024/08/24 16:57:35 2
panic: 3
*/
Panic适用于代码执行过程中的程序错误,如数组越界、断言错误等,会提供栈的详细信息。
New
log.New方法会返回一个logger:
logger := log.New(os.Stderr, "[ERROR]", log.Ldate|log.Ltime|log.Lshortfile)
logger.Panicln("This is a error")
封装
package logger
import (
"io"
"log"
"os"
)
const flag = log.Ldate | log.Ltime | log.Lshortfile
var (
logFile io.Writer
logFilePath = "./logs/global.log"
)
const (
infoPrefix = "[INFO]"
warnPrefix = "[WARN]"
errorPrefix = "[ERROR]"
debugPrefix = "[DEBUG]"
)
var (
infoLog *log.Logger
warnLog *log.Logger
errorLog *log.Logger
debugLog *log.Logger
)
func New() error {
var err error
logFile, err = os.OpenFile(logFilePath, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
return err
}
infoLog = log.New(logFile, infoPrefix, flag)
warnLog = log.New(logFile, warnPrefix, flag)
errorLog = log.New(logFile, errorPrefix, flag)
debugLog = log.New(logFile, debugPrefix, flag)
return nil
}
func Info(format string, vrs ...any) {
infoLog.Printf(format, vrs...)
}
func Warn(format string, vrs ...any) {
warnLog.Printf(format, vrs...)
}
func Error(format string, vrs ...any) {
errorLog.Printf(format, vrs...)
}
func Debug(format string, vrs ...any) {
debugLog.Printf(format, vrs...)
}