From 070fd52d86451fe28ba508b211987adea7accc4f Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Sun, 10 Dec 2023 13:07:50 +0100 Subject: [PATCH] [logs] combine with xray logs #1300 --- xray/log_writer.go | 53 ++++++++++++++++++++++++++++++++++++++ xray/process.go | 64 +++++----------------------------------------- 2 files changed, 59 insertions(+), 58 deletions(-) create mode 100644 xray/log_writer.go diff --git a/xray/log_writer.go b/xray/log_writer.go new file mode 100644 index 00000000..c2f66e8f --- /dev/null +++ b/xray/log_writer.go @@ -0,0 +1,53 @@ +package xray + +import ( + "strings" + "x-ui/logger" +) + +func NewLogWriter() *LogWriter { + return &LogWriter{} +} + +type LogWriter struct { + lastLine string +} + +func (lw *LogWriter) Write(m []byte) (n int, err error) { + // Convert the data to a string + message := strings.TrimSpace(string(m)) + messages := strings.Split(message, "\n") + lw.lastLine = messages[len(messages)-1] + + for _, msg := range messages { + // Remove timestamp + messageBody := strings.TrimSpace(strings.SplitN(msg, " ", 3)[2]) + + // Find level in [] + startIndex := strings.Index(messageBody, "[") + endIndex := strings.Index(messageBody, "]") + if startIndex != -1 && endIndex != -1 { + level := strings.TrimSpace(messageBody[startIndex+1 : endIndex]) + msgBody := "XRAY: " + strings.TrimSpace(messageBody[endIndex+1:]) + + // Map the level to the appropriate logger function + switch level { + case "Debug": + logger.Debug(msgBody) + case "Info": + logger.Info(msgBody) + case "Warning": + logger.Warning(msgBody) + case "Error": + logger.Error(msgBody) + default: + logger.Debug("XRAY: " + msg) + } + } else if msg != "" { + logger.Debug("XRAY: " + msg) + return len(m), nil + } + } + + return len(m), nil +} diff --git a/xray/process.go b/xray/process.go index a3c37fd5..9289362f 100644 --- a/xray/process.go +++ b/xray/process.go @@ -1,7 +1,6 @@ package xray import ( - "bufio" "bytes" "encoding/json" "errors" @@ -10,16 +9,12 @@ import ( "os" "os/exec" "runtime" - "strings" - "sync" "syscall" "time" "x-ui/config" "x-ui/logger" "x-ui/util/common" - - "github.com/Workiva/go-datastructures/queue" ) func GetBinaryName() string { @@ -101,7 +96,7 @@ type process struct { onlineClients []string config *Config - lines *queue.Queue + logWriter *LogWriter exitErr error startTime time.Time } @@ -110,7 +105,7 @@ func newProcess(config *Config) *process { return &process{ version: "Unknown", config: config, - lines: queue.New(100), + logWriter: NewLogWriter(), startTime: time.Now(), } } @@ -130,17 +125,10 @@ func (p *process) GetErr() error { } func (p *process) GetResult() string { - if p.lines.Empty() && p.exitErr != nil { + if len(p.logWriter.lastLine) == 0 && p.exitErr != nil { return p.exitErr.Error() } - items, _ := p.lines.TakeUntil(func(item interface{}) bool { - return true - }) - lines := make([]string, 0, len(items)) - for _, item := range items { - lines = append(lines, item.(string)) - } - return strings.Join(lines, "\n") + return p.logWriter.lastLine } func (p *process) GetVersion() string { @@ -215,54 +203,14 @@ func (p *process) Start() (err error) { cmd := exec.Command(GetBinaryPath(), "-c", configPath) p.cmd = cmd - stdReader, err := cmd.StdoutPipe() - if err != nil { - return err - } - errReader, err := cmd.StderrPipe() - if err != nil { - return err - } - - var wg sync.WaitGroup - wg.Add(2) - - go func() { - defer wg.Done() - reader := bufio.NewReaderSize(stdReader, 8192) - for { - line, _, err := reader.ReadLine() - if err != nil { - return - } - if p.lines.Len() >= 100 { - p.lines.Get(1) - } - p.lines.Put(string(line)) - } - }() - - go func() { - defer wg.Done() - reader := bufio.NewReaderSize(errReader, 8192) - for { - line, _, err := reader.ReadLine() - if err != nil { - return - } - if p.lines.Len() >= 100 { - p.lines.Get(1) - } - p.lines.Put(string(line)) - } - }() + cmd.Stdout = p.logWriter + cmd.Stderr = p.logWriter go func() { err := cmd.Run() if err != nil { p.exitErr = err } - wg.Wait() }() p.refreshVersion()