Skip to content

Commit

Permalink
Start v2 of cmdutil with slog for svclog
Browse files Browse the repository at this point in the history
  • Loading branch information
slizco committed Jul 19, 2024
1 parent c2a84cc commit 1d41c6a
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 1 deletion.
124 changes: 124 additions & 0 deletions cmdutil/v2/svclog/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// Package svclog provides logging facilities for standard services.
package svclog

import (
"fmt"
"log"
"os"

"log/slog"
)

// Config for logger.
type Config struct {
AppName string `env:"APP_NAME,required"`
Deploy string `env:"DEPLOY,required"`
SpaceID string `env:"SPACE_ID"`
Dyno string `env:"DYNO"`
LogLevel string `env:"LOG_LEVEL,default=INFO"`
}

// NewLogger returns a new logger that includes app and deploy key/value pairs
// in each log line.
func NewLogger(cfg Config) *slog.Logger {
level, err := ParseLevel(cfg.LogLevel)
if err != nil {
log.Fatal(err)
}

hopts := &slog.HandlerOptions{
Level: level,
}
logger := slog.New(slog.NewTextHandler(os.Stdout, hopts)).With(
"app", cfg.AppName,
"deploy", cfg.Deploy,
)

if cfg.SpaceID != "" {
logger = logger.With("space", cfg.SpaceID)
}
if cfg.Dyno != "" {
logger = logger.With("dyno", cfg.Dyno)
}

return logger
}

// ReportPanic attempts to report the panic to rollbar via the slog.
func ReportPanic(logger slog.Logger) {
if p := recover(); p != nil {
s := fmt.Sprint(p)
logger.With("at", "panic").Error(s)
panic(p)
}
}

/*
// NewSampleLogger creates a rate limited logger that samples logs. The parameter
// logsBurstLimit defines how many logs are allowed per logBurstWindow duration.
// The returned logger derives from the parentLogger, but without inheriting any Hooks.
// All log entries derived from SampleLogger will contain 'sampled=true' field.
func NewSampleLogger(parentLogger slog.Logger, logsBurstLimit int, logBurstWindow time.Duration) slog.Logger {
entry := parentLogger.With("sampled", true)
ll := slog.New()
ll.Out = entry.Logger.Out
ll.Level = entry.Logger.Level
ll.ReportCaller = entry.Logger.ReportCaller
ll.Formatter = &sampleFormatter{
origFormatter: entry.Logger.Formatter,
limiter: rate.NewLimiter(rate.Every(logBurstWindow), logsBurstLimit),
}
return ll.With(entry.Data)
}
type sampleFormatter struct {
limiter *rate.Limiter
origFormatter slog.Formatter
}
func (sf *sampleFormatter) Format(e *slog.Entry) ([]byte, error) {
if sf.limiter.Allow() {
return sf.origFormatter.Format(e)
}
return nil, nil
}
// SaramaLogger takes Logger and returns a saramaLogger.
func SaramaLogger(logger slog.Logger) slog.Logger {
logger = logger.With("component", "sarama")
return saramaLogger{logger}
}
type saramaLogger struct {
slog.Logger
}
func (sl saramaLogger) Printf(format string, args ...interface{}) {
format = strings.TrimSpace(format)
sl.Logger.Printf(format, args...)
}
// NewNullLogger returns a logger that discards the output useful for testing
func NewNullLogger() slog.Logger {
logger := slog.New()
logger.SetOutput(io.Discard)
return logger
}
// LoggerOrNull ensures non-nil logger is passed in or creates a Null Logger
func LoggerOrNull(l slog.Logger) slog.Logger {
if l == nil {
return NewNullLogger()
}
return l
}
*/

func ParseLevel(s string) (slog.Level, error) {
var level slog.Level
var err = level.UnmarshalText([]byte(s))
return level, err
}
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ require (
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0
go.opentelemetry.io/otel/metric v1.27.0
golang.org/x/crypto v0.21.0
golang.org/x/sync v0.3.0
golang.org/x/sync v0.7.0
golang.org/x/sys v0.20.0 // indirect
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c
google.golang.org/grpc v1.59.0
Expand All @@ -73,6 +73,7 @@ require (
github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect
go.opentelemetry.io/otel/trace v1.27.0 // indirect
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
golang.org/x/exp v0.0.0-20240716175740-e3f259677ff7 // indirect
golang.org/x/net v0.23.0 // indirect
golang.org/x/oauth2 v0.12.0 // indirect
google.golang.org/api v0.7.0 // indirect
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20240716175740-e3f259677ff7 h1:wDLEX9a7YQoKdKNQt88rtydkqDxeGaBUTnIYc3iG/mA=
golang.org/x/exp v0.0.0-20240716175740-e3f259677ff7/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
Expand Down Expand Up @@ -278,6 +280,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand Down

0 comments on commit 1d41c6a

Please sign in to comment.