summaryrefslogtreecommitdiff
path: root/internal/mapr/logformat/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/mapr/logformat/parser.go')
-rw-r--r--internal/mapr/logformat/parser.go82
1 files changed, 31 insertions, 51 deletions
diff --git a/internal/mapr/logformat/parser.go b/internal/mapr/logformat/parser.go
index d6aac8c..37d7a63 100644
--- a/internal/mapr/logformat/parser.go
+++ b/internal/mapr/logformat/parser.go
@@ -3,8 +3,6 @@ package logformat
import (
"errors"
"fmt"
- "reflect"
- "strings"
"time"
"github.com/mimecast/dtail/internal/config"
@@ -15,62 +13,44 @@ import (
var ErrIgnoreFields error = errors.New("Ignore this field set")
// Parser is used to parse the mapreduce information from the server log files.
-type Parser struct {
- hostname string
- logFormatName string
- makeFieldsFunc reflect.Value
- makeFieldsReceiver reflect.Value
- timeZoneName string
- timeZoneOffset string
+type Parser interface {
+ // MakeFields creates a field map from an input log line.
+ MakeFields(string) (map[string]string, error)
}
// NewParser returns a new log parser.
-func NewParser(logFormatName string, query *mapr.Query) (*Parser, error) {
+func NewParser(logFormatName string, query *mapr.Query) (Parser, error) {
hostname, err := config.Hostname()
if err != nil {
return nil, err
}
now := time.Now()
- zone, offset := now.Zone()
-
- p := Parser{
- hostname: hostname,
- timeZoneName: zone,
- timeZoneOffset: fmt.Sprintf("%d", offset),
- }
-
- err = p.reflectLogFormat(logFormatName)
- if err != nil {
- return nil, err
- }
- return &p, nil
-}
-
-// The aim of this is that everyone can plug in their own mapr log format
-// parsing method to DTail. Just add a method MakeFieldsMODULENAME to type
-// Parser. Whereas MODULENAME must be a upeprcase string.
-func (p *Parser) reflectLogFormat(logFormatName string) error {
- methodName := fmt.Sprintf("MakeFields%s", strings.ToUpper(logFormatName))
- rt := reflect.TypeOf(p)
- method, ok := rt.MethodByName(methodName)
- if !ok {
- return errors.New("No such mapr log format module: " + methodName)
- }
-
- p.makeFieldsFunc = method.Func
- p.makeFieldsReceiver = reflect.ValueOf(p)
- return nil
-}
-
-// MakeFields is for returning the fields from a given log line.
-func (p *Parser) MakeFields(maprLine string) (fields map[string]string, err error) {
- inputValues := []reflect.Value{p.makeFieldsReceiver, reflect.ValueOf(maprLine)}
- returnValues := p.makeFieldsFunc.Call(inputValues)
- errInterface := returnValues[1].Interface()
- if errInterface == nil {
- fields, err = returnValues[0].Interface().(map[string]string), nil
- return
+ timeZoneName, timeZoneOffset := now.Zone()
+
+ // Extend this for adding more log formats!
+ switch logFormatName {
+ case "generic":
+ return newGenericParser(hostname, timeZoneName, timeZoneOffset)
+ case "generickv":
+ return newGenericKVParser(hostname, timeZoneName, timeZoneOffset)
+ case "csv":
+ return newCSVParser(hostname, timeZoneName, timeZoneOffset)
+ case "mimecast":
+ return newMimecastParser(hostname, timeZoneName, timeZoneOffset)
+ case "mimecastgeneric":
+ return newMimecastGenericParser(hostname, timeZoneName, timeZoneOffset)
+ case "default":
+ return newDefaultParser(hostname, timeZoneName, timeZoneOffset)
+ case "custom1":
+ return newCustom1Parser(hostname, timeZoneName, timeZoneOffset)
+ case "custom2":
+ return newCustom2Parser(hostname, timeZoneName, timeZoneOffset)
+ default:
+ p, err := newDefaultParser(hostname, timeZoneName, timeZoneOffset)
+ if err != nil {
+ return p, fmt.Errorf("No '%s' mapr log format and problem creating default one: %v",
+ logFormatName, err)
+ }
+ return p, fmt.Errorf("No '%s' mapr log format", logFormatName)
}
- fields, err = returnValues[0].Interface().(map[string]string), errInterface.(error)
- return
}