From 4c4cc362b37f6c23ab3a79651d0c0e67cc70974d Mon Sep 17 00:00:00 2001 From: mhsanaei Date: Tue, 3 Dec 2024 23:07:24 +0100 Subject: [PATCH] fix crash report Co-Authored-By: Alireza Ahmadi --- xray/log_writer.go | 20 +++++++++++++++++--- xray/process.go | 5 ++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/xray/log_writer.go b/xray/log_writer.go index c8d966b58d..cc00d54173 100644 --- a/xray/log_writer.go +++ b/xray/log_writer.go @@ -16,11 +16,24 @@ type LogWriter struct { } func (lw *LogWriter) Write(m []byte) (n int, err error) { - regex := regexp.MustCompile(`^(\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[([^\]]+)\] (.+)$`) + crashRegex := regexp.MustCompile(`(?i)(panic|exception|stack trace|fatal error)`) + // Convert the data to a string message := strings.TrimSpace(string(m)) + + // Check if the message contains a crash + if crashRegex.MatchString(message) { + logger.Debug("Core crash detected:\n", message) + lw.lastLine = message + err1 := writeCrachReport(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}) \[([^\]]+)\] (.+)$`) messages := strings.Split(message, "\n") - lw.lastLine = messages[len(messages)-1] for _, msg := range messages { matches := regex.FindStringSubmatch(msg) @@ -42,9 +55,10 @@ func (lw *LogWriter) Write(m []byte) (n int, err error) { default: logger.Debug("XRAY: " + msg) } + lw.lastLine = "" } else if msg != "" { logger.Debug("XRAY: " + msg) - return len(m), nil + lw.lastLine = msg } } diff --git a/xray/process.go b/xray/process.go index 58d14a1f5d..b4947864ca 100644 --- a/xray/process.go +++ b/xray/process.go @@ -226,7 +226,6 @@ func (p *process) Start() (err error) { if err != nil { logger.Error("Failure in running xray-core:", err) p.exitErr = err - p.witeCrachReport(err) } }() @@ -243,7 +242,7 @@ func (p *process) Stop() error { return p.cmd.Process.Signal(syscall.SIGTERM) } -func (p *process) witeCrachReport(err error) error { +func writeCrachReport(m []byte) error { crashReportPath := config.GetBinFolderPath() + "/core_crash_" + time.Now().Format("20060102_150405") + ".log" - return os.WriteFile(crashReportPath, []byte(err.Error()), os.ModePerm) + return os.WriteFile(crashReportPath, m, os.ModePerm) }