| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 | package logimport (	"fmt"	"github.com/v2ray/v2ray-core/common"	"github.com/v2ray/v2ray-core/common/serial")const (	DebugLevel   = LogLevel(0)	InfoLevel    = LogLevel(1)	WarningLevel = LogLevel(2)	ErrorLevel   = LogLevel(3)	NoneLevel    = LogLevel(999))type LogEntry interface {	common.Releasable	serial.String}type errorLog struct {	prefix string	values []interface{}}func (this *errorLog) Release() {	for index := range this.values {		this.values[index] = nil	}	this.values = nil}func (this *errorLog) String() string {	data := ""	for _, value := range this.values {		switch typedVal := value.(type) {		case string:			data += typedVal		case *string:			data += *typedVal		case serial.String:			data += typedVal.String()		case error:			data += typedVal.Error()		default:			data += fmt.Sprintf("%v", value)		}	}	return this.prefix + data}var (	noOpLoggerInstance   logWriter = &noOpLogWriter{}	streamLoggerInstance logWriter = newStdOutLogWriter()	debugLogger   = noOpLoggerInstance	infoLogger    = noOpLoggerInstance	warningLogger = streamLoggerInstance	errorLogger   = streamLoggerInstance)type LogLevel intfunc SetLogLevel(level LogLevel) {	debugLogger = noOpLoggerInstance	if level <= DebugLevel {		debugLogger = streamLoggerInstance	}	infoLogger = noOpLoggerInstance	if level <= InfoLevel {		infoLogger = streamLoggerInstance	}	warningLogger = noOpLoggerInstance	if level <= WarningLevel {		warningLogger = streamLoggerInstance	}	errorLogger = noOpLoggerInstance	if level <= ErrorLevel {		errorLogger = streamLoggerInstance	}}func InitErrorLogger(file string) error {	logger, err := newFileLogWriter(file)	if err != nil {		Error("Failed to create error logger on file (", file, "): ", err)		return err	}	streamLoggerInstance = logger	return nil}// Debug outputs a debug log with given format and optional arguments.func Debug(v ...interface{}) {	debugLogger.Log(&errorLog{		prefix: "[Debug]",		values: v,	})}// Info outputs an info log with given format and optional arguments.func Info(v ...interface{}) {	infoLogger.Log(&errorLog{		prefix: "[Info]",		values: v,	})}// Warning outputs a warning log with given format and optional arguments.func Warning(v ...interface{}) {	warningLogger.Log(&errorLog{		prefix: "[Warning]",		values: v,	})}// Error outputs an error log with given format and optional arguments.func Error(v ...interface{}) {	errorLogger.Log(&errorLog{		prefix: "[Error]",		values: v,	})}
 |