mirror of
				https://gitea.com/gitea/gitea-mcp.git
				synced 2025-10-30 01:41: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) | 	RegisterTool(mcpServer) | ||||||
| 	switch flag.Mode { | 	switch flag.Mode { | ||||||
| 	case "stdio": | 	case "stdio": | ||||||
| 		if err := server.ServeStdio(mcpServer); err != nil { | 		if err := server.ServeStdio( | ||||||
|  | 			mcpServer, | ||||||
|  | 		); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 	case "sse": | 	case "sse": | ||||||
| 		sseServer := server.NewSSEServer(mcpServer) | 		sseServer := server.NewSSEServer( | ||||||
|  | 			mcpServer, | ||||||
|  | 		) | ||||||
| 		log.Infof("Gitea MCP SSE server listening on :%d", flag.Port) | 		log.Infof("Gitea MCP SSE server listening on :%d", flag.Port) | ||||||
| 		if err := sseServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil { | 		if err := sseServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 	case "http": | 	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) | 		log.Infof("Gitea MCP HTTP server listening on :%d", flag.Port) | ||||||
| 		if err := httpServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil { | 		if err := httpServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil { | ||||||
| 			return err | 			return err | ||||||
|   | |||||||
							
								
								
									
										112
									
								
								pkg/log/log.go
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								pkg/log/log.go
									
									
									
									
									
								
							| @@ -19,53 +19,55 @@ var ( | |||||||
|  |  | ||||||
| func Default() *zap.Logger { | func Default() *zap.Logger { | ||||||
| 	defaultLoggerOnce.Do(func() { | 	defaultLoggerOnce.Do(func() { | ||||||
| 		if defaultLogger == nil { | 		if defaultLogger != nil { | ||||||
| 			ec := zap.NewProductionEncoderConfig() | 			return | ||||||
| 			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...) |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		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 | 	return defaultLogger | ||||||
| @@ -77,8 +79,22 @@ func SetDefault(logger *zap.Logger) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func Logger() *zap.Logger { | func New() *Logger { | ||||||
| 	return defaultLogger | 	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) { | func Debug(msg string, fields ...zap.Field) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user