mirror of
				https://gitea.com/gitea/gitea-mcp.git
				synced 2025-11-03 20:01:50 +00:00 
			
		
		
		
	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 <appleboy.tw@gmail.com> Reviewed-on: https://gitea.com/gitea/gitea-mcp/pulls/64 Co-authored-by: appleboy <appleboy.tw@gmail.com> Co-committed-by: appleboy <appleboy.tw@gmail.com>
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										112
									
								
								pkg/log/log.go
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								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) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user