From 859f5c1b2692e780379394571fa9fd65b4509e43 Mon Sep 17 00:00:00 2001 From: aespin Date: Tue, 17 Sep 2024 10:33:04 +0200 Subject: [PATCH] first commit --- README.md | 0 go.mod | 7 +++ go.sum | 15 ++++++ logger.go | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+) create mode 100644 README.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 logger.go diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..c55e03f --- /dev/null +++ b/go.mod @@ -0,0 +1,7 @@ +module git.espin.casa/albert/logger + +go 1.23.1 + +require github.com/sirupsen/logrus v1.9.3 + +require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..21f9bfb --- /dev/null +++ b/go.sum @@ -0,0 +1,15 @@ +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= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/logger.go b/logger.go new file mode 100644 index 0000000..b8d0b90 --- /dev/null +++ b/logger.go @@ -0,0 +1,138 @@ +package logger + +import ( + "fmt" + "io" + "runtime" + "strings" + + "github.com/sirupsen/logrus" +) + +type LogFields map[string]interface{} + +// Add adds new fields to the list of LogFields. +func (l LogFields) Add(newFields LogFields) LogFields { + resultFields := make(LogFields, len(l)+len(newFields)) + + for field, value := range l { + resultFields[field] = value + } + for field, value := range newFields { + resultFields[field] = value + } + + return resultFields +} + +// Copy copies the LogFields. +func (l LogFields) Copy() LogFields { + cpy := make(LogFields, len(l)) + for k, v := range l { + cpy[k] = v + } + + return cpy +} + +type logger struct { + log *logrus.Logger +} + +// Fatal implements LoggerAdapter fatal level +func (l *logger) Fatal(msg string, err error, fields LogFields) { + lf := cpyMap(fields) + lf["error"] = err.Error() + l.log.WithFields(lf).Fatal(msg) +} + +// Panic implements LoggerAdapter panic level +func (l *logger) Panic(msg string, err error, fields LogFields) { + lf := cpyMap(fields) + lf["error"] = err.Error() + l.log.WithFields(lf).Panic(msg) +} + +// Warn implements LoggerAdapter warning level +func (l *logger) Warn(msg string, fields LogFields) { + lf := cpyMap(fields) + l.log.WithFields(lf).Warn(msg) +} + +// Debug implements LoggerAdapter debug level +func (l *logger) Debug(msg string, fields LogFields) { + lf := cpyMap(fields) + l.log.WithFields(lf).Debug(msg) +} + +// Error implements LoggerAdapter error level +func (l *logger) Error(msg string, err error, fields LogFields) { + lf := cpyMap(fields) + lf["error"] = err.Error() + l.log.WithFields(lf).Error(msg) +} + +// Info implements LoggerAdapter info level +func (l *logger) Info(msg string, fields LogFields) { + lf := cpyMap(fields) + l.log.WithFields(lf).Info(msg) +} + +// Trace implements LoggerAdapter trace level +func (l *logger) Trace(msg string, fields LogFields) { + lf := cpyMap(fields) + l.log.WithFields(lf).Trace(msg) +} + +type LoggerAdapter interface { + Info(msg string, fields LogFields) + Debug(msg string, fields LogFields) + Trace(msg string, fields LogFields) + Warn(msg string, fields LogFields) + Error(msg string, err error, fields LogFields) + Fatal(msg string, err error, fields LogFields) + Panic(msg string, err error, fields LogFields) +} + +func New(out io.Writer, lvl string) LoggerAdapter { + level, err := logrus.ParseLevel(lvl) + if err != nil { + level = logrus.InfoLevel + } + if lvl == "" { + level = logrus.InfoLevel + } + var log = logrus.New() + log.Formatter = new(logrus.JSONFormatter) + log.SetFormatter(&logrus.TextFormatter{ + TimestampFormat: "02-01-2006 15:04:05", // the "time" field configuration + FullTimestamp: true, + DisableLevelTruncation: true, // log level field configuration + CallerPrettyfier: func(f *runtime.Frame) (string, string) { + // this function is required when you want to introduce your custom format. + // In my case I wanted file and line to look like this `file="engine.go:141` + // but f.File provides a full path along with the file name. + // So in `formatFilePath()` function I just trimmed everything before the file name + // and added a line number in the end + return "", fmt.Sprintf("%s:%d", formatFilePath(f.File), f.Line) + }, + }) + log.Out = out + log.Level = level + return &logger{ + log: log, + } +} + +func formatFilePath(path string) string { + arr := strings.Split(path, "/") + return arr[len(arr)-1] +} + +func cpyMap(fields LogFields) logrus.Fields { + copied := make(logrus.Fields) + for i, e := range fields { + copied[i] = e + } + return copied +}