在Debian中利用Golang日志进行故障排查,可以采用Go 1.21引入的新一代日志库slog
。这个库提供了比传统log
包更灵活和现代化的日志功能,非常适合用于故障排查。以下是使用slog
进行日志记录和故障排查的步骤:
使用slog
库创建一个日志记录器,可以通过默认记录器或自定义记录器来记录日志。
package main
import (
"log/slog"
"os"
)
func main() {
// 使用默认日志记录器,此模式日志输出格式为text文本型,且不会输出debug级别日志
logger := slog.Default()
// 输出结构化日志
logger.Debug("this is a debug message")
logger.Info("starting qkp platform log", "version", "v3.2.2")
logger.Warn("low disk space", "remaining", "500mb")
logger.Error("failed to connect to etcd cluster", "error", "connection timeout")
}
slog
支持多种日志级别,包括debug
、info
、warn
和error
。可以通过配置handleroptions
来自定义日志处理器的行为,例如启用源代码位置跟踪、动态调整日志级别等。
package main
import (
"log/slog"
"os"
)
func main() {
handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
logger := slog.New(handler)
logger.Debug("this is a debug message")
logger.Info("starting qkp platform log", "version", "v3.2.2")
logger.Warn("low disk space", "remaining", "500mb")
logger.Error("failed to connect to etcd cluster", "error", "connection timeout")
}
slog.Handler
是日志输出的核心接口,允许自定义日志处理行为。可以创建自定义处理器来满足特定的日志需求。
package main
import (
"log/slog"
"os"
)
func main() {
handler := slog.NewHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
Format: slog.FormatJSON,
})
logger := slog.New(handler)
logger.Debug("this is a debug message")
logger.Info("starting qkp platform log", "version", "v3.2.2")
logger.Warn("low disk space", "remaining", "500mb")
logger.Error("failed to connect to etcd cluster", "error", "connection timeout")
}
如果需要将日志写入文件,可以使用slog
的Handler
接口来实现。可以创建一个自定义的Handler
,将日志写入到指定的文件中。
package main
import (
"log/slog"
"os"
"time"
)
type FileLogger struct {
lastHour int64
file *os.File
level slog.Level
mu sync.Mutex
iLogger *slog.Logger
path string
}
func (l *FileLogger) CanInfo() bool {
return l.level <= slog.LevelInfo
}
func (l *FileLogger) Info(v ...interface{}) {
if l.CanInfo() {
l.ensureFile()
v = append([]interface{}{"Info: "}, v...)
l.iLogger.Output(2, fmt.Sprintln(v...))
}
}
func (l *FileLogger) ensureFile() error {
currentTime := time.Now()
if l.lastHour != currentTime.Hour() {
l.lastHour = currentTime.Hour()
filePath := fmt.Sprintf("%s/%d", l.path, l.lastHour)
file, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
return err
}
l.file = file
}
return nil
}
func main() {
flogger := &FileLogger{
path: "./logs",
level: slog.LevelInfo,
iLogger: slog.New(os.Stdout, "", slog.LstdFlags),
}
slog.SetHandler(flogger)
slog.Debug("this is a debug message")
slog.Info("starting qkp platform log", "version", "v3.2.2")
slog.Warn("low disk space", "remaining", "500mb")
slog.Error("failed to connect to etcd cluster", "error", "connection timeout")
}
通过以上步骤,你可以在Debian中使用slog
库进行日志记录和故障排查。slog
库提供了灵活、结构化的日志记录功能,可以帮助你更有效地定位和解决问题。