| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | package log//go:generate go run $GOPATH/src/v2ray.com/core/common/errors/errorgen/main.go -pkg log -path App,Logimport (	"context"	"v2ray.com/core/app"	"v2ray.com/core/app/log/internal"	"v2ray.com/core/common"	"v2ray.com/core/common/errors"	"v2ray.com/core/common/log")var (	streamLoggerInstance internal.LogWriter = internal.NewStdOutLogWriter()	debugLogger   internal.LogWriter = streamLoggerInstance	infoLogger    internal.LogWriter = streamLoggerInstance	warningLogger internal.LogWriter = streamLoggerInstance	errorLogger   internal.LogWriter = streamLoggerInstance)func SetLogLevel(level LogLevel) {	debugLogger = new(internal.NoOpLogWriter)	if level >= LogLevel_Debug {		debugLogger = streamLoggerInstance	}	infoLogger = new(internal.NoOpLogWriter)	if level >= LogLevel_Info {		infoLogger = streamLoggerInstance	}	warningLogger = new(internal.NoOpLogWriter)	if level >= LogLevel_Warning {		warningLogger = streamLoggerInstance	}	errorLogger = new(internal.NoOpLogWriter)	if level >= LogLevel_Error {		errorLogger = streamLoggerInstance	}}func InitErrorLogger(file string) error {	logger, err := internal.NewFileLogWriter(file)	if err != nil {		return newError("failed to create error logger on file (", file, ")").Base(err)	}	streamLoggerInstance = logger	return nil}func getLoggerAndPrefix(s log.Severity) (internal.LogWriter, string) {	switch s {	case log.Severity_Debug:		return debugLogger, "[Debug]"	case log.Severity_Info:		return infoLogger, "[Info]"	case log.Severity_Warning:		return warningLogger, "[Warning]"	case log.Severity_Error:		return errorLogger, "[Error]"	default:		return infoLogger, "[Info]"	}}// Trace logs an error message based on its severity.func Trace(err error) {	if err == nil {		return	}	logger, prefix := getLoggerAndPrefix(errors.GetSeverity(err))	logger.Log(&internal.ErrorLog{		Prefix: prefix,		Error:  err,	})}type Instance struct {	config *Config}func New(ctx context.Context, config *Config) (*Instance, error) {	return &Instance{config: config}, nil}func (*Instance) Interface() interface{} {	return (*Instance)(nil)}func (g *Instance) Start() error {	config := g.config	if config.AccessLogType == LogType_File {		if err := InitAccessLogger(config.AccessLogPath); err != nil {			return err		}	}	if config.ErrorLogType == LogType_None {		SetLogLevel(LogLevel_Disabled)	} else {		if config.ErrorLogType == LogType_File {			if err := InitErrorLogger(config.ErrorLogPath); err != nil {				return err			}		}		SetLogLevel(config.ErrorLogLevel)	}	return nil}func (*Instance) Close() {	streamLoggerInstance.Close()	accessLoggerInstance.Close()}func FromSpace(space app.Space) *Instance {	v := space.GetApplication((*Instance)(nil))	if logger, ok := v.(*Instance); ok && logger != nil {		return logger	}	return nil}func init() {	common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {		return New(ctx, config.(*Config))	}))}
 |