forked from toolshed/abra
		
	We were running behind and there were quite some deprecations to update. This was mostly in the upstream copy/pasta package but seems quite minimal.
		
			
				
	
	
		
			250 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			250 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package log
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"sync"
 | |
| 	"sync/atomic"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/muesli/termenv"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	// registry is a map of all registered lipgloss renderers.
 | |
| 	registry = sync.Map{}
 | |
| 
 | |
| 	// defaultLogger is the default global logger instance.
 | |
| 	defaultLogger     atomic.Pointer[Logger]
 | |
| 	defaultLoggerOnce sync.Once
 | |
| )
 | |
| 
 | |
| // Default returns the default logger. The default logger comes with timestamp enabled.
 | |
| func Default() *Logger {
 | |
| 	dl := defaultLogger.Load()
 | |
| 	if dl == nil {
 | |
| 		defaultLoggerOnce.Do(func() {
 | |
| 			defaultLogger.CompareAndSwap(
 | |
| 				nil, NewWithOptions(os.Stderr, Options{ReportTimestamp: true}),
 | |
| 			)
 | |
| 		})
 | |
| 		dl = defaultLogger.Load()
 | |
| 	}
 | |
| 	return dl
 | |
| }
 | |
| 
 | |
| // SetDefault sets the default global logger.
 | |
| func SetDefault(logger *Logger) {
 | |
| 	defaultLogger.Store(logger)
 | |
| }
 | |
| 
 | |
| // New returns a new logger with the default options.
 | |
| func New(w io.Writer) *Logger {
 | |
| 	return NewWithOptions(w, Options{})
 | |
| }
 | |
| 
 | |
| // NewWithOptions returns a new logger using the provided options.
 | |
| func NewWithOptions(w io.Writer, o Options) *Logger {
 | |
| 	l := &Logger{
 | |
| 		b:               bytes.Buffer{},
 | |
| 		mu:              &sync.RWMutex{},
 | |
| 		helpers:         &sync.Map{},
 | |
| 		level:           int64(o.Level),
 | |
| 		reportTimestamp: o.ReportTimestamp,
 | |
| 		reportCaller:    o.ReportCaller,
 | |
| 		prefix:          o.Prefix,
 | |
| 		timeFunc:        o.TimeFunction,
 | |
| 		timeFormat:      o.TimeFormat,
 | |
| 		formatter:       o.Formatter,
 | |
| 		fields:          o.Fields,
 | |
| 		callerFormatter: o.CallerFormatter,
 | |
| 		callerOffset:    o.CallerOffset,
 | |
| 	}
 | |
| 
 | |
| 	l.SetOutput(w)
 | |
| 	l.SetLevel(Level(l.level))
 | |
| 	l.SetStyles(DefaultStyles())
 | |
| 
 | |
| 	if l.callerFormatter == nil {
 | |
| 		l.callerFormatter = ShortCallerFormatter
 | |
| 	}
 | |
| 
 | |
| 	if l.timeFunc == nil {
 | |
| 		l.timeFunc = func(t time.Time) time.Time { return t }
 | |
| 	}
 | |
| 
 | |
| 	if l.timeFormat == "" {
 | |
| 		l.timeFormat = DefaultTimeFormat
 | |
| 	}
 | |
| 
 | |
| 	return l
 | |
| }
 | |
| 
 | |
| // SetReportTimestamp sets whether to report timestamp for the default logger.
 | |
| func SetReportTimestamp(report bool) {
 | |
| 	Default().SetReportTimestamp(report)
 | |
| }
 | |
| 
 | |
| // SetReportCaller sets whether to report caller location for the default logger.
 | |
| func SetReportCaller(report bool) {
 | |
| 	Default().SetReportCaller(report)
 | |
| }
 | |
| 
 | |
| // SetLevel sets the level for the default logger.
 | |
| func SetLevel(level Level) {
 | |
| 	Default().SetLevel(level)
 | |
| }
 | |
| 
 | |
| // GetLevel returns the level for the default logger.
 | |
| func GetLevel() Level {
 | |
| 	return Default().GetLevel()
 | |
| }
 | |
| 
 | |
| // SetTimeFormat sets the time format for the default logger.
 | |
| func SetTimeFormat(format string) {
 | |
| 	Default().SetTimeFormat(format)
 | |
| }
 | |
| 
 | |
| // SetTimeFunction sets the time function for the default logger.
 | |
| func SetTimeFunction(f TimeFunction) {
 | |
| 	Default().SetTimeFunction(f)
 | |
| }
 | |
| 
 | |
| // SetOutput sets the output for the default logger.
 | |
| func SetOutput(w io.Writer) {
 | |
| 	Default().SetOutput(w)
 | |
| }
 | |
| 
 | |
| // SetFormatter sets the formatter for the default logger.
 | |
| func SetFormatter(f Formatter) {
 | |
| 	Default().SetFormatter(f)
 | |
| }
 | |
| 
 | |
| // SetCallerFormatter sets the caller formatter for the default logger.
 | |
| func SetCallerFormatter(f CallerFormatter) {
 | |
| 	Default().SetCallerFormatter(f)
 | |
| }
 | |
| 
 | |
| // SetCallerOffset sets the caller offset for the default logger.
 | |
