1
0

log_writer.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package xray
  2. import (
  3. "regexp"
  4. "strings"
  5. "x-ui/logger"
  6. )
  7. func NewLogWriter() *LogWriter {
  8. return &LogWriter{}
  9. }
  10. type LogWriter struct {
  11. lastLine string
  12. }
  13. func (lw *LogWriter) Write(m []byte) (n int, err error) {
  14. crashRegex := regexp.MustCompile(`(?i)(panic|exception|stack trace|fatal error)`)
  15. // Convert the data to a string
  16. message := strings.TrimSpace(string(m))
  17. // Check if the message contains a crash
  18. if crashRegex.MatchString(message) {
  19. logger.Debug("Core crash detected:\n", message)
  20. lw.lastLine = message
  21. err1 := writeCrachReport(m)
  22. if err1 != nil {
  23. logger.Error("Unable to write crash report:", err1)
  24. }
  25. return len(m), nil
  26. }
  27. regex := regexp.MustCompile(`^(\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}\.\d{6}) \[([^\]]+)\] (.+)$`)
  28. messages := strings.SplitSeq(message, "\n")
  29. for msg := range messages {
  30. matches := regex.FindStringSubmatch(msg)
  31. if len(matches) > 3 {
  32. level := matches[2]
  33. msgBody := matches[3]
  34. if strings.Contains(strings.ToLower(msgBody), "failed") {
  35. logger.Error("XRAY: " + msgBody)
  36. } else {
  37. switch level {
  38. case "Debug":
  39. logger.Debug("XRAY: " + msgBody)
  40. case "Info":
  41. logger.Info("XRAY: " + msgBody)
  42. case "Warning":
  43. logger.Warning("XRAY: " + msgBody)
  44. case "Error":
  45. logger.Error("XRAY: " + msgBody)
  46. default:
  47. logger.Debug("XRAY: " + msg)
  48. }
  49. }
  50. lw.lastLine = ""
  51. } else if msg != "" {
  52. if strings.Contains(strings.ToLower(msg), "failed") {
  53. logger.Error("XRAY: " + msg)
  54. } else {
  55. logger.Debug("XRAY: " + msg)
  56. }
  57. lw.lastLine = msg
  58. }
  59. }
  60. return len(m), nil
  61. }