You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.3 KiB
85 lines
1.3 KiB
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"io"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type logLine struct {
|
|
Verb string
|
|
Args []string
|
|
Text string
|
|
}
|
|
|
|
func parseFile(reader io.Reader) []logLine {
|
|
bufReader := bufio.NewReader(reader)
|
|
results := make([]logLine, 0, 512)
|
|
|
|
for {
|
|
line, err := bufReader.ReadString('\n')
|
|
if err == io.EOF {
|
|
if len(line) < 2 {
|
|
break
|
|
}
|
|
} else if err != nil {
|
|
break
|
|
}
|
|
|
|
if len(line) <= 2 {
|
|
continue
|
|
}
|
|
|
|
line = strings.Replace(line, "\n", "", 1)
|
|
line = strings.Replace(line, "\r", "", 1)
|
|
|
|
results = append(results, parseLine(line))
|
|
}
|
|
|
|
return results
|
|
}
|
|
|
|
func parseLine(line string) logLine {
|
|
textSplit := strings.SplitN(line, " :", 2)
|
|
tokens := strings.Split(textSplit[0], " ")
|
|
|
|
ll := logLine{
|
|
Verb: tokens[0],
|
|
}
|
|
|
|
if len(tokens) > 1 {
|
|
ll.Args = tokens[1:]
|
|
}
|
|
|
|
if len(textSplit) > 1 {
|
|
ll.Text = textSplit[1]
|
|
}
|
|
|
|
return ll
|
|
}
|
|
|
|
func parseFilename(fname string) (date time.Time, channel string, err error) {
|
|
date, err = time.ParseInLocation("2006-01-02_150405", fname[:17], time.Local)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
ms, err := strconv.Atoi(fname[17:20])
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
date = date.Add(time.Duration(ms) * time.Millisecond)
|
|
|
|
if len(fname) < 23 {
|
|
err = errors.New("filename too short")
|
|
return
|
|
}
|
|
|
|
channel = fname[21:]
|
|
|
|
return
|
|
}
|