在Debian中利用Golang日志进行故障排查,可以采用Go 1.21引入的新一代日志库slog
。这个库提供了比传统log
包更灵活和现代化的日志功能,非常适合用于故障排查。以下是使用slog
进行日志记录和故障排查的步骤:
1. 创建日志记录器
使用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") }
2. 日志级别控制
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") }
3. 自定义日志处理器
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") }
4. 日志文件输出
如果需要将日志写入文件,可以使用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
库提供了灵活、结构化的日志记录功能,可以帮助你更有效地定位和解决问题。