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