Skip to content

Commit

Permalink
refactor: use slog (#486)
Browse files Browse the repository at this point in the history
Signed-off-by: knqyf263 <[email protected]>
  • Loading branch information
knqyf263 authored Jan 22, 2025
1 parent 492b9fc commit 388c617
Show file tree
Hide file tree
Showing 26 changed files with 244 additions and 129 deletions.
5 changes: 3 additions & 2 deletions cmd/trivy-db/main.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package main

import (
"log"
"os"

"github.com/aquasecurity/trivy-db/pkg"
"github.com/aquasecurity/trivy-db/pkg/log"
)

var (
Expand All @@ -16,6 +16,7 @@ func main() {
app := ac.NewApp(version)
err := app.Run(os.Args)
if err != nil {
log.Fatalf("%+v", err)
log.Error("Failed to run app", log.Err(err))
os.Exit(1)
}
}
8 changes: 2 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -35,21 +35,17 @@ require (
github.com/goccy/go-yaml v1.8.1 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/mattn/go-colorable v0.1.8 // indirect
github.com/mattn/go-isatty v0.0.12 // indirect
github.com/mattn/go-runewidth v0.0.4 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/mod v0.22.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/term v0.1.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

require (
github.com/mattn/go-runewidth v0.0.4 // indirect
go.uber.org/zap v1.27.0
)
7 changes: 1 addition & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yq
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand Down Expand Up @@ -93,12 +94,6 @@ github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/X
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0=
go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc=
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
Expand Down
2 changes: 1 addition & 1 deletion pkg/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ func (dbc Config) forEach(bktNames []string) (map[string]Value, error) {

source, err := dbc.getDataSource(tx, r)
if err != nil {
log.Logger.Debugf("Data source error: %s", err)
log.WithPrefix("db").Debug("Data source error", log.Err(err))
}

bkt := root
Expand Down
110 changes: 99 additions & 11 deletions pkg/log/log.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,110 @@
package log

import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"context"
"fmt"
"log/slog"
"os"
)

var Logger *zap.SugaredLogger
// Logger is an alias for slog.Logger
type Logger = slog.Logger

var defaultLogger *Logger

// Convenience variables to match slog's API
var (
String = slog.String
Int = slog.Int
Int64 = slog.Int64
Bool = slog.Bool
Any = slog.Any
)

// Package-level logging functions
func Info(msg string, args ...any) {
defaultLogger.Info(msg, args...)
}

func Warn(msg string, args ...any) {
defaultLogger.Warn(msg, args...)
}

func Error(msg string, args ...any) {
defaultLogger.Error(msg, args...)
}

func Debug(msg string, args ...any) {
defaultLogger.Debug(msg, args...)
}

func Err(err error) slog.Attr {
return slog.Attr{Key: "error", Value: slog.AnyValue(err)}
}

func FilePath(path string) slog.Attr {
return slog.Attr{Key: "file_path", Value: slog.AnyValue(path)}
}

func DirPath(path string) slog.Attr {
return slog.Attr{Key: "dir_path", Value: slog.AnyValue(path)}
}

// PrefixHandler is a simple wrapper around slog.Handler that adds a prefix to all messages
type PrefixHandler struct {
prefix string
handler slog.Handler
}

func init() {
conf := zap.NewDevelopmentConfig()
conf.DisableCaller = true
conf.DisableStacktrace = true
conf.EncoderConfig.EncodeTime = zapcore.RFC3339TimeEncoder
opts := &slog.HandlerOptions{
Level: slog.LevelDebug,
}
baseHandler := slog.NewTextHandler(os.Stdout, opts)
prefixHandler := &PrefixHandler{
prefix: "",
handler: baseHandler,
}
defaultLogger = slog.New(prefixHandler)
}

// WithPrefix returns a new logger with the specified prefix
func WithPrefix(prefix string) *Logger {
return slog.New(&PrefixHandler{
prefix: prefix,
handler: defaultLogger.Handler(),
})
}

func SetLogger(l *Logger) {
defaultLogger = l
}

// Handle implements slog.Handler interface
func (h *PrefixHandler) Handle(ctx context.Context, r slog.Record) error {
if h.prefix != "" {
r.Message = fmt.Sprintf("[%s] %s", h.prefix, r.Message)
}
return h.handler.Handle(ctx, r)
}

// WithAttrs implements slog.Handler interface
func (h *PrefixHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
return &PrefixHandler{
prefix: h.prefix,
handler: h.handler.WithAttrs(attrs),
}
}

logger, _ := conf.Build()
Logger = logger.Sugar()
// WithGroup implements slog.Handler interface
func (h *PrefixHandler) WithGroup(name string) slog.Handler {
return &PrefixHandler{
prefix: h.prefix,
handler: h.handler.WithGroup(name),
}
}

func SetLogger(l *zap.SugaredLogger) {
Logger = l
// Enabled implements slog.Handler interface
func (h *PrefixHandler) Enabled(ctx context.Context, level slog.Level) bool {
return h.handler.Enabled(ctx, level)
}
5 changes: 3 additions & 2 deletions pkg/utils/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import (
"encoding/json"
"io"
"io/fs"
"log"
"os"
"path/filepath"

"golang.org/x/xerrors"

"github.com/aquasecurity/trivy-db/pkg/log"
)

func FileWalk(root string, walkFn func(r io.Reader, path string) error) error {
Expand All @@ -25,7 +26,7 @@ func FileWalk(root string, walkFn func(r io.Reader, path string) error) error {
}

if info.Size() == 0 {
log.Printf("invalid size: %s\n", path)
log.Info("Invalid file size", log.FilePath(path), log.Int64("size", info.Size()))
return nil
}

Expand Down
8 changes: 6 additions & 2 deletions pkg/utils/time.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
package utils

import (
"log"
"time"

"github.com/aquasecurity/trivy-db/pkg/log"
)

func MustTimeParse(value string) *time.Time {
t, err := time.Parse(time.RFC3339, value)
if err != nil {
log.Fatalln(err)
log.Error("Failed to parse time",
log.String("value", value),
log.Err(err))
panic(err)
}

return &t
Expand Down
6 changes: 3 additions & 3 deletions pkg/vulndb/db.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package vulndb

import (
"log"
"time"

bolt "go.etcd.io/bbolt"
"golang.org/x/xerrors"
"k8s.io/utils/clock"

"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/aquasecurity/trivy-db/pkg/log"
"github.com/aquasecurity/trivy-db/pkg/metadata"
"github.com/aquasecurity/trivy-db/pkg/types"
"github.com/aquasecurity/trivy-db/pkg/vulnsrc"
Expand Down Expand Up @@ -69,13 +69,13 @@ func New(cacheDir, outputDir string, updateInterval time.Duration, opts ...Optio
}

func (t TrivyDB) Insert(targets []string) error {
log.Println("Updating vulnerability database...")
log.Info("Updating vulnerability database...")
for _, target := range targets {
src, ok := t.vulnSrc(target)
if !ok {
return xerrors.Errorf("%s is not supported", target)
}
log.Printf("Updating %s data...\n", target)
log.WithPrefix(target).Info("Updating data...")

if err := src.Update(t.cacheDir); err != nil {
return xerrors.Errorf("%s update error: %w", target, err)
Expand Down
10 changes: 6 additions & 4 deletions pkg/vulnsrc/alma/alma.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"encoding/json"
"fmt"
"io"
"log"
"path/filepath"
"strings"

Expand All @@ -13,6 +12,7 @@ import (
"golang.org/x/xerrors"

"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/aquasecurity/trivy-db/pkg/log"
"github.com/aquasecurity/trivy-db/pkg/types"
"github.com/aquasecurity/trivy-db/pkg/utils"
"github.com/aquasecurity/trivy-db/pkg/vulnsrc/vulnerability"
Expand Down Expand Up @@ -47,7 +47,8 @@ type DB interface {
}

type VulnSrc struct {
DB // Those who want to customize Trivy DB can override put/get methods.
DB // Those who want to customize Trivy DB can override put/get methods.
logger *log.Logger
}

// Alma implements the DB interface
Expand All @@ -57,7 +58,8 @@ type Alma struct {

func NewVulnSrc() *VulnSrc {
return &VulnSrc{
DB: &Alma{Operation: db.Config{}},
DB: &Alma{Operation: db.Config{}},
logger: log.WithPrefix("alma"),
}
}

Expand Down Expand Up @@ -89,7 +91,7 @@ func (vs *VulnSrc) parse(rootDir string) (map[string][]Erratum, error) {

dirs := strings.Split(path, string(filepath.Separator))
if len(dirs) < 3 {
log.Printf("invalid path: %s\n", path)
vs.logger.Warn("Invalid path", log.FilePath(path))
return nil
}

Expand Down
8 changes: 5 additions & 3 deletions pkg/vulnsrc/amazon/amazon.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"encoding/json"
"fmt"
"io"
"log"
"path/filepath"
"slices"
"strings"
Expand All @@ -13,6 +12,7 @@ import (
"golang.org/x/xerrors"

"github.com/aquasecurity/trivy-db/pkg/db"
"github.com/aquasecurity/trivy-db/pkg/log"
"github.com/aquasecurity/trivy-db/pkg/types"
"github.com/aquasecurity/trivy-db/pkg/utils"
"github.com/aquasecurity/trivy-db/pkg/vulnsrc/vulnerability"
Expand All @@ -35,6 +35,7 @@ var (

type VulnSrc struct {
dbc db.Operation
logger *log.Logger
advisories map[string][]ALAS
}

Expand Down Expand Up @@ -66,6 +67,7 @@ type Reference struct {
func NewVulnSrc() VulnSrc {
return VulnSrc{
dbc: db.Config{},
logger: log.WithPrefix("amazon"),
advisories: map[string][]ALAS{},
}
}
Expand Down Expand Up @@ -96,7 +98,7 @@ func (vs *VulnSrc) walkFunc(r io.Reader, path string) error {
}
version := paths[len(paths)-2]
if !slices.Contains(targetVersions, version) {
log.Printf("unsupported Amazon version: %s\n", version)
vs.logger.Warn("Unsupported Amazon version", "version", version)
return nil
}

Expand All @@ -110,7 +112,7 @@ func (vs *VulnSrc) walkFunc(r io.Reader, path string) error {
}

func (vs VulnSrc) save() error {
log.Println("Saving Amazon DB")
vs.logger.Info("Saving DB")
err := vs.dbc.BatchUpdate(func(tx *bolt.Tx) error {
return vs.commit(tx)
})
Expand Down
Loading

0 comments on commit 388c617

Please sign in to comment.