From 5dbfe21127a0f3d025a29d1be4e7ddfc33b55427 Mon Sep 17 00:00:00 2001 From: appleboy Date: Sun, 22 Jun 2025 10:27:09 +0000 Subject: [PATCH] refactor: refactor logging and server setup for clarity and structure (#64) - Refactor server initialization calls in Run to use multiline construction style and explicitly pass options in HTTP mode - Fix logic in Default to prevent redundant logger initialization - Remove unused Logger function and introduce a Logger struct with Infof and Errorf methods for structured logging - Add a New function for creating instances of the Logger struct Signed-off-by: appleboy Reviewed-on: https://gitea.com/gitea/gitea-mcp/pulls/64 Co-authored-by: appleboy Co-committed-by: appleboy --- operation/operation.go | 13 +++-- pkg/log/log.go | 112 +++++++++++++++++++++++------------------ 2 files changed, 74 insertions(+), 51 deletions(-) diff --git a/operation/operation.go b/operation/operation.go index c571202..ff08c77 100644 --- a/operation/operation.go +++ b/operation/operation.go @@ -44,17 +44,24 @@ func Run() error { RegisterTool(mcpServer) switch flag.Mode { case "stdio": - if err := server.ServeStdio(mcpServer); err != nil { + if err := server.ServeStdio( + mcpServer, + ); err != nil { return err } case "sse": - sseServer := server.NewSSEServer(mcpServer) + sseServer := server.NewSSEServer( + mcpServer, + ) log.Infof("Gitea MCP SSE server listening on :%d", flag.Port) if err := sseServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil { return err } case "http": - httpServer := server.NewStreamableHTTPServer(mcpServer) + httpServer := server.NewStreamableHTTPServer( + mcpServer, + server.WithLogger(log.New()), + ) log.Infof("Gitea MCP HTTP server listening on :%d", flag.Port) if err := httpServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil { return err diff --git a/pkg/log/log.go b/pkg/log/log.go index 1f2abe1..e040cf5 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -19,53 +19,55 @@ var ( func Default() *zap.Logger { defaultLoggerOnce.Do(func() { - if defaultLogger == nil { - ec := zap.NewProductionEncoderConfig() - ec.EncodeTime = zapcore.TimeEncoderOfLayout(time.DateTime) - ec.EncodeLevel = zapcore.CapitalLevelEncoder - - var ws zapcore.WriteSyncer - var wss []zapcore.WriteSyncer - - home, _ := os.UserHomeDir() - if home == "" { - home = os.TempDir() - } - - logDir := fmt.Sprintf("%s/.gitea-mcp", home) - if err := os.MkdirAll(logDir, 0o700); err != nil { - // Fallback to temp directory if creation fails - logDir = os.TempDir() - } - - wss = append(wss, zapcore.AddSync(&lumberjack.Logger{ - Filename: fmt.Sprintf("%s/gitea-mcp.log", logDir), - MaxSize: 100, - MaxBackups: 10, - MaxAge: 30, - })) - - if flag.Mode == "http" || flag.Mode == "sse" { - wss = append(wss, zapcore.AddSync(os.Stdout)) - } - - ws = zapcore.NewMultiWriteSyncer(wss...) - - enc := zapcore.NewConsoleEncoder(ec) - var level zapcore.Level - if flag.Debug { - level = zapcore.DebugLevel - } else { - level = zapcore.InfoLevel - } - core := zapcore.NewCore(enc, ws, level) - options := []zap.Option{ - zap.AddStacktrace(zapcore.DPanicLevel), - zap.AddCaller(), - zap.AddCallerSkip(1), - } - defaultLogger = zap.New(core, options...) + if defaultLogger != nil { + return } + + ec := zap.NewProductionEncoderConfig() + ec.EncodeTime = zapcore.TimeEncoderOfLayout(time.DateTime) + ec.EncodeLevel = zapcore.CapitalLevelEncoder + + var ws zapcore.WriteSyncer + var wss []zapcore.WriteSyncer + + home, _ := os.UserHomeDir() + if home == "" { + home = os.TempDir() + } + + logDir := fmt.Sprintf("%s/.gitea-mcp", home) + if err := os.MkdirAll(logDir, 0o700); err != nil { + // Fallback to temp directory if creation fails + logDir = os.TempDir() + } + + wss = append(wss, zapcore.AddSync(&lumberjack.Logger{ + Filename: fmt.Sprintf("%s/gitea-mcp.log", logDir), + MaxSize: 100, + MaxBackups: 10, + MaxAge: 30, + })) + + if flag.Mode == "http" || flag.Mode == "sse" { + wss = append(wss, zapcore.AddSync(os.Stdout)) + } + + ws = zapcore.NewMultiWriteSyncer(wss...) + + enc := zapcore.NewConsoleEncoder(ec) + var level zapcore.Level + if flag.Debug { + level = zapcore.DebugLevel + } else { + level = zapcore.InfoLevel + } + core := zapcore.NewCore(enc, ws, level) + options := []zap.Option{ + zap.AddStacktrace(zapcore.DPanicLevel), + zap.AddCaller(), + zap.AddCallerSkip(1), + } + defaultLogger = zap.New(core, options...) }) return defaultLogger @@ -77,8 +79,22 @@ func SetDefault(logger *zap.Logger) { } } -func Logger() *zap.Logger { - return defaultLogger +func New() *Logger { + return &Logger{ + defaultLogger: Default(), + } +} + +type Logger struct { + defaultLogger *zap.Logger +} + +func (l *Logger) Infof(msg string, args ...any) { + l.defaultLogger.Sugar().Infof(msg, args...) +} + +func (l *Logger) Errorf(msg string, args ...any) { + l.defaultLogger.Sugar().Errorf(msg, args...) } func Debug(msg string, fields ...zap.Field) {