| func SetCallerOffset(offset int) {
 | |
| 	Default().SetCallerOffset(offset)
 | |
| }
 | |
| 
 | |
| // SetPrefix sets the prefix for the default logger.
 | |
| func SetPrefix(prefix string) {
 | |
| 	Default().SetPrefix(prefix)
 | |
| }
 | |
| 
 | |
| // SetColorProfile force sets the underlying Lip Gloss renderer color profile
 | |
| // for the TextFormatter.
 | |
| func SetColorProfile(profile termenv.Profile) {
 | |
| 	Default().SetColorProfile(profile)
 | |
| }
 | |
| 
 | |
| // SetStyles sets the logger styles for the TextFormatter.
 | |
| func SetStyles(s *Styles) {
 | |
| 	Default().SetStyles(s)
 | |
| }
 | |
| 
 | |
| // GetPrefix returns the prefix for the default logger.
 | |
| func GetPrefix() string {
 | |
| 	return Default().GetPrefix()
 | |
| }
 | |
| 
 | |
| // With returns a new logger with the given keyvals.
 | |
| func With(keyvals ...interface{}) *Logger {
 | |
| 	return Default().With(keyvals...)
 | |
| }
 | |
| 
 | |
| // WithPrefix returns a new logger with the given prefix.
 | |
| func WithPrefix(prefix string) *Logger {
 | |
| 	return Default().WithPrefix(prefix)
 | |
| }
 | |
| 
 | |
| // Helper marks the calling function as a helper
 | |
| // and skips it for source location information.
 | |
| // It's the equivalent of testing.TB.Helper().
 | |
| func Helper() {
 | |
| 	Default().helper(1)
 | |
| }
 | |
| 
 | |
| // Log logs a message with the given level.
 | |
| func Log(level Level, msg interface{}, keyvals ...interface{}) {
 | |
| 	Default().Log(level, msg, keyvals...)
 | |
| }
 | |
| 
 | |
| // Debug logs a debug message.
 | |
| func Debug(msg interface{}, keyvals ...interface{}) {
 | |
| 	Default().Log(DebugLevel, msg, keyvals...)
 | |
| }
 | |
| 
 | |
| // Info logs an info message.
 | |
| func Info(msg interface{}, keyvals ...interface{}) {
 | |
| 	Default().Log(InfoLevel, msg, keyvals...)
 | |
| }
 | |
| 
 | |
| // Warn logs a warning message.
 | |
| func Warn(msg interface{}, keyvals ...interface{}) {
 | |
| 	Default().Log(WarnLevel, msg, keyvals...)
 | |
| }
 | |
| 
 | |
| // Error logs an error message.
 | |
| func Error(msg interface{}, keyvals ...interface{}) {
 | |
| 	Default().Log(ErrorLevel, msg, keyvals...)
 | |
| }
 | |
| 
 | |
| // Fatal logs a fatal message and exit.
 | |
| func Fatal(msg interface{}, keyvals ...interface{}) {
 | |
| 	Default().Log(FatalLevel, msg, keyvals...)
 | |
| 	os.Exit(1)
 | |
| }
 | |
| 
 | |
| // Print logs a message with no level.
 | |
| func Print(msg interface{}, keyvals ...interface{}) {
 | |
| 	Default().Log(noLevel, msg, keyvals...)
 | |
| }
 | |
| 
 | |
| // Logf logs a message with formatting and level.
 | |
| func Logf(level Level, format string, args ...interface{}) {
 | |
| 	Default().Logf(level, format, args...)
 | |
| }
 | |
| 
 | |
| // Debugf logs a debug message with formatting.
 | |
| func Debugf(format string, args ...interface{}) {
 | |
| 	Default().Log(DebugLevel, fmt.Sprintf(format, args...))
 | |
| }
 | |
| 
 | |
| // Infof logs an info message with formatting.
 | |
| func Infof(format string, args ...interface{}) {
 | |
| 	Default().Log(InfoLevel, fmt.Sprintf(format, args...))
 | |
| }
 | |
| 
 | |
| // Warnf logs a warning message with formatting.
 | |
| func Warnf(format string, args ...interface{}) {
 | |
| 	Default().Log(WarnLevel, fmt.Sprintf(format, args...))
 | |
| }
 | |
| 
 | |
| // Errorf logs an error message with formatting.
 | |
| func Errorf(format string, args ...interface{}) {
 | |
| 	Default().Log(ErrorLevel, fmt.Sprintf(format, args...))
 | |
| }
 | |
| 
 | |
| // Fatalf logs a fatal message with formatting and exit.
 | |
| func Fatalf(format string, args ...interface{}) {
 | |
| 	Default().Log(FatalLevel, fmt.Sprintf(format, args...))
 | |
| 	os.Exit(1)
 | |
| }
 | |
| 
 | |
| // Printf logs a message with formatting and no level.
 | |
| func Printf(format string, args ...interface{}) {
 | |
| 	Default().Log(noLevel, fmt.Sprintf(format, args...))
 | |
| }
 | |
| 
 | |
| // StandardLog returns a standard logger from the default logger.
 | |
| func StandardLog(opts ...StandardLogOptions) *log.Logger {
 | |
| 	return Default().StandardLog(opts...)
 | |
| }
 |