diff --git a/lib/reader/harvester/harvester.go b/lib/reader/harvester/harvester.go index 0820925..29034b0 100644 --- a/lib/reader/harvester/harvester.go +++ b/lib/reader/harvester/harvester.go @@ -8,7 +8,6 @@ import ( "fmt" "io" "os" - "strings" "infini.sh/agent/lib/reader" "infini.sh/agent/lib/reader/linenumber" @@ -16,6 +15,7 @@ import ( "infini.sh/agent/lib/reader/readfile" "infini.sh/agent/lib/reader/readfile/encoding" "infini.sh/agent/lib/reader/readjson" + "infini.sh/framework/core/errors" ) type Harvester struct { @@ -30,8 +30,8 @@ type Harvester struct { func NewHarvester(path string, offset int64) (*Harvester, error) { f, err := readOpen(path) - if err != nil { - return nil, err + if f == nil || err != nil { + return nil, errors.Errorf("failed to open file(%s),%v", path, err) } _, err = f.Seek(offset, io.SeekStart) if err != nil { @@ -48,6 +48,9 @@ func NewHarvester(path string, offset int64) (*Harvester, error) { } h.encodingFactory = encodingFactory h.encoding, err = h.encodingFactory(f) + if err != nil { + return nil, err + } return h, nil } @@ -60,6 +63,9 @@ func readOpen(path string) (*os.File, error) { func (h *Harvester) NewJsonFileReader(pattern string, showLineNumber bool) (reader.Reader, error) { var r reader.Reader var err error + if h == nil || h.file == nil { + return nil, fmt.Errorf("file is nil") + } encReaderMaxBytes := h.config.MaxBytes * 4 r, err = readfile.NewEncodeReader(h.file, readfile.Config{ @@ -97,6 +103,9 @@ func (h *Harvester) NewLogFileReader(pattern string, showLineNumber bool) (reade var r reader.Reader var err error + if h == nil || h.file == nil { + return nil, fmt.Errorf("file is nil") + } encReaderMaxBytes := h.config.MaxBytes * 4 r, err = readfile.NewEncodeReader(h.file, readfile.Config{ Codec: h.encoding, @@ -125,16 +134,6 @@ func (h *Harvester) NewLogFileReader(pattern string, showLineNumber bool) (reade return h.reader, nil } -// NewPlainTextRead -// 返回一行内容,即使一条日志包含多行(如错误堆栈),也只返回一行。 -func (h *Harvester) NewPlainTextRead(showLineNumber bool) (reader.Reader, error) { - if strings.HasSuffix(h.file.Name(), ".json") { - return h.NewJsonFileReader("", showLineNumber) - } else { - return h.NewLogFileReader("", showLineNumber) - } -} - func (h *Harvester) Close() error { err := h.reader.Close() if err != nil { diff --git a/lib/util/file.go b/lib/util/file.go index 7dc8144..4208671 100644 --- a/lib/util/file.go +++ b/lib/util/file.go @@ -7,9 +7,10 @@ package util import ( "bufio" "os" + "path/filepath" ) -func CountFileRows(filePath string) (int64, error){ +func CountFileRows(filePath string) (int64, error) { file, err := os.Open(filePath) if err != nil { return 0, err @@ -23,3 +24,16 @@ func CountFileRows(filePath string) (int64, error){ } return count, nil } + +// ResolveSymlink Parse the target file path of the soft link +func ResolveSymlink(link string) (string, error) { + realPath, err := filepath.EvalSymlinks(link) + if err != nil { + return "", err + } + absPath, err := filepath.Abs(realPath) + if err != nil { + return "", err + } + return absPath, nil +} diff --git a/plugin/logs/file_detect.go b/plugin/logs/file_detect.go index 413e5ef..e9efe5d 100644 --- a/plugin/logs/file_detect.go +++ b/plugin/logs/file_detect.go @@ -10,6 +10,7 @@ import ( "path/filepath" log "github.com/cihub/seelog" + "infini.sh/agent/lib/util" ) type Operation uint8 @@ -79,6 +80,19 @@ func (w *FileDetector) Detect(ctx context.Context) { } func (w *FileDetector) judgeEvent(ctx context.Context, path string, info os.FileInfo, pattern *Pattern) { + if info.Mode()&os.ModeSymlink != 0 { + realPath, err := util.ResolveSymlink(path) + if err != nil { + log.Error(err) + return + } + info, err = os.Lstat(realPath) + if err != nil { + log.Error(err) + return + } + path = realPath + } preState, err := GetFileState(path) isSameFile := w.IsSameFile(preState, info, path) if err != nil || preState == (FileState{}) || !isSameFile {