first commit
This commit is contained in:
commit
859f5c1b26
7
go.mod
Normal file
7
go.mod
Normal file
@ -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
|
15
go.sum
Normal file
15
go.sum
Normal file
@ -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=
|
138
logger.go
Normal file
138
logger.go
Normal file
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user