|  | @@ -1,6 +1,7 @@
 | 
	
		
			
				|  |  |  package xray
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  | +	"regexp"
 | 
	
		
			
				|  |  |  	"strings"
 | 
	
		
			
				|  |  |  	"x-ui/logger"
 | 
	
		
			
				|  |  |  )
 | 
	
	
		
			
				|  | @@ -14,26 +15,18 @@ 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}) \[([^\]]+)\] (.+)$`)
 | 
	
		
			
				|  |  |  	// 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 {
 | 
	
		
			
				|  |  | -		messageBody := msg
 | 
	
		
			
				|  |  | +		matches := regex.FindStringSubmatch(msg)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		// Remove timestamp
 | 
	
		
			
				|  |  | -		splittedMsg := strings.SplitN(msg, " ", 3)
 | 
	
		
			
				|  |  | -		if len(splittedMsg) > 2 {
 | 
	
		
			
				|  |  | -			messageBody = strings.TrimSpace(strings.SplitN(msg, " ", 3)[2])
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		// Find level in []
 | 
	
		
			
				|  |  | -		startIndex := strings.Index(messageBody, "[")
 | 
	
		
			
				|  |  | -		endIndex := strings.Index(messageBody, "]")
 | 
	
		
			
				|  |  | -		if startIndex != -1 && endIndex != -1 && startIndex < endIndex {
 | 
	
		
			
				|  |  | -			level := strings.TrimSpace(messageBody[startIndex+1 : endIndex])
 | 
	
		
			
				|  |  | -			msgBody := "XRAY: " + strings.TrimSpace(messageBody[endIndex+1:])
 | 
	
		
			
				|  |  | +		if len(matches) > 3 {
 | 
	
		
			
				|  |  | +			level := matches[2]
 | 
	
		
			
				|  |  | +			msgBody := matches[3]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  			// Map the level to the appropriate logger function
 | 
	
		
			
				|  |  |  			switch level {
 |