标签归档:ELK

Logstash由于时区导致8小时时差解决方案

Logstash 2.3版本


logstash的date插件配置:

date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}

查看解析结果发现@timestamp比中国时间早了8小时

对于页面查看,ELK 的解决方案是在 Kibana 上,读取浏览器的当前时区,然后在页面上转换时间内容的显示。
解决方案找到两个
1、

vim vendor/bundle/jruby/1.9/gems/logstash-core-event-2.3.3-java/lib/logstash/timestamp.rb

把@time = time.utc 改成time即可

2、
这种办法与Linux服务器的时区设置有关系,有些Linux可能修改不成功,推荐用第一种。
http://www.aichengxu.com/view/6621766
1)修改logstash配置

date {
match => ["timestamp", "yyyy-MM-dd HH:mm:ss"]
target => "@timestamp"
"locale" => "en"
timezone => "+00:00"
}

添加 timezone => “+00:00”
然后测试@timestamp就是正常的时间了,@timestamp和timestamp是一致的。
2)因为kibana会读取浏览器的时区,然后+8小时,所以需要修改kibana的配置。
Settings – Advanced – dateFormat:tz 修改为UTC

Elasticsearch索引创建错误
修改之后发现logstash在按每天输出到elasticsearch时,每天8:00才创建当天索引,而8:00以前数据还是会输出到昨天的索引,如图:

解决办法如下:

vim ./vendor/bundle/jruby/1.9/gems/logstash-core-event-2.3.3-java/lib/logstash/string_interpolation.rb
.withZone(org.joda.time.DateTimeZone::UTC)

修改为

.withZone(org.joda.time.DateTimeZone.getDefault())

Logstash5.3版本


解决8小时时差问题,配置如下:

    date {
        match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss +0800"]
        target => "@timestamp"
        "locale" => "en"
        timezone => "UTC"
    }

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