@@ -4,11 +4,18 @@ import (
44 "bufio"
55 "bytes"
66 "fmt"
7+ "io"
78 "os"
89
910 tea "github.com/charmbracelet/bubbletea"
1011)
1112
13+ const (
14+ maxLineSize = 8 * 1024 * 1024
15+
16+ logEntriesEstimateNumber = 256
17+ )
18+
1219// LoadLogsFromFile loads json log entries from file.
1320func LoadLogsFromFile (path string ) func () tea.Msg {
1421 return func () (msg tea.Msg ) {
@@ -19,22 +26,33 @@ func LoadLogsFromFile(path string) func() tea.Msg {
1926
2027 defer file .Close ()
2128
22- scanner := bufio .NewScanner (file )
29+ logEntries , err := parseLogEntriesFromReader (file )
30+ if err != nil {
31+ return fmt .Errorf ("parsing from reader: %w" , err )
32+ }
2333
24- logEntries := make (LogEntries , 0 , 256 )
34+ return logEntries .Reverse ()
35+ }
36+ }
2537
26- for scanner .Scan () {
27- line := scanner .Bytes ()
38+ func parseLogEntriesFromReader (reader io.Reader ) (LogEntries , error ) {
39+ bufReader := bufio .NewReaderSize (reader , maxLineSize )
40+ logEntries := make (LogEntries , 0 , logEntriesEstimateNumber )
2841
29- if len (bytes .TrimSpace (line )) > 0 {
30- logEntries = append (logEntries , ParseLogEntry (line ))
42+ for {
43+ line , _ , err := bufReader .ReadLine ()
44+ if err != nil {
45+ if err == io .EOF {
46+ break
3147 }
32- }
3348
34- if err := scanner .Err (); err != nil {
35- return fmt .Errorf ("scanning: %w" , err )
49+ return nil , fmt .Errorf ("reading line: %w" , err )
3650 }
3751
38- return logEntries .Reverse ()
52+ if len (bytes .TrimSpace (line )) > 0 {
53+ logEntries = append (logEntries , ParseLogEntry (line ))
54+ }
3955 }
56+
57+ return logEntries , nil
4058}
0 commit comments