package service import ( "context" pkglog "log" ) var logger = NewLogger(ErrLevel) //var logger = NewContextLogger(InfoLevel) // SetLogger sets logger for the package. func SetLogger(l Logger) { logger = l } // // SetContextLogger sets logger for the package. // func SetContextLogger(l ContextLogger) { // logger = l // } // Logger interface used in this package. type Logger interface { Debugf(format string, args ...interface{}) Infof(format string, args ...interface{}) Warningf(format string, args ...interface{}) Errorf(format string, args ...interface{}) Fatalf(format string, args ...interface{}) } // LogLevel ... type LogLevel int const ( // DebugLevel ... DebugLevel LogLevel = 3 // InfoLevel ... InfoLevel LogLevel = 2 // WarnLevel ... WarnLevel LogLevel = 1 // ErrLevel ... ErrLevel LogLevel = 0 ) // NewLogger ... func NewLogger(lev LogLevel) Logger { return &defaultLog{Level: lev} } func parseLogLevel(s string) (LogLevel, bool) { switch s { case "debug": return DebugLevel, true case "info": return InfoLevel, true case "warn": return WarnLevel, true case "err": return ErrLevel, true case "": return InfoLevel, true default: return InfoLevel, false } } func (l LogLevel) String() string { switch l { case DebugLevel: return "debug" case InfoLevel: return "info" case WarnLevel: return "warn" case ErrLevel: return "err" default: return "" } } type defaultLog struct { Level LogLevel } func (l defaultLog) Debugf(format string, args ...interface{}) { if l.Level >= 3 { pkglog.Printf("[DEBG] "+format+"\n", args...) } } func (l defaultLog) Infof(format string, args ...interface{}) { if l.Level >= 2 { pkglog.Printf("[INFO] "+format+"\n", args...) } } func (l defaultLog) Warningf(format string, args ...interface{}) { if l.Level >= 1 { pkglog.Printf("[WARN] "+format+"\n", args...) } } func (l defaultLog) Errorf(format string, args ...interface{}) { if l.Level >= 0 { pkglog.Printf("[ERR] "+format+"\n", args...) } } func (l defaultLog) Fatalf(format string, args ...interface{}) { pkglog.Fatalf(format, args...) } // ContextLogger interface used in this package with request context. type ContextLogger interface { Debugf(ctx context.Context, format string, args ...interface{}) Infof(ctx context.Context, format string, args ...interface{}) Warningf(ctx context.Context, format string, args ...interface{}) Errorf(ctx context.Context, format string, args ...interface{}) } // NewContextLogger ... func NewContextLogger(lev LogLevel) ContextLogger { return &defaultContextLog{Level: lev} } type defaultContextLog struct { Level LogLevel } func (l defaultContextLog) Debugf(ctx context.Context, format string, args ...interface{}) { if l.Level >= 3 { pkglog.Printf("[DEBG] "+format+"\n", args...) } } func (l defaultContextLog) Infof(ctx context.Context, format string, args ...interface{}) { if l.Level >= 2 { pkglog.Printf("[INFO] "+format+"\n", args...) } } func (l defaultContextLog) Warningf(ctx context.Context, format string, args ...interface{}) { if l.Level >= 1 { pkglog.Printf("[WARN] "+format+"\n", args...) } } func (l defaultContextLog) Errorf(ctx context.Context, format string, args ...interface{}) { if l.Level >= 0 { pkglog.Printf("[ERR] "+format+"\n", args...) } }