举例:apache2 Parser Plugin
expression /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/ time_format %d/%b/%Y:%H:%M:%S %z
example:
192.168.0.1 - - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0"
This incoming event is parsed as:
time: 1362020400 (28/Feb/2013:12:00:00 +0900) record: { "user" : nil, "method" : "GET", "code" : 200, "size" : 777, "host" : "192.168.0.1", "path" : "/", "referer": nil, "agent" : "Opera/12.0" }
下面具体分析上面正则表达式,大致结构为 expression /^(?<field1>[^ ]*)(?<field2>[^\\]*)\\(?<field3>[^ ]*)$/
(?<field1>[^ ]*)代表要提取一个field1的字段,内容是连续不为空格的字符 (?<field2>[^\\]*)代表要提取一个field1的字段,内容是连续不为反斜杠的字符 以此类推,这些字段之间还可以结合其他字符或者正则表达式,比方[^\d], 整个expression必须能够匹配event日志,否则会提示parse error。
(?: )? 这种结构表明中间的正则表达式匹配的字段可能存在或者不存在,
比方说下面的例子,path字段为两个空格之间的一段字符,但是也有可能这一段不存在,因为为了避免出现parse error,可以用(?: )?这种结构。
(?: +(?<path>[^ ]*) +\S*)?