From 3a7c00fc5feafdc8cd15b023113d489794bdbdcd Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Mon, 25 Nov 2024 22:50:50 +0100 Subject: [PATCH] fix crash report --- xray/log_writer.go | 18 +++++++++++++++--- xray/process.go | 5 ++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/xray/log_writer.go b/xray/log_writer.go index 1f5794a107..cc00d54173 100644 --- a/xray/log_writer.go +++ b/xray/log_writer.go @@ -16,13 +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) @@ -44,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 d79bc8b93d..fbbd28e13a 100644 --- a/xray/process.go +++ b/xray/process.go @@ -176,7 +176,6 @@ func (p *process) Start() (err error) { if err != nil { logger.Error("Failure in running xray-core: ", err) p.exitErr = err - p.witeCrachReport(err) } }() @@ -193,7 +192,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) }