Skip to content

Commit d8dcbda

Browse files
authored
feat: support symlink file detect (#5)
* feat: support symlink file detect * fix: add point nil check * fix: remove no use func * fix: use setting error
1 parent b62994e commit d8dcbda

File tree

3 files changed

+41
-14
lines changed

3 files changed

+41
-14
lines changed

lib/reader/harvester/harvester.go

+12-13
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ import (
88
"fmt"
99
"io"
1010
"os"
11-
"strings"
1211

1312
"infini.sh/agent/lib/reader"
1413
"infini.sh/agent/lib/reader/linenumber"
1514
"infini.sh/agent/lib/reader/multiline"
1615
"infini.sh/agent/lib/reader/readfile"
1716
"infini.sh/agent/lib/reader/readfile/encoding"
1817
"infini.sh/agent/lib/reader/readjson"
18+
"infini.sh/framework/core/errors"
1919
)
2020

2121
type Harvester struct {
@@ -30,8 +30,8 @@ type Harvester struct {
3030

3131
func NewHarvester(path string, offset int64) (*Harvester, error) {
3232
f, err := readOpen(path)
33-
if err != nil {
34-
return nil, err
33+
if f == nil || err != nil {
34+
return nil, errors.Errorf("failed to open file(%s),%v", path, err)
3535
}
3636
_, err = f.Seek(offset, io.SeekStart)
3737
if err != nil {
@@ -48,6 +48,9 @@ func NewHarvester(path string, offset int64) (*Harvester, error) {
4848
}
4949
h.encodingFactory = encodingFactory
5050
h.encoding, err = h.encodingFactory(f)
51+
if err != nil {
52+
return nil, err
53+
}
5154
return h, nil
5255
}
5356

@@ -60,6 +63,9 @@ func readOpen(path string) (*os.File, error) {
6063
func (h *Harvester) NewJsonFileReader(pattern string, showLineNumber bool) (reader.Reader, error) {
6164
var r reader.Reader
6265
var err error
66+
if h == nil || h.file == nil {
67+
return nil, fmt.Errorf("file is nil")
68+
}
6369

6470
encReaderMaxBytes := h.config.MaxBytes * 4
6571
r, err = readfile.NewEncodeReader(h.file, readfile.Config{
@@ -97,6 +103,9 @@ func (h *Harvester) NewLogFileReader(pattern string, showLineNumber bool) (reade
97103
var r reader.Reader
98104
var err error
99105

106+
if h == nil || h.file == nil {
107+
return nil, fmt.Errorf("file is nil")
108+
}
100109
encReaderMaxBytes := h.config.MaxBytes * 4
101110
r, err = readfile.NewEncodeReader(h.file, readfile.Config{
102111
Codec: h.encoding,
@@ -125,16 +134,6 @@ func (h *Harvester) NewLogFileReader(pattern string, showLineNumber bool) (reade
125134
return h.reader, nil
126135
}
127136

128-
// NewPlainTextRead
129-
// 返回一行内容,即使一条日志包含多行(如错误堆栈),也只返回一行。
130-
func (h *Harvester) NewPlainTextRead(showLineNumber bool) (reader.Reader, error) {
131-
if strings.HasSuffix(h.file.Name(), ".json") {
132-
return h.NewJsonFileReader("", showLineNumber)
133-
} else {
134-
return h.NewLogFileReader("", showLineNumber)
135-
}
136-
}
137-
138137
func (h *Harvester) Close() error {
139138
err := h.reader.Close()
140139
if err != nil {

lib/util/file.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ package util
77
import (
88
"bufio"
99
"os"
10+
"path/filepath"
1011
)
1112

12-
func CountFileRows(filePath string) (int64, error){
13+
func CountFileRows(filePath string) (int64, error) {
1314
file, err := os.Open(filePath)
1415
if err != nil {
1516
return 0, err
@@ -23,3 +24,16 @@ func CountFileRows(filePath string) (int64, error){
2324
}
2425
return count, nil
2526
}
27+
28+
// ResolveSymlink Parse the target file path of the soft link
29+
func ResolveSymlink(link string) (string, error) {
30+
realPath, err := filepath.EvalSymlinks(link)
31+
if err != nil {
32+
return "", err
33+
}
34+
absPath, err := filepath.Abs(realPath)
35+
if err != nil {
36+
return "", err
37+
}
38+
return absPath, nil
39+
}

plugin/logs/file_detect.go

+14
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"path/filepath"
1111

1212
log "github.com/cihub/seelog"
13+
"infini.sh/agent/lib/util"
1314
)
1415

1516
type Operation uint8
@@ -79,6 +80,19 @@ func (w *FileDetector) Detect(ctx context.Context) {
7980
}
8081

8182
func (w *FileDetector) judgeEvent(ctx context.Context, path string, info os.FileInfo, pattern *Pattern) {
83+
if info.Mode()&os.ModeSymlink != 0 {
84+
realPath, err := util.ResolveSymlink(path)
85+
if err != nil {
86+
log.Error(err)
87+
return
88+
}
89+
info, err = os.Lstat(realPath)
90+
if err != nil {
91+
log.Error(err)
92+
return
93+
}
94+
path = realPath
95+
}
8296
preState, err := GetFileState(path)
8397
isSameFile := w.IsSameFile(preState, info, path)
8498
if err != nil || preState == (FileState{}) || !isSameFile {

0 commit comments

Comments
 (0)