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  }