1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
// SPDX-License-Identifier: GPL-3.0-or-later
package squidlog
import (
"fmt"
"strings"
"github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/logs"
)
func (s *SquidLog) createLogReader() error {
s.Cleanup()
s.Debug("starting log reader creating")
reader, err := logs.Open(s.Path, s.ExcludePath, s.Logger)
if err != nil {
return fmt.Errorf("creating log reader: %v", err)
}
s.Debugf("created log reader, current file '%s'", reader.CurrentFilename())
s.file = reader
return nil
}
func (s *SquidLog) createParser() error {
s.Debug("starting parser creating")
const readLastLinesNum = 100
lines, err := logs.ReadLastLines(s.file.CurrentFilename(), readLastLinesNum)
if err != nil {
return fmt.Errorf("failed to read last lines: %v", err)
}
var found bool
for _, line := range lines {
if line = strings.TrimSpace(line); line == "" {
continue
}
s.Debugf("last line: '%s'", line)
s.parser, err = logs.NewParser(s.ParserConfig, s.file)
if err != nil {
s.Debugf("failed to create parser from line: %v", err)
continue
}
s.line.reset()
if err = s.parser.Parse([]byte(line), s.line); err != nil {
s.Debugf("failed to parse line: %v", err)
continue
}
if err = s.line.verify(); err != nil {
s.Debugf("failed to verify line: %v", err)
continue
}
found = true
break
}
if !found {
return fmt.Errorf("failed to create log parser (file '%s')", s.file.CurrentFilename())
}
return nil
}
func checkCSVFormatField(name string) (newName string, offset int, valid bool) {
name = cleanField(name)
if !knownField(name) {
return "", 0, false
}
return name, 0, true
}
func cleanField(name string) string {
return strings.TrimLeft(name, "$%")
}
func knownField(name string) bool {
switch name {
case fieldRespTime, fieldClientAddr, fieldCacheCode, fieldHTTPCode, fieldRespSize, fieldReqMethod:
fallthrough
case fieldHierCode, fieldServerAddr, fieldMimeType, fieldResultCode, fieldHierarchy:
return true
}
return false
}
|