Skip to main content

Log

日志系统不仅是服务器运维和程序开发的基础工具,还为系统的稳定性、性能优化和安全性提供了重要保障,在服务器操作、警告、调试、错误等方面发挥了重要作用。

log

Go语言内置了log包,可直接使用。

import "log"

格式

日志的一般格式为[prefix] DateTime ShortFilePath info

  • prefix:一般为INFOWARNERRORDEBUG等日志级别类型。
  • DateTime:即c产生日志的时间。
  • ShortFilePath:即所产生日志得文件路径。
  • info:即日志具体信息。
[INFO] 2024/08/24 01:02:03 main.go(20) loginfo

Prefix

使用log.SetPrefix方法可设置日志前缀:

log.SetPrefix("[INFO]")

打印日志

log包提供了PrintFatalPanic等方法集合可进行日志打印:

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.Fatallog.Fatalflog.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.Paniclog.Panicflog.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...)
}