| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | package logimport (	"fmt"	"io"	"log"	"os")const (	LevelError uint8 = iota	LevelWarning	LevelInfo	LevelDebug)const (	Flag = log.LstdFlags | log.Llongfile		callDepth = 2)const (	prefixDebug   = "[D] "	prefixInfo    = "[I] "	prefixWarning = "[W] "	prefixError   = "[E] ")var (	console      bool	defaultLevel uint8	closer       io.Closer)var (	socketDebug   = log.New(os.Stdout, prefixDebug, Flag)	socketInfo    = log.New(os.Stdout, prefixInfo, Flag)	socketWarning = log.New(os.Stderr, prefixWarning, Flag)	socketError   = log.New(os.Stderr, prefixError, Flag))func SetLevel(level uint8) {	defaultLevel = level}func SetOutput(primary, err io.WriteCloser) {	lw := &loggerWrite{		primary: primary,		err:     err,	}	socketDebug.SetOutput(lw)	socketInfo.SetOutput(lw)	socketWarning.SetOutput(lw)	socketError.SetOutput(lw)	closer = lw}func SetConsole(r bool) {	console = r}func Close() error {	if closer == nil {		return nil	}	return closer.Close()}func Debug(f string, v ...any) {	if defaultLevel < LevelDebug {		return	}	_ = socketDebug.Output(callDepth, fmt.Sprintf(f, v...))}func Info(f string, v ...any) {	if defaultLevel < LevelInfo {		return	}	_ = socketInfo.Output(callDepth, fmt.Sprintf(f, v...))}func Warning(f string, v ...any) {	if defaultLevel < LevelWarning {		return	}	_ = socketWarning.Output(callDepth, fmt.Sprintf(f, v...))}func Error(f string, v ...any) {	if defaultLevel < LevelError {		return	}	_ = socketError.Output(callDepth, fmt.Sprintf(f, v...))}func Panic(f string, v ...any) {	s := fmt.Sprintf(f, v...)	_ = socketError.Output(callDepth, s)	_ = Close()	panic(s)}func Fatal(f string, v ...any) {	_ = socketError.Output(callDepth, fmt.Sprintf(f, v...))	_ = Close()	os.Exit(1)}type loggerWrite struct {	closed  bool	primary io.WriteCloser	err     io.WriteCloser}func (l *loggerWrite) Write(p []byte) (n int, err error) {	if l.closed {		return 0, nil	}	if console {		_, _ = os.Stdout.Write(p)	}		n, err = l.primary.Write(p)		level := string(p[:4])	if level == prefixWarning || level == prefixError {		n, err = l.err.Write(p)	}	return}func (l *loggerWrite) Close() error {	if l.closed {		return nil	}	_ = l.primary.Close()	_ = l.err.Close()	return nil}func init() {	console = true	defaultLevel = LevelDebug}
 |