touka/examples/logger_slog/main.go
wjqserver c8b14ef43a feat: 引入 Logger 接口抽象,支持自定义日志实现
- 新增 Logger 接口定义,支持 zap/slog 等自定义实现
- 新增 CloserLogger 接口用于支持关闭操作
- Engine 新增 SetLogger/GetLogger 方法使用接口
- 新增 compat.go 兼容层,保留 reco 兼容方法
- 新增 slog 适配器示例
- 删除 zap 示例
- Context.GetLogger() 返回接口类型
2026-04-21 19:43:56 +08:00

71 lines
1.6 KiB
Go

package main
import (
"fmt"
"log/slog"
"net/http"
"os"
"github.com/infinite-iroha/touka"
)
// SlogAdapter 将 slog.Logger 适配到 touka.Logger 接口
type SlogAdapter struct {
logger *slog.Logger
}
func NewSlogAdapter(handler slog.Handler) *SlogAdapter {
return &SlogAdapter{
logger: slog.New(handler),
}
}
func (s *SlogAdapter) Debugf(format string, args ...any) {
s.logger.Debug(fmt.Sprintf(format, args...))
}
func (s *SlogAdapter) Infof(format string, args ...any) {
s.logger.Info(fmt.Sprintf(format, args...))
}
func (s *SlogAdapter) Warnf(format string, args ...any) {
s.logger.Warn(fmt.Sprintf(format, args...))
}
func (s *SlogAdapter) Errorf(format string, args ...any) {
s.logger.Error(fmt.Sprintf(format, args...))
}
func (s *SlogAdapter) Fatalf(format string, args ...any) {
s.logger.Error(fmt.Sprintf(format, args...))
os.Exit(1)
}
func (s *SlogAdapter) Panicf(format string, args ...any) {
s.logger.Error(fmt.Sprintf(format, args...))
panic(fmt.Sprintf(format, args...))
}
func main() {
engine := touka.New()
// 使用 slog 替换默认的 reco.Logger
handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
slogAdapter := NewSlogAdapter(handler)
engine.SetLogger(slogAdapter)
engine.GET("/", func(c *touka.Context) {
c.Infof("request received: %s", c.Request.URL.Path)
c.JSON(http.StatusOK, map[string]string{"message": "hello"})
})
// 也可以获取 Logger 接口
logger := engine.GetLogger()
logger.Debugf("engine started")
// 也可以直接使用 slog
slog.Info("Server running", "addr", ":8080")
// engine.Run(":8080")
}