bilibili-backup/app/service/ops/log-agent/input/file/config.go
2019-04-22 02:59:20 +00:00

104 lines
2.7 KiB
Go

package file
import (
"errors"
"time"
xtime "go-common/library/time"
"github.com/BurntSushi/toml"
)
type Config struct {
Paths []string `toml:"paths"`
Symlinks bool `toml:"symlinks"`
AppId string `toml:"appId"`
LogId string `toml:"logId"`
ConfigPath string `toml:"-"`
MetaPath string `toml:"-"`
ID string `toml:"-"`
ReadFrom string `toml:"readFrom"`
MaxLength int `toml:"maxLength"`
IgnoreOlder xtime.Duration `toml:"ignoreOlder"`
CleanFilesOlder xtime.Duration `toml:"cleanFilesOlder"`
ScanFrequency xtime.Duration `toml:"scanFrequency"`
CleanInactive xtime.Duration `toml:"cleanInactive"`
HarvesterTTL xtime.Duration `toml:"harvesterTTL"` // harvester will stop itself if inactive longer than HarvesterTTL
Multiline *MultilineConf `toml:"multiline"`
Timeout xtime.Duration `toml:"timeout"`
Fields map[string]interface{} `toml:"fields"`
}
func (c *Config) ConfigValidate() (error) {
if c == nil {
return errors.New("config of file Input is nil")
}
if len(c.Paths) == 0 {
return errors.New("paths of file Input can't be nil")
}
if c.LogId == "" {
c.LogId = "000161"
}
if c.AppId == "" {
return errors.New("appId of file Input can't be nil")
}
if c.IgnoreOlder == 0 {
c.IgnoreOlder = xtime.Duration(time.Hour * 24)
}
if c.ScanFrequency == 0 {
c.ScanFrequency = xtime.Duration(time.Second * 10)
}
// Note: CleanInactive should be greater chan ignore_older + scan_frequency
if c.CleanInactive == 0 {
c.CleanInactive = xtime.Duration(time.Hour * 24 * 7)
}
if c.CleanInactive < c.IgnoreOlder+c.ScanFrequency {
return errors.New("CleanInactive must be greater than ScanFrequency + IgnoreOlder")
}
if c.HarvesterTTL == 0 {
c.HarvesterTTL = xtime.Duration(time.Hour * 1)
}
if c.Timeout == 0 {
c.Timeout = xtime.Duration(time.Second * 5)
}
if c.ReadFrom != "" && c.ReadFrom != "newest" && c.ReadFrom != "oldest" {
return errors.New("ReadFrom of file input can only be newest or oldest")
}
if c.ReadFrom == "" {
c.ReadFrom = "newest"
}
if c.MaxLength == 0 || c.MaxLength > 1024*10*64 {
c.MaxLength = 1024 * 10 * 64
}
// Symlinks is always disabled
c.Symlinks = false
if c.Multiline != nil {
if err := c.Multiline.ConfigValidate(); err != nil {
return err
}
}
return nil
}
func DecodeConfig(md toml.MetaData, primValue toml.Primitive) (c interface{}, err error) {
c = new(Config)
if err = md.PrimitiveDecode(primValue, c); err != nil {
return nil, err
}
return c, nil
}