Одна из фич, которая вышла в Go 1.26 b и мне зашла -
slog.NewMultiHandler. Логи можно отправлять сразу в несколько каналов, да еще и по условиям.
package main
import (
"log/slog"
"os"
)
func main() {
// Handler для консоли - только INFO и выше
consoleHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
// Handler для файла - DEBUG и выше
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
defer file.Close()
fileHandler := slog.NewJSONHandler(file, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
// Объединяем оба Handler'а
multi := slog.NewMultiHandler(consoleHandler, fileHandler)
logger := slog.New(multi)
// DEBUG попадёт только в файл
logger.Debug("starting application", "config", "/etc/app.conf")
// INFO попадёт и в консоль, и в файл
logger.Info("server started", "port", 8080)
// ERROR попадёт в оба места
logger.Error("connection failed", "host", "db.example.com")
}