- Notifications
You must be signed in to change notification settings - Fork 261
Parsers
Sun Jianbo edited this page Mar 11, 2018 · 10 revisions
Parser 是在数据被logkit读取后,用户可以根据需要定制化的解析日志格式,抽取数据中的字段,转化为结构化数据的方式。
目前logkit已经内置一部分数据解析方式,他们分别为:
-
csv
(按行通过分隔符解析): csv parser -
json
(通过json反序列化解析): json parser -
grok
(通过配置grok pattern解析): grok parser -
qiniulog
(七牛开源的golang日志库日志格式解析): Qiniu Log Parser -
kafkarest
(Kafkarest日志解析): KafkaRestLog Parser -
raw
(直接按行读取返回): Raw Parser -
syslog
(系统的syslog日志格式): syslog parser -
mysqllog
(mysql慢请求日志解析): mysqllog parser
"parser":{ "name":"req_csv", "type":"csv", "labels":"machine nb110,team pandora" },
-
name
parser的name,用来标识 -
type
parser的类型 -
labels
对于所有的Parser,我们均提供了标签功能,用于记录一些额外的信息,添加到结构化的数据字段中,如常见的日志所在机器、业务所述团队等信息,labels
的写法则是标签名称和数值以空格隔开<标签名> <标签内容>
,多个标签提供逗号分隔。
根据不同的Parser,还需要填写其他特定Parser相关的配置文件,详情请参阅各Parser的配置页面。
若上述内置的解析器依旧无法满足您的需求,Logkit也支持用户根据需要自己实现解析逻辑,只需要实现如下两个接口。
type LogParser interface { Name() string // parse lines into structured datas Parse(lines []string) (datas []sender.Data, err error) }
Parser的接口非常简单,一共就2个方法。
首先 Name()
函数表示Parser的名称,用于标识;其次就是批量解析数据的Parse方法,传入的是一个字符串数组,数组的每一个元素就是reader中readline函数获取的每一行,为了性能更高传入数组进行批量解析,返回的数据就是按照sender中定义的Data类型,实际上对应的就是Go语言的 map[string]interface{}
类型。
所以Parser要做2件事情。
- 确定最终要解析出的schema,即字段(field或者key)和类型(type)。像json这种数据天生就含有schema,无需用户定义,其他类型的解析器可能需要用户在配置文件中写明schema是怎么样的。
- 定义规则将传入的字符串按照schema解析。Parser之间的主要区别实际上就是规则的不同,如csv parser就是按照指定的分隔符分隔;json parser就是按照json格式解析 等等。根据你Parser对应要解析的字符串内容实现你的解析规则即可。
实现完成Parser后,注意在 NewParserRegistry()
中注册对应的new方法噢,如下所示。
func NewParserRegistry() *ParserRegistry { ps := &ParserRegistry{ parserTypeMap: map[string]func(conf.MapConf) (LogParser, error){}, } ps.RegisterParser(TypeCSV, NewCsvParser) ps.RegisterParser(TypeRaw, NewRawlogParser) ps.RegisterParser(TypeKafkaRest, NewKafaRestlogParser) ps.RegisterParser(TypeEmpty, NewEmptyParser) ps.RegisterParser(TypeGrok, NewGrokParser) ps.RegisterParser(TypeJson, NewJsonParser) ps.RegisterParser(TypeNginx, NewNginxParser) //ps.RegisterParser(TypeMyNewParser, NewMyNewParser) return ps }
package samples import ( "strings" "github.com/qiniu/logkit/conf" "github.com/qiniu/logkit/parser" "github.com/qiniu/logkit/sender" ) // 一个自定义parser的示例,将日志放到data中的log字段中 type CustomParser struct { // parser 的名字 name string // 每行截断最大字符数 maxLen int } func NewMyParser(c conf.MapConf) (parser.LogParser, error) { // 获取parser配置中的name项,默认myparser name, _ := c.GetStringOr("name", "myparsername") // 获取parser配置中的max_len选项,默认1000 maxLen, _ := c.GetIntOr("max_len", 1000) p := &CustomParser{ name: name, maxLen: maxLen, } return p, nil } func (p *CustomParser) Name() string { return p.name } func (p *CustomParser) Parse(lines []string) (datas []sender.Data, err error) { for _, l := range lines { d := sender.Data{} line := strings.TrimSpace(l) if len(line) > p.maxLen { line = line[:p.maxLen] } d["log"] = line datas = append(datas, d) } return datas, nil }
快速开始 | Pandora | Readers | Parsers | Senders | Download | 七牛智能日志管理平台 | logkit-pro专业版