Skip to content

Commit a3e607e

Browse files
committed
migrate logging to slog
1 parent 6af6333 commit a3e607e

7 files changed

Lines changed: 107 additions & 62 deletions

File tree

flatpak.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package main
22

33
import (
4+
"context"
5+
"os"
46
"os/exec"
57
"slices"
68
"strings"
79
"sync"
810

9-
"github.com/rs/zerolog/log"
1011
"gopkg.in/ini.v1"
1112
)
1213

13-
func getApps() ([]string, error) {
14+
func getApps(ctx context.Context) ([]string, error) {
1415
cmd := exec.Command("flatpak", "list", "--app")
1516
cmd.Dir = "/var/lib/flatpak"
1617

17-
log.Debug().Str("command", cmd.Path+strings.Join(cmd.Args, " ")).Msg("Running command")
18+
log.DebugContext(ctx, "Running command", "command", cmd.Path+" "+strings.Join(cmd.Args, " "))
1819
out, err := cmd.Output()
1920
if err != nil {
2021
return nil, err
@@ -29,29 +30,29 @@ func getApps() ([]string, error) {
2930
}
3031
data := strings.Split(app, "\t")
3132
if len(data) < 2 {
32-
log.Warn().Msgf("Skipping line: %s", app)
33+
log.WarnContext(ctx, "Skipping line", "line", app)
3334
continue
3435
}
3536
appID := strings.TrimSpace(data[1])
3637
if appID == "" {
3738
continue
3839
}
39-
log.Trace().Msgf("AppID: %s", appID)
40+
log.DebugContext(ctx, "AppID found", "appid", appID)
4041
apps = append(apps, appID)
4142
}
4243
return apps, nil
4344
}
4445

45-
func getFlatpakApp(appID string) (Flatpak, error) {
46+
func getFlatpakApp(ctx context.Context, appID string) (Flatpak, error) {
4647
cmd := exec.Command("flatpak", "info", "-m", appID)
4748

48-
log.Debug().Str("command", cmd.Path+strings.Join(cmd.Args, " ")).Str("appID", appID).Msg("Running command")
49+
log.DebugContext(ctx, "Running command", "command", cmd.Path+" "+strings.Join(cmd.Args, " "), "appid", appID)
4950
out, err := cmd.Output()
5051
if err != nil {
5152
return Flatpak{}, err
5253
}
5354

54-
log.Trace().Str("data", string(out)).Msg("Parsing toml")
55+
log.DebugContext(ctx, "Parsing toml", "data", string(out))
5556
var flatpak Flatpak
5657
cfg, err := ini.Load(out)
5758
if err != nil {
@@ -62,15 +63,15 @@ func getFlatpakApp(appID string) (Flatpak, error) {
6263
return Flatpak{}, err
6364
}
6465

65-
flatpak.Application.Command, err = getCommand(&flatpak)
66+
flatpak.Application.Command, err = getCommand(ctx, &flatpak)
6667
if err != nil {
6768
return Flatpak{}, err
6869
}
6970

7071
return flatpak, nil
7172
}
7273

73-
func removeDuplicates(apps []Flatpak) []Flatpak {
74+
func removeDuplicates(ctx context.Context, apps []Flatpak) []Flatpak {
7475
keys := make(map[string]*Flatpak)
7576
list := []Flatpak{}
7677
duplicates := make(map[string][]Flatpak)
@@ -89,35 +90,36 @@ func removeDuplicates(apps []Flatpak) []Flatpak {
8990
return slices.DeleteFunc(list, func(app Flatpak) bool {
9091
apps, ok := duplicates[app.Application.Command]
9192
if ok {
92-
log.Warn().Str("command", app.Application.Command).Interface("apps", apps).Msg("Found duplicates")
93+
log.WarnContext(ctx, "Found duplicates", "command", app.Application.Command, "apps", apps)
9394
}
9495
return ok
9596
})
9697
}
9798

98-
func getAllFlatpakApps() []Flatpak {
99-
appsID, err := getApps()
99+
func getAllFlatpakApps(ctx context.Context) []Flatpak {
100+
appsID, err := getApps(ctx)
100101
if err != nil {
101-
log.Fatal().Err(err).Msg("Error getting apps")
102+
log.ErrorContext(ctx, "Error getting apps", "err", err)
103+
os.Exit(1)
102104
}
103105

104106
apps := make([]Flatpak, len(appsID))
105107
wg := sync.WaitGroup{}
106108
for i, appID := range appsID {
107109
wg.Add(1)
108-
go func(appID string) {
110+
go func(i int, appID string) {
109111
defer wg.Done()
110-
app, err := getFlatpakApp(appID)
112+
app, err := getFlatpakApp(ctx, appID)
111113
if err != nil {
112-
log.Error().Err(err).Str("appID", appID).Msg("Error getting app")
114+
log.ErrorContext(ctx, "Error getting app", "err", err, "appid", appID)
113115
}
114116
// No need to lock since we are writing to different indexes
115117
apps[i] = app
116-
}(appID)
118+
}(i, appID)
117119
}
118120
wg.Wait()
119121

120-
apps = removeDuplicates(apps)
122+
apps = removeDuplicates(ctx, apps)
121123

122124
return apps
123125
}

go.mod

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ module github.com/RedCommand/flatpak-alias
33
go 1.23.4
44

55
require (
6-
github.com/hbollon/go-edlib v1.6.0
7-
github.com/rs/zerolog v1.33.0
8-
gopkg.in/ini.v1 v1.67.0
9-
gopkg.in/natefinch/lumberjack.v2 v2.2.1
6+
github.com/hbollon/go-edlib v1.6.0
7+
gopkg.in/ini.v1 v1.67.0
8+
gopkg.in/natefinch/lumberjack.v2 v2.2.1
109
)
1110

1211
require (

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
1313
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1414
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1515
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
16-
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
17-
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
1816
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
1917
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
2018
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

logger.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log/slog"
6+
)
7+
8+
type multiHandler struct {
9+
handlers []slog.Handler
10+
}
11+
12+
func (h multiHandler) Enabled(ctx context.Context, level slog.Level) bool {
13+
for _, handler := range h.handlers {
14+
if handler.Enabled(ctx, level) {
15+
return true
16+
}
17+
}
18+
return false
19+
}
20+
21+
func (h multiHandler) Handle(ctx context.Context, r slog.Record) error {
22+
for _, handler := range h.handlers {
23+
if err := handler.Handle(ctx, r); err != nil {
24+
return err
25+
}
26+
}
27+
return nil
28+
}
29+
30+
func (h multiHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
31+
hs := make([]slog.Handler, len(h.handlers))
32+
for i, handler := range h.handlers {
33+
hs[i] = handler.WithAttrs(attrs)
34+
}
35+
return multiHandler{handlers: hs}
36+
}
37+
38+
func (h multiHandler) WithGroup(name string) slog.Handler {
39+
hs := make([]slog.Handler, len(h.handlers))
40+
for i, handler := range h.handlers {
41+
hs[i] = handler.WithGroup(name)
42+
}
43+
return multiHandler{handlers: hs}
44+
}

main.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package main
22

33
import (
4+
"context"
45
_ "embed"
56
"os"
67
"path"
78
"text/template"
89
"time"
910

10-
"github.com/rs/zerolog"
11-
"github.com/rs/zerolog/log"
1211
"gopkg.in/natefinch/lumberjack.v2"
12+
"log/slog"
1313
)
1414

1515
type Config struct {
@@ -27,6 +27,8 @@ type Flatpak struct {
2727
//go:embed script.gotmpl
2828
var scriptTemplateRaw string
2929

30+
var log *slog.Logger
31+
3032
func parseArgs() Config {
3133
config := Config{}
3234
if len(os.Args) > 1 {
@@ -37,7 +39,7 @@ func parseArgs() Config {
3739
return config
3840
}
3941

40-
func prepare(config *Config) (*template.Template, *lumberjack.Logger) {
42+
func prepare(ctx context.Context, config *Config) (*template.Template, *lumberjack.Logger) {
4143
logFile := &lumberjack.Logger{
4244
Filename: path.Join(config.FlatpakDir, "flatpak-alias.log"), // Path to the log file
4345
MaxSize: 1, // Maximum size in MB before rotation
@@ -46,36 +48,36 @@ func prepare(config *Config) (*template.Template, *lumberjack.Logger) {
4648
Compress: true, // Compress rotated files
4749
}
4850

49-
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339}
50-
51-
multiWriter := zerolog.MultiLevelWriter(consoleWriter, logFile)
52-
53-
log.Logger = zerolog.New(multiWriter).With().Timestamp().Logger()
54-
55-
zerolog.SetGlobalLevel(zerolog.InfoLevel)
51+
textHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})
52+
jsonHandler := slog.NewJSONHandler(logFile, &slog.HandlerOptions{Level: slog.LevelInfo})
53+
log = slog.New(multiHandler{handlers: []slog.Handler{textHandler, jsonHandler}})
54+
slog.SetDefault(log)
5655

5756
scriptTemplate, err := template.New("script").Parse(scriptTemplateRaw)
5857
if err != nil {
59-
log.Fatal().Err(err).Msg("Error parsing template")
58+
log.ErrorContext(ctx, "Error parsing template", "err", err)
59+
os.Exit(1)
6060
}
6161

6262
config.FlatpakDir = path.Join(config.FlatpakDir, "aliases")
63-
log.Info().Str("path", config.FlatpakDir).Msg("Writing script")
63+
log.InfoContext(ctx, "Writing script", "path", config.FlatpakDir)
6464
err = os.MkdirAll(config.FlatpakDir, 0755)
6565
if err != nil {
66-
log.Fatal().Err(err).Msg("Error creating directory")
66+
log.ErrorContext(ctx, "Error creating directory", "err", err)
67+
os.Exit(1)
6768
}
6869

6970
return scriptTemplate, logFile
7071
}
7172

7273
func main() {
74+
ctx := context.Background()
7375
config := parseArgs()
74-
scriptTemplate, logFile := prepare(&config)
76+
scriptTemplate, logFile := prepare(ctx, &config)
7577
defer logFile.Close()
76-
log.Info().Msg("Starting flatpak-alias")
77-
log.Info().Str("path", config.FlatpakDir).Any("args", os.Args).Msg("Writing script")
78-
apps := getAllFlatpakApps()
79-
removeOldScripts(config)
80-
generateScripts(apps, scriptTemplate, config)
78+
log.InfoContext(ctx, "Starting flatpak-alias")
79+
log.InfoContext(ctx, "Writing script", "path", config.FlatpakDir, "args", os.Args)
80+
apps := getAllFlatpakApps(ctx)
81+
removeOldScripts(ctx, config)
82+
generateScripts(ctx, apps, scriptTemplate, config)
8183
}

scripts.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,59 @@
11
package main
22

33
import (
4+
"context"
45
"os"
56
"path"
67
"text/template"
78
"time"
8-
9-
"github.com/rs/zerolog/log"
109
)
1110

12-
func removeOldScripts(config Config) {
11+
func removeOldScripts(ctx context.Context, config Config) {
1312
files, err := os.ReadDir(config.FlatpakDir)
1413
if err != nil {
15-
log.Fatal().Err(err).Msg("Error reading output directory")
14+
log.ErrorContext(ctx, "Error reading output directory", "err", err)
15+
os.Exit(1)
1616
}
1717

1818
for _, file := range files {
1919
f, err := os.Open(path.Join(config.FlatpakDir, file.Name()))
2020
if err != nil {
21-
log.Error().Err(err).Str("file", file.Name()).Msg("Error opening file")
21+
log.ErrorContext(ctx, "Error opening file", "err", err, "file", file.Name())
2222
continue
2323
}
2424
content := make([]byte, 30)
2525
i, err := f.ReadAt(content, 14)
2626
if err != nil || i != 30 || string(content) != "**Generated by flatpak-alias**" {
27-
log.Warn().Str("file", file.Name()).Msg("Not a managed file")
27+
log.WarnContext(ctx, "Not a managed file", "file", file.Name())
2828
continue
2929
}
3030

3131
err = os.Remove(path.Join(config.FlatpakDir, file.Name()))
3232
if err != nil {
33-
log.Error().Err(err).Str("file", file.Name()).Msg("Error deleting file")
33+
log.ErrorContext(ctx, "Error deleting file", "err", err, "file", file.Name())
3434
}
3535
}
3636
}
3737

38-
func generateScripts(apps []Flatpak, scriptTemplate *template.Template, config Config) {
38+
func generateScripts(ctx context.Context, apps []Flatpak, scriptTemplate *template.Template, config Config) {
3939
now := time.Now()
4040
for _, app := range apps {
41-
log.Info().Str("name", app.Application.Name).Str("command", app.Application.Command).Msg("Found application")
41+
log.InfoContext(ctx, "Found application", "name", app.Application.Name, "command", app.Application.Command)
4242
app.Timestamp = now
4343

4444
if _, err := os.Stat(path.Join(config.FlatpakDir, app.Application.Command)); err == nil {
45-
log.Warn().Str("command", app.Application.Command).Msg("File already exists")
45+
log.WarnContext(ctx, "File already exists", "command", app.Application.Command)
4646
continue
4747
}
4848

4949
file, err := os.Create(path.Join(config.FlatpakDir, app.Application.Command))
5050
if err != nil {
51-
log.Error().Err(err).Str("command", app.Application.Command).Msg("Error creating file")
51+
log.ErrorContext(ctx, "Error creating file", "err", err, "command", app.Application.Command)
5252
continue
5353
}
5454
err = scriptTemplate.Execute(file, app)
5555
if err != nil {
56-
log.Error().Err(err).Str("command", app.Application.Command).Msg("Error writing template")
56+
log.ErrorContext(ctx, "Error writing template", "err", err, "command", app.Application.Command)
5757
continue
5858
}
5959

scrore.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package main
22

33
import (
4+
"context"
45
"errors"
56
"strings"
67

78
"github.com/hbollon/go-edlib"
8-
"github.com/rs/zerolog/log"
99
)
1010

1111
const threshold = 0.75
@@ -18,7 +18,7 @@ const (
1818
matchNope = "nope"
1919
)
2020

21-
func toCommand(str string) string {
21+
func toCommand(ctx context.Context, str string) string {
2222
res := make([]byte, 0, len(str))
2323
needSpace := false
2424
lastUpper := false
@@ -50,11 +50,11 @@ func toCommand(str string) string {
5050
needSpace = true
5151
}
5252
}
53-
log.Trace().Str("input", str).Str("output", string(res)).Msg("Converted")
53+
log.DebugContext(ctx, "Converted", "input", str, "output", string(res))
5454
return string(res)
5555
}
5656

57-
func getCommand(app *Flatpak) (string, error) {
57+
func getCommand(ctx context.Context, app *Flatpak) (string, error) {
5858
var res string
5959
var match string
6060
command := strings.TrimSpace(app.Application.Command)
@@ -78,6 +78,6 @@ func getCommand(app *Flatpak) (string, error) {
7878
if res == "" {
7979
return "", errors.New("empty command")
8080
}
81-
log.Debug().Str("appID", appID).Str("name", name).Str("command", command).Float32("rank", similarity).Str("result", res).Msgf("Match %s", match)
82-
return toCommand(res), nil
81+
log.DebugContext(ctx, "Match", "appid", appID, "name", name, "command", command, "rank", similarity, "result", res, "match", match)
82+
return toCommand(ctx, res), nil
8383
}

0 commit comments

Comments
 (0)