logstash multiline插件匹配多行日志

在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j。运行时日志跟访问日志最大的不同是,运行时日志是多行,也就是说,连续的多行才能表达一个意思。
可以使用multiline来组合多行数据
对 multiline 插件来说,有三个设置比较重要:negate、pattern 和 what。
negate
类型是 boolean
默认为 false
否定正则表达式(如果没有匹配的话)。
pattern
必须设置
类型为 string
没有默认值
要匹配的正则表达式。
what
必须设置
可以为 previous 或 next
没有默认值
如果正则表达式匹配了,那么该事件是属于下一个或是前一个事件

演示WAF攻击日志如下:

172.16.100.1 [2016-08-03 01:54:54] "POST" "localhost" "11000" "SQLi" "SQL注入行为(Union)" "post" "[[union.+?select@{0,2}(\(.+\)|\s+?.+?|(`|'|").*?(`|'|"))]]" [[[[POST /dvwa/login.php HTTP/1.1
accept-language:zh-CN,zh;q=0.8
content-type:application/x-www-form-urlencoded
connection:keep-alive
content-length:67
cookie:security=low; PHPSESSID=at71e7ipvra6bodpu05kkm16t3
cache-control:no-cache
host:172.16.100.168
accept-encoding:gzip, deflate
referer:http://172.16.100.168/dvwa/login.php
origin:http://172.16.100.168
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
pragma:no-cache
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36

username=admin+union+select+1%2C2%2C3&password=password&Login=Login]]]]

 

POST包是多行数据
logstash配置文件如下:

input {
    file {
        path => "/tmp/log/2016-08-03_sec.log"
        type => "test"
        codec=> multiline {
            pattern => "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s\["
            negate => true
            what => "previous"
        }
        start_position => beginning
    }
}
filter{
    grok{
        match => {
        "message" => "%{IP:client} \[%{GREEDYDATA:timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:servername}\" \"%{NUMBER:ruleid}\" \"%{GREEDYDATA:attacktype}\" \"%{GREEDYDATA:description}\" \"%{WORD:position}\" \"\[\[%{GREEDYDATA:reg}\]\]\" \[\[\[\[(?<http>[\s\S]*?)\]\]\]\]"
        }
    }
    date {
        match => ["timestamp", "yyyy-MM-dd HH:mm:ss"]
        target => "@timestamp"
        "locale" => "en"
    }
    mutate {
        remove_field => [ "message" ]
    }
}
output {
    stdout {
        codec => rubydebug
    }
}

 

可以看到多行数据汇总到了message中

123