From 8232321b993f97bb0b82b414d560f4ea4bde60b6 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 26 Sep 2025 03:58:20 +0000 Subject: [PATCH 1/2] MBA-244: Replace Logrus with slog in server initialization - Replace github.com/sirupsen/logrus import with log/slog in server.go - Update logger creation to use slog.New() with slog.NewTextHandler() for file logging - Use slog.Default() when no log file path is specified - Replace logrusLogger.Writer() bridge with slog.NewLogLogger() for stdlib compatibility - Update shutdown logging to use logger.Info() instead of logrusLogger.Infof() - Update IOLogger interface in pkg/log/io.go to accept *slog.Logger instead of *logrus.Logger - Change IOLogger logging methods to use structured logging with key-value pairs - Update IOLogger tests to use slog.NewTextHandler() instead of logrus setup - Remove unused standard library log import All existing logging functionality is preserved while migrating to Go's standard slog package. Co-Authored-By: Jake Cosme --- internal/ghmcp/server.go | 17 +++++++++-------- pkg/log/io.go | 11 +++++------ pkg/log/io_test.go | 16 +++++++--------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/internal/ghmcp/server.go b/internal/ghmcp/server.go index 568af10d1..ec1c2625e 100644 --- a/internal/ghmcp/server.go +++ b/internal/ghmcp/server.go @@ -4,7 +4,7 @@ import ( "context" "fmt" "io" - "log" + "log/slog" "net/http" "net/url" "os" @@ -21,7 +21,6 @@ import ( "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" "github.com/shurcooL/githubv4" - "github.com/sirupsen/logrus" ) type MCPServerConfig struct { @@ -203,17 +202,19 @@ func RunStdioServer(cfg StdioServerConfig) error { stdioServer := server.NewStdioServer(ghServer) - logrusLogger := logrus.New() + var logger *slog.Logger if cfg.LogFilePath != "" { file, err := os.OpenFile(cfg.LogFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) if err != nil { return fmt.Errorf("failed to open log file: %w", err) } - logrusLogger.SetLevel(logrus.DebugLevel) - logrusLogger.SetOutput(file) + handler := slog.NewTextHandler(file, &slog.HandlerOptions{Level: slog.LevelDebug}) + logger = slog.New(handler) + } else { + logger = slog.Default() } - stdLogger := log.New(logrusLogger.Writer(), "stdioserver", 0) + stdLogger := slog.NewLogLogger(logger.Handler(), slog.LevelInfo) stdioServer.SetErrorLogger(stdLogger) if cfg.ExportTranslations { @@ -227,7 +228,7 @@ func RunStdioServer(cfg StdioServerConfig) error { in, out := io.Reader(os.Stdin), io.Writer(os.Stdout) if cfg.EnableCommandLogging { - loggedIO := mcplog.NewIOLogger(in, out, logrusLogger) + loggedIO := mcplog.NewIOLogger(in, out, logger) in, out = loggedIO, loggedIO } // enable GitHub errors in the context @@ -241,7 +242,7 @@ func RunStdioServer(cfg StdioServerConfig) error { // Wait for shutdown signal select { case <-ctx.Done(): - logrusLogger.Infof("shutting down server...") + logger.Info("shutting down server...") case err := <-errC: if err != nil { return fmt.Errorf("error running server: %w", err) diff --git a/pkg/log/io.go b/pkg/log/io.go index de2210278..1b043748a 100644 --- a/pkg/log/io.go +++ b/pkg/log/io.go @@ -2,8 +2,7 @@ package log import ( "io" - - log "github.com/sirupsen/logrus" + "log/slog" ) // IOLogger is a wrapper around io.Reader and io.Writer that can be used @@ -11,11 +10,11 @@ import ( type IOLogger struct { reader io.Reader writer io.Writer - logger *log.Logger + logger *slog.Logger } // NewIOLogger creates a new IOLogger instance -func NewIOLogger(r io.Reader, w io.Writer, logger *log.Logger) *IOLogger { +func NewIOLogger(r io.Reader, w io.Writer, logger *slog.Logger) *IOLogger { return &IOLogger{ reader: r, writer: w, @@ -30,7 +29,7 @@ func (l *IOLogger) Read(p []byte) (n int, err error) { } n, err = l.reader.Read(p) if n > 0 { - l.logger.Infof("[stdin]: received %d bytes: %s", n, string(p[:n])) + l.logger.Info("[stdin]", "received_bytes", n, "data", string(p[:n])) } return n, err } @@ -40,6 +39,6 @@ func (l *IOLogger) Write(p []byte) (n int, err error) { if l.writer == nil { return 0, io.ErrClosedPipe } - l.logger.Infof("[stdout]: sending %d bytes: %s", len(p), string(p)) + l.logger.Info("[stdout]", "sending_bytes", len(p), "data", string(p)) return l.writer.Write(p) } diff --git a/pkg/log/io_test.go b/pkg/log/io_test.go index 0d0cd8959..a80f89732 100644 --- a/pkg/log/io_test.go +++ b/pkg/log/io_test.go @@ -2,10 +2,10 @@ package log import ( "bytes" + "log/slog" "strings" "testing" - log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) @@ -17,11 +17,10 @@ func TestLoggedReadWriter(t *testing.T) { // Create logger with buffer to capture output var logBuffer bytes.Buffer - logger := log.New() - logger.SetOutput(&logBuffer) - logger.SetFormatter(&log.TextFormatter{ - DisableTimestamp: true, + handler := slog.NewTextHandler(&logBuffer, &slog.HandlerOptions{ + Level: slog.LevelDebug, }) + logger := slog.New(handler) lrw := NewIOLogger(reader, nil, logger) @@ -44,11 +43,10 @@ func TestLoggedReadWriter(t *testing.T) { // Create logger with buffer to capture output var logBuffer bytes.Buffer - logger := log.New() - logger.SetOutput(&logBuffer) - logger.SetFormatter(&log.TextFormatter{ - DisableTimestamp: true, + handler := slog.NewTextHandler(&logBuffer, &slog.HandlerOptions{ + Level: slog.LevelDebug, }) + logger := slog.New(handler) lrw := NewIOLogger(nil, &writeBuffer, logger) From 866eec06ad934495777cb436d1ecf6734e41db53 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 26 Sep 2025 04:00:31 +0000 Subject: [PATCH 2/2] Remove unused Logrus dependency from go.mod After migrating to slog, the github.com/sirupsen/logrus dependency is no longer needed and has been removed by go mod tidy. Co-Authored-By: Jake Cosme --- go.mod | 1 - go.sum | 4 ---- 2 files changed, 5 deletions(-) diff --git a/go.mod b/go.mod index 4cc7682fd..1af8e2c87 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( github.com/josephburnett/jd v1.9.2 github.com/mark3labs/mcp-go v0.32.0 github.com/migueleliasweb/go-github-mock v1.3.0 - github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 github.com/stretchr/testify v1.10.0 diff --git a/go.sum b/go.sum index 5e601d909..58d3caa75 100644 --- a/go.sum +++ b/go.sum @@ -66,8 +66,6 @@ github.com/shurcooL/githubv4 v0.0.0-20240727222349-48295856cce7 h1:cYCy18SHPKRkv github.com/shurcooL/githubv4 v0.0.0-20240727222349-48295856cce7/go.mod h1:zqMwyHmnN/eDOZOdiTohqIUKUrTFX62PNlu7IJdu0q8= github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466 h1:17JxqqJY66GmZVHkmAsGEkcIu0oCe3AM420QDgGwZx0= github.com/shurcooL/graphql v0.0.0-20230722043721-ed46e5a46466/go.mod h1:9dIRpgIY7hVhoqfe0/FcYp0bpInZaT7dc3BYOprrIUE= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= @@ -83,7 +81,6 @@ github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqj github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -98,7 +95,6 @@ golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=