github.com/vseinstrumentiru/lego@v1.0.2/internal/lego/monitor/log/logger.go (about) 1 // Package log configures a new log for an application. 2 package log 3 4 import ( 5 "fmt" 6 "os" 7 "runtime" 8 9 "github.com/sirupsen/logrus" 10 logrusadapter "logur.dev/adapter/logrus" 11 "logur.dev/logur" 12 ) 13 14 // NewLogger creates a new log. 15 func New(config Config) logur.LoggerFacade { 16 logger := logrus.New() 17 logger.SetReportCaller(config.UseStack) 18 19 logger.SetOutput(os.Stdout) 20 logger.SetFormatter(&logrus.TextFormatter{ 21 DisableColors: config.NoColor, 22 EnvironmentOverrideColors: true, 23 CallerPrettyfier: stackFn(config.SkipStack), 24 }) 25 26 switch config.Format { 27 case "logfmt": 28 // Already the default 29 30 case "json": 31 logger.SetFormatter(&logrus.JSONFormatter{ 32 CallerPrettyfier: stackFn(config.SkipStack), 33 }) 34 } 35 36 if level, err := logrus.ParseLevel(config.Level); err == nil { 37 logger.SetLevel(level) 38 } 39 40 return logrusadapter.New(logger) 41 } 42 43 func stackFn(skip int) func(*runtime.Frame) (string, string) { 44 return func(_ *runtime.Frame) (function string, file string) { 45 pcs := callers(5) 46 frames := runtime.CallersFrames(pcs[skip : skip+1]) 47 48 frame, more := frames.Next() 49 50 if more { 51 } 52 53 return frame.Function, fmt.Sprintf("%v:%v", frame.File, frame.Line) 54 } 55 } 56 57 func callers(depth int) []uintptr { 58 const maxDepth = 32 59 var pcs [maxDepth]uintptr 60 n := runtime.Callers(2+depth, pcs[:]) 61 var st = pcs[0:n] 62 return st 63 }