mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-05 20:54:14 +00:00
- Update go.mod module path from mhsanaei/3x-ui/v3 to saeederamy/3x-ui/v3 - Update all 73 Go files' import paths accordingly - Fix README.fa_IR.md install command to point to fork's main branch The fork was referencing the original repo's module path in go.mod and all Go source imports, making it dependent on MHSanaei's namespace at build time. https://claude.ai/code/session_01M6d5atbWjuLTj6UwRHoK5m
100 lines
2.5 KiB
Go
100 lines
2.5 KiB
Go
package xray
|
|
|
|
import (
|
|
"regexp"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/saeederamy/3x-ui/v3/logger"
|
|
)
|
|
|
|
// NewLogWriter returns a new LogWriter for processing Xray log output.
|
|
func NewLogWriter() *LogWriter {
|
|
return &LogWriter{}
|
|
}
|
|
|
|
// LogWriter processes and filters log output from the Xray process, handling crash detection and message filtering.
|
|
type LogWriter struct {
|
|
lastLine string
|
|
}
|
|
|
|
// Write processes and filters log output from the Xray process, handling crash detection and message filtering.
|
|
func (lw *LogWriter) Write(m []byte) (n int, err error) {
|
|
crashRegex := regexp.MustCompile(`(?i)(panic|exception|stack trace|fatal error)`)
|
|
|
|
// Convert the data to a string
|
|
message := strings.TrimSpace(string(m))
|
|
msgLowerAll := strings.ToLower(message)
|
|
|
|
// Suppress noisy Windows process-kill signal that surfaces as exit status 1
|
|
if runtime.GOOS == "windows" && strings.Contains(msgLowerAll, "exit status 1") {
|
|
return len(m), nil
|
|
}
|
|
|
|
// Check if the message contains a crash
|
|
if crashRegex.MatchString(message) {
|
|
logger.Debug("Core crash detected:\n", message)
|
|
lw.lastLine = message
|
|
err1 := writeCrashReport(m)
|
|
if err1 != nil {
|
|
logger.Error("Unable to write crash report:", err1)
|
|
}
|
|
return len(m), nil
|
|
}
|
|
|
|
regex := regexp.MustCompile(`^(\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\.\d{6}) \[([^\]]+)\] (.+)$`)
|
|
messages := strings.SplitSeq(message, "\n")
|
|
|
|
for msg := range messages {
|
|
matches := regex.FindStringSubmatch(msg)
|
|
|
|
if len(matches) > 3 {
|
|
level := matches[2]
|
|
msgBody := matches[3]
|
|
msgBodyLower := strings.ToLower(msgBody)
|
|
|
|
if strings.Contains(msgBodyLower, "tls handshake error") ||
|
|
strings.Contains(msgBodyLower, "connection ends") {
|
|
logger.Debug("XRAY: " + msgBody)
|
|
lw.lastLine = ""
|
|
continue
|
|
}
|
|
|
|
if strings.Contains(msgBodyLower, "failed") {
|
|
logger.Error("XRAY: " + msgBody)
|
|
} else {
|
|
switch level {
|
|
case "Debug":
|
|
logger.Debug("XRAY: " + msgBody)
|
|
case "Info":
|
|
logger.Info("XRAY: " + msgBody)
|
|
case "Warning":
|
|
logger.Warning("XRAY: " + msgBody)
|
|
case "Error":
|
|
logger.Error("XRAY: " + msgBody)
|
|
default:
|
|
logger.Debug("XRAY: " + msg)
|
|
}
|
|
}
|
|
lw.lastLine = ""
|
|
} else if msg != "" {
|
|
msgLower := strings.ToLower(msg)
|
|
|
|
if strings.Contains(msgLower, "tls handshake error") ||
|
|
strings.Contains(msgLower, "connection ends") {
|
|
logger.Debug("XRAY: " + msg)
|
|
lw.lastLine = msg
|
|
continue
|
|
}
|
|
|
|
if strings.Contains(msgLower, "failed") {
|
|
logger.Error("XRAY: " + msg)
|
|
} else {
|
|
logger.Debug("XRAY: " + msg)
|
|
}
|
|
lw.lastLine = msg
|
|
}
|
|
}
|
|
|
|
return len(m), nil
|
|
}
|