Skip to content

Commit 29ce2a5

Browse files
fclairambclaude
andcommitted
chore: migrate from go-kit/log to log/slog
Replace all logging infrastructure from github.com/go-kit/log and github.com/fclairamb/go-log with Go's standard library log/slog. Changes: - Replace all log.Logger interfaces with *slog.Logger throughout codebase - Update main.go to use slog.Default() and slog.New() directly - Update server, config, and all fs packages to use *slog.Logger - Remove go-kit/log dependency completely - Remove direct usage of go-log abstraction layer - Set logger to nil for afero-snd and afero-gdrive integrations The go-log package remains as an indirect dependency (required by afero-snd) but is no longer imported or used directly in the codebase. All tests pass and build succeeds. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
1 parent ffc04da commit 29ce2a5

File tree

9 files changed

+47
-305
lines changed

9 files changed

+47
-305
lines changed

config/config.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@ import (
66
"encoding/json"
77
"errors"
88
"fmt"
9+
"log/slog"
910
"os"
1011

11-
log "github.com/fclairamb/go-log"
12-
1312
"github.com/fclairamb/ftpserver/config/confpar"
1413
"github.com/fclairamb/ftpserver/fs"
1514

@@ -24,12 +23,12 @@ var ErrUnknownUser = errors.New("unknown user")
2423
// Config provides the general server config
2524
type Config struct {
2625
fileName string
27-
logger log.Logger
26+
logger *slog.Logger
2827
Content *confpar.Content
2928
}
3029

3130
// NewConfig creates a new config instance
32-
func NewConfig(fileName string, logger log.Logger) (*Config, error) {
31+
func NewConfig(fileName string, logger *slog.Logger) (*Config, error) {
3332
if fileName == "" {
3433
fileName = "ftpserver.json"
3534
}
@@ -48,7 +47,7 @@ func NewConfig(fileName string, logger log.Logger) (*Config, error) {
4847

4948
// FromContent creates a new config instance from a pre-created Content and logger. The
5049
// fileName should indicate origin of the given Content, but the file will never be opened.
51-
func FromContent(content *confpar.Content, fileName string, logger log.Logger) (*Config, error) {
50+
func FromContent(content *confpar.Content, fileName string, logger *slog.Logger) (*Config, error) {
5251
c := &Config{
5352
fileName: fileName,
5453
logger: logger,

fs/fs.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package fs
33

44
import (
55
"fmt"
6+
"log/slog"
67

78
snd "github.com/fclairamb/afero-snd"
8-
log "github.com/fclairamb/go-log"
99
"github.com/spf13/afero"
1010

1111
"github.com/fclairamb/ftpserver/config/confpar"
@@ -30,7 +30,7 @@ func (err UnsupportedFsError) Error() string {
3030
}
3131

3232
// LoadFs loads a file system from an access description
33-
func LoadFs(access *confpar.Access, logger log.Logger) (afero.Fs, error) {
33+
func LoadFs(access *confpar.Access, logger *slog.Logger) (afero.Fs, error) {
3434
var fs afero.Fs
3535
var err error
3636

@@ -72,7 +72,7 @@ func LoadFs(access *confpar.Access, logger log.Logger) (afero.Fs, error) {
7272
fs, err = snd.NewFs(&snd.Config{
7373
Destination: fs,
7474
Temporary: temp,
75-
Logger: logger.With("component", "snd"),
75+
Logger: nil,
7676
})
7777
}
7878

fs/fslog/fslog.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,28 @@
22
package fslog
33

44
import (
5+
"log/slog"
56
"os"
67
"time"
78

89
"github.com/spf13/afero"
9-
10-
log "github.com/fclairamb/go-log"
1110
)
1211

1312
// File is a wrapper to log interactions around file accesses
1413
type File struct {
15-
src afero.File // Source file
16-
logger log.Logger // Associated logger
17-
lengthRead int // Length read
18-
lengthWritten int // Length written
14+
src afero.File // Source file
15+
logger *slog.Logger // Associated logger
16+
lengthRead int // Length read
17+
lengthWritten int // Length written
1918
}
2019

2120
// Fs is a wrapper to log interactions around file system accesses
2221
type Fs struct {
23-
src afero.Fs // Source file system
24-
logger log.Logger // Associated logger
22+
src afero.Fs // Source file system
23+
logger *slog.Logger // Associated logger
2524
}
2625

27-
func logErr(logger log.Logger, err error) log.Logger {
26+
func logErr(logger *slog.Logger, err error) *slog.Logger {
2827
if err != nil {
2928
return logger.With("err", err, "failed", true)
3029
}
@@ -234,7 +233,7 @@ func (f *File) WriteString(str string) (int, error) {
234233
}
235234

236235
// LoadFS creates an instance with logging
237-
func LoadFS(src afero.Fs, logger log.Logger) (afero.Fs, error) {
236+
func LoadFS(src afero.Fs, logger *slog.Logger) (afero.Fs, error) {
238237
return &Fs{
239238
src: src,
240239
logger: logger,

fs/gdrive/gdrive.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import (
55
"context"
66
"errors"
77
"fmt"
8+
"log/slog"
89
"os"
910

1011
drv "github.com/fclairamb/afero-gdrive"
1112
drvoa "github.com/fclairamb/afero-gdrive/oauthhelper"
12-
log "github.com/fclairamb/go-log"
1313
"github.com/spf13/afero"
1414
"golang.org/x/oauth2"
1515

@@ -22,7 +22,7 @@ import (
2222
var ErrMissingGoogleClientCredentials = errors.New("missing the google client credentials")
2323

2424
// LoadFs loads a file system from an access description
25-
func LoadFs(access *confpar.Access, logger log.Logger) (afero.Fs, error) {
25+
func LoadFs(access *confpar.Access, logger *slog.Logger) (afero.Fs, error) {
2626
googleClientID := access.Params["google_client_id"]
2727
googleClientSecret := access.Params["google_client_secret"]
2828
tokenFile := access.Params["token_file"]
@@ -91,8 +91,6 @@ func LoadFs(access *confpar.Access, logger log.Logger) (afero.Fs, error) {
9191
return nil, err
9292
}
9393

94-
gdriveFs.Logger = logger
95-
9694
// Allowing to set the basePath in the driver
9795
if basePath != "" {
9896
basePath = utils.ReplaceEnvVars(basePath)

fs/telegram/telegram.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"io"
8+
"log/slog"
89
"path/filepath"
910
"strconv"
1011
"strings"
@@ -13,7 +14,6 @@ import (
1314
"sync/atomic"
1415
"time"
1516

16-
log "github.com/fclairamb/go-log"
1717
tele "gopkg.in/telebot.v3"
1818

1919
"github.com/spf13/afero"
@@ -38,7 +38,7 @@ type Fs struct {
3838
// ChatID is the telegram chat ID to send files to
3939
ChatID int64
4040
// Logger is the logger, obviously
41-
Logger log.Logger
41+
Logger *slog.Logger
4242

4343
// fakeFs is a lightweight fake filesystem intended for store temporary info about files
4444
// since some ftp clients expect to perform mkdir() + stat() on files and directories before upload
@@ -70,7 +70,7 @@ var textExtensions = []string{".txt", ".md"}
7070
var audioExtensions = []string{".mp3", ".ogg", ".flac", ".wav", ".m4a", ".opus"}
7171

7272
// LoadFs loads a file system from an access description
73-
func LoadFs(access *confpar.Access, logger log.Logger) (afero.Fs, error) {
73+
func LoadFs(access *confpar.Access, logger *slog.Logger) (afero.Fs, error) {
7474

7575
token := access.Params["Token"]
7676
if token == "" {

go.mod

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/fclairamb/ftpserver
22

3-
go 1.24.0
3+
go 1.25.0
44

55
toolchain go1.25.5
66

@@ -13,7 +13,6 @@ require (
1313
github.com/fclairamb/afero-s3 v0.3.1
1414
github.com/fclairamb/afero-snd v0.1.0
1515
github.com/fclairamb/ftpserverlib v0.28.0
16-
github.com/fclairamb/go-log v0.6.0
1716
github.com/go-crypt/crypt v0.4.7
1817
github.com/go-mail/mail v2.3.1+incompatible
1918
github.com/pkg/sftp v1.13.10
@@ -59,7 +58,6 @@ require (
5958
github.com/tidwall/gjson v1.14.4 // indirect
6059
github.com/tidwall/match v1.1.1 // indirect
6160
github.com/tidwall/pretty v1.2.1 // indirect
62-
github.com/zeebo/errs v1.4.0 // indirect
6361
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
6462
go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect
6563
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect
@@ -78,8 +76,7 @@ require (
7876

7977
require (
8078
github.com/dropbox/dropbox-sdk-go-unofficial v5.6.0+incompatible // indirect
81-
github.com/go-kit/log v0.2.1
82-
github.com/go-logfmt/logfmt v0.6.0 // indirect
79+
github.com/fclairamb/go-log v0.6.0 // indirect
8380
github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect
8481
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
8582
github.com/jmespath/go-jmespath v0.4.0 // indirect

0 commit comments

Comments
 (0)