文章目录
日志记录
log库:https://go-zh.org/pkg/log/
syslog:https://go-zh.org/pkg/log/syslog/
- 基本的日志功能 :支持日志消息的输出,包括通过
log.Print
、log.Printf
、log.Println
等函数记录普通日志,以及通过log.Fatal
、log.Fatalf
、log.Fatalln
、log.Panic
、log.Panicf
、log.Panicln
等函数在记录日志后执行特定操作(如程序终止或panic)。 - 日志输出位置 :默认情况下,
log
包的日志输出位置是标准错误输出(stderr)。但可以通过log.SetOutput
函数将日志输出重定向到其他位置,如文件或自定义的日志处理器。 - 日志格式和前缀 :支持自定义日志消息的前缀和时间格式。通过
log.SetPrefix
函数可以设置日志消息的前缀,通过log.SetFlags
函数可以设置时间格式,如日期、时间、微秒级时间、文件名和行号等。 - 并发安全 :
log
包本身是并发安全的,可以在多个goroutine中安全地使用。
go
func main() {
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 输出到文件
log.SetOutput(file)
log.Println("This is a log message written to a file")
// 自定义格式
log.SetPrefix("INFO: ")
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Println("This is a log message with custom prefix and flags")
}
go
// 不支持同时输出到文件且输出到控制台
// 所以可以这样做:
package main
import (
"log"
"os"
)
// 测试log同时写入控制台和文件
func multiLogger(fileLogger, stdLogger *log.Logger, msg string) {
fileLogger.Println(msg)
stdLogger.Println(msg)
}
func main() {
logFile, _ := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
defer logFile.Close()
// 创建一个新的logger实例,用于向文件写入日志
fileLogger := log.New(logFile, "FILE: ", log.Ldate|log.Ltime|log.Lshortfile)
// 使用标准库logger作为控制台输出
consoleLogger := log.New(os.Stdout, "CONSOLE: ", log.Ldate|log.Ltime|log.Lshortfile)
// 输出
var msg string = "测试log同时写入控制台和文件"
multiLogger(fileLogger, consoleLogger, msg)
}