135 lines
2.8 KiB
Go
135 lines
2.8 KiB
Go
package logger
|
|
|
|
import (
|
|
"apskel-pos-be/internal/appcontext"
|
|
"context"
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type logCtxKeyType struct{}
|
|
|
|
var logCtxKey = logCtxKeyType(struct{}{})
|
|
|
|
var logger *logrus.Logger
|
|
|
|
const (
|
|
LogMethod = "Method"
|
|
LogError = "Error"
|
|
)
|
|
|
|
func Setup(logLevel, logFormat string) {
|
|
level, err := logrus.ParseLevel(logLevel)
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
|
|
logger = &logrus.Logger{
|
|
Out: os.Stdout,
|
|
Hooks: make(logrus.LevelHooks),
|
|
Level: level,
|
|
Formatter: &logrus.JSONFormatter{},
|
|
}
|
|
|
|
if logFormat != "json" {
|
|
logger.Formatter = &logrus.TextFormatter{}
|
|
}
|
|
NonContext = &ContextLogger{
|
|
entry: logrus.NewEntry(logger),
|
|
}
|
|
}
|
|
|
|
type ContextLogger struct {
|
|
entry *logrus.Entry
|
|
}
|
|
|
|
var NonContext *ContextLogger
|
|
|
|
func NewContextLogger(ctx interface{}, method string) *ContextLogger {
|
|
logEntry := logger.WithFields(appcontext.LogFields(ctx)).WithField(LogMethod, method)
|
|
return &ContextLogger{
|
|
entry: logEntry,
|
|
}
|
|
}
|
|
|
|
func (l *ContextLogger) Fatal(errMessage string, err error) {
|
|
l.entry.
|
|
WithField(LogError, err).
|
|
Fatal(errMessage)
|
|
}
|
|
|
|
func (l *ContextLogger) Error(errMessage string, err error) {
|
|
l.entry.WithField(LogError, err).Error(errMessage)
|
|
}
|
|
|
|
func (l *ContextLogger) Errorf(err error, errMessageFormat string, errMessages ...interface{}) {
|
|
l.entry.WithField(LogError, err).Errorf(errMessageFormat, errMessages...)
|
|
}
|
|
|
|
func (l *ContextLogger) ErrorWithFields(msg string, fields map[string]interface{}, err error) {
|
|
for key, val := range fields {
|
|
l.entry = l.entry.WithField(key, val)
|
|
}
|
|
|
|
l.entry.WithField(LogError, err).Error(msg)
|
|
}
|
|
|
|
func (l *ContextLogger) Info(msg string) {
|
|
l.entry.Info(msg)
|
|
|
|
}
|
|
|
|
func (l *ContextLogger) Infof(msg string, args ...interface{}) {
|
|
l.entry.Infof(msg, args...)
|
|
}
|
|
|
|
func (l *ContextLogger) Debugf(msg string, args ...interface{}) {
|
|
l.entry.Debugf(msg, args...)
|
|
}
|
|
|
|
func (l *ContextLogger) Debug(msg string) {
|
|
l.entry.Debug(msg)
|
|
}
|
|
|
|
func (l *ContextLogger) InfoWithFields(msg string, fields map[string]interface{}) {
|
|
for key, val := range fields {
|
|
l.entry = l.entry.WithField(key, val)
|
|
}
|
|
|
|
l.entry.Info(msg)
|
|
}
|
|
|
|
func (l *ContextLogger) DebugWithFields(msg string, fields map[string]interface{}) {
|
|
for key, val := range fields {
|
|
l.entry = l.entry.WithField(key, val)
|
|
}
|
|
|
|
l.entry.Debug(msg)
|
|
}
|
|
|
|
func (l *ContextLogger) Warn(msg string) {
|
|
l.entry.Warn(msg)
|
|
}
|
|
|
|
func (l *ContextLogger) Warnf(msg string, args ...interface{}) {
|
|
l.entry.Warnf(msg, args...)
|
|
}
|
|
|
|
func (l *ContextLogger) WarnWithFields(msg string, fields map[string]interface{}, err error) {
|
|
for key, val := range fields {
|
|
l.entry = l.entry.WithField(key, val)
|
|
}
|
|
|
|
l.entry.WithField(LogError, err)
|
|
l.entry.Warn(msg)
|
|
}
|
|
|
|
func FromContext(ctx context.Context) *logrus.Entry {
|
|
if entry, ok := ctx.Value(logCtxKey).(*logrus.Entry); ok {
|
|
return entry
|
|
}
|
|
return logger.WithFields(map[string]interface{}{})
|
|
}
|