fix(frpLogger): replace all logs fetching method to read corresponding file in the logsPath

This commit is contained in:
2026-06-06 14:31:42 +08:00
parent 5e9bdf02f9
commit a0634703ea
8 changed files with 113 additions and 1127 deletions
+104
View File
@@ -0,0 +1,104 @@
package frpLogger
import (
"bufio"
"fmt"
"io"
"os"
"strings"
"time"
)
func (s *InstanceLogStreamer) streamLogFile(logFilePath string) {
s.streamLogFileSince(logFilePath, time.Time{})
}
func (s *InstanceLogStreamer) streamLogFileSince(logFilePath string, sinceTime time.Time) {
s.sendInfo(fmt.Sprintf("Streaming log file: %s", logFilePath))
if _, err := os.Stat(logFilePath); os.IsNotExist(err) {
s.sendError(fmt.Sprintf("Log file not found: %s", logFilePath))
return
}
file, err := os.Open(logFilePath)
if err != nil {
s.sendError(fmt.Sprintf("Failed to open log file: %v", err))
return
}
defer file.Close()
if !sinceTime.IsZero() {
s.sendInfo(fmt.Sprintf("Filtering logs since: %s", sinceTime.Format("2006-01-02 15:04:05")))
}
s.streamLogFileFromBeginning(file, sinceTime)
}
func (s *InstanceLogStreamer) streamLogFileFromBeginning(file *os.File, sinceTime time.Time) {
reader := bufio.NewReader(file)
for {
select {
case <-s.stopChan:
s.sendInfo("Log streaming stopped")
return
default:
line, err := reader.ReadString('\n')
if err != nil {
if err == io.EOF {
time.Sleep(100 * time.Millisecond)
continue
}
s.sendError(fmt.Sprintf("Error reading log file: %v", err))
return
}
line = strings.TrimSpace(line)
if line != "" {
lineTime := s.parseLogLineTime(line)
if lineTime.IsZero() || lineTime.After(sinceTime) || lineTime.Equal(sinceTime) {
s.sendLog(s.parseLogLevel(line), line)
}
}
}
}
}
func (s *InstanceLogStreamer) parseLogLineTime(line string) time.Time {
layouts := []string{
"2006/01/02 15:04:05",
"2006-01-02 15:04:05",
"2006-01-02T15:04:05",
time.RFC3339,
time.RFC3339Nano,
}
for _, layout := range layouts {
minLen := len(layout)
if len(line) >= minLen {
t, err := time.Parse(layout, strings.TrimSpace(line[:minLen]))
if err == nil {
return t
}
}
}
return time.Time{}
}
func (s *InstanceLogStreamer) parseLogLevel(line string) string {
lowerLine := strings.ToLower(line)
if strings.Contains(lowerLine, "error") || strings.Contains(lowerLine, "err") {
return "ERROR"
}
if strings.Contains(lowerLine, "warn") || strings.Contains(lowerLine, "warning") {
return "WARN"
}
if strings.Contains(lowerLine, "debug") {
return "DEBUG"
}
if strings.Contains(lowerLine, "info") {
return "INFO"
}
return "INFO"
}