feat: implement drain3 based generic log-parser

This commit is contained in:
Patryk Hegenberg 2026-01-18 16:51:44 +01:00
parent 1d1568e3ee
commit 5af49f926a
17 changed files with 612 additions and 220 deletions

View file

@ -10,6 +10,7 @@ import (
"watch-tool/parser"
"watch-tool/patterns"
"codeberg.org/pata1704/drain3"
"github.com/hpcloud/tail"
)
@ -19,16 +20,25 @@ type FileMonitor struct {
hostname string
}
func NewFileMonitor(config ToolConfig, hostname string) *FileMonitor {
func NewFileMonitor(config ToolConfig, hostname string, drainCfg *drain3.Config, stateDir string) *FileMonitor {
var logParser parser.Parser
pCfg := parser.ParserConfig{
ServiceName: config.Name,
LogType: "custom",
Hostname: hostname,
DrainConfig: drainCfg,
StateDir: stateDir,
}
if config.Format.Pattern != "" {
compiledRegex, err := regexp.Compile(config.Format.Pattern)
if err != nil {
slog.Error("Invalid regex pattern in tool config", "tool", config.Name, "error", err)
logParser = parser.NewGenericParser(config.Name, hostname)
logParser = parser.NewGenericParser(config.Name, hostname, pCfg.DrainConfig, pCfg.StateDir)
} else {
gp := parser.NewGenericParser(config.Name, hostname)
gp := parser.NewGenericParser(config.Name, hostname, pCfg.DrainConfig, pCfg.StateDir)
customExtractor := patterns.CompiledExtractor{
Name: "config_custom_pattern",
@ -41,10 +51,10 @@ func NewFileMonitor(config ToolConfig, hostname string) *FileMonitor {
}
} else {
var err error
logParser, err = parser.New(config.Name, "custom", hostname)
logParser, err = parser.New(pCfg)
if err != nil {
slog.Error("Cannot get tool specific parser from factory", "error", err)
logParser = parser.NewGenericParser(config.Name, hostname)
logParser = parser.NewGenericParser(config.Name, hostname, pCfg.DrainConfig, pCfg.StateDir)
}
}
@ -56,6 +66,7 @@ func NewFileMonitor(config ToolConfig, hostname string) *FileMonitor {
}
func (fm *FileMonitor) Start(ctx context.Context, out chan<- models.LogMessage) error {
defer fm.parser.Close()
t, err := tail.TailFile(fm.config.LogFile, tail.Config{
Follow: true,
ReOpen: true,