关于ELK的历史跟作用在此就不说了,相信网上很多,大家都能够搜到,在此我说下他们的安装及使用。
一、logstash的下载及安装
下载:wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.tar.gz
解压: tar –vzxf logstash-5.2.2.tar.gz
bin/logstash –f logstash.cnf
进行运行logstash.conf 配置文件里面的设置
长期运行:一句话就可以搞定,如果想让某命令在后台长期运行,需要在命令前加 nohup,后面加 &
二、input配置
file插件
在logstash中可以在input里面添加file配置,默认的最小化配置如下:
input {
file {
path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/*"
}
}
filter {
}
output {
stdout {}
}
注意:文件路径名用绝对路径,并且支持globs写法。
file插件还有一些其他的属性。
file {
#监听文件的路径
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
#排除不想监听的文件
exclude => "1.log"
#添加自定义的字段(在输出结果中增加一个字段)
add_field => {"test"=>"test"}
#增加标签
tags => "tag1"
#设置新事件的标志
delimiter => "\n"
#设置多长时间扫描目录,发现新文件
discover_interval => 15
#设置多长时间检测文件是否修改
stat_interval => 1
#监听文件的起始位置,默认是end
start_position => beginning
#监听文件读取信息记录的位置
sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"
#设置多长时间会写入读取的位置信息
sincedb_write_interval => 15
}
其中input常用的输入源有:file,syslog,redis,log4j,apache log或nginx log等等
三、codec配置
output{
stdout{
codec=>json
codec=>json_lines{#如果你的json文件比较长,需要换行那么就得用到json_lines的编码方式了
}
}
multiline多行事件编码
input{
stdin{
codec=>multiline{
charset=>...#字符编码,可选
max_bytes=>#bytes类型,设置最大的字节数,可选
max_lines=>#number类型,设置最大的行数,默认是500行,可选
multiline_tag=>#string类型,设置一个事件标签,默认是"multiline",可选
pattern=>...#string类型,设置匹配的正则表达式,必选
patterns_dir=>...#array类型,可以设置多个正则表达式,可选
negate=>...#boolean类型,设置正向匹配还是反向匹配,默认是false,可选
what=>...#设置未匹配的内容是向前合并还是向后合并,previous,next两个值选择,必选
}
}
}
四、filter配置
Grok正则
filter {
grok {
match => { "message" => "grok_pattern" }
}
}
这段代码中除了grok_pattern以外都是logstash的关键字。grok_pattern部分需要使用者填充自己的解析方式。
grok_pattern由零个或多个%{SYNTAX:SEMANTIC}组成,其中SYNTAX是表达式的名字,是由grok提供的,例如数字表达式的名字是NUMBER,IP地址表达式的名字是IP。SEMANTIC表示解析出来的这个字符的名字,由自己定义,例如IP字段的名字可以是client。
对于下面的这条日志
55.3.244.1 GET /index.html 15824 0.043
可以这样解析
* client: 55.3.244.1
* method: GET
* request: /index.html
* bytes: 15824
* duration: 0.043
Date插件
filter {
grok {
match => ["message", "%{HTTPDATE:logdate}"]
}
date {
match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
数据修改( Mutate)
类型转换是 filters/mutate 插件最初诞生时的唯一功能。可以设置的转换类型包括:"integer","float" 和 "string"。示例如下:
filter {
mutate {
convert => ["request_time", "float"]
}
}
字符串处理:
Split分割
filter {
mutate {
split => ["message", "|"]
}
}
Join 仅对数组类型字段有效
我们在之前已经用 split
割切的基础再 join
回去。配置改成:
filter {
mutate {
split => ["message","|"]
}
mutate {
join => ["message",","]
}
}
merge
合并两个数组或者哈希字段。依然在之前 split 的基础上继续:
filter {
mutate {
split => ["message","|"]
}
mutate {
merge => ["message","message"]
}
}
Merge会将所有的装进一个数组里面
如果 src 字段是字符串,会自动先转换成一个单元素的数组再合并。
GEOIP地址查询归类
filter {
geoip {
source => "message"
}
}
运行结果:
{
"message" => "183.60.92.253",
"@version" => "1",
"@timestamp" => "2014-08-07T10:32:55.610Z",
"host" => "raochenlindeMacBook-Air.local",
"geoip" => {
"ip" => "183.60.92.253",
"country_code2" => "CN",
"country_code3" => "CHN",
"country_name" => "China",
"continent_code" => "AS",
"region_name" => "30",
"city_name" => "Guangzhou",
"latitude" => 23.11670000000001,
"longitude" => 113.25,
"timezone" => "Asia/Chongqing",
"real_region_name" => "Guangdong",
"location" => [
[0] 113.25,
[1] 23.11670000000001
]
}
}
GeoIP 库数据较多,如果你不需要这么多内容,可以通过 fields 选项指定自己所需要的。下例为全部可选内容:
filter {
geoip {
fields => ["city_name","continent_code", "country_code2","country_code3", "country_name", "dma_code","ip", "latitude", "longitude","postal_code", "region_name", "timezone"]
}
}
Split拆分事件:
filter {
split {
field => "message"
terminator => "#"
}
}
会分割成n个事件。
注意:split拆分事件后会直接进入到output阶段,所有的split后的其他插件都不可以用了。
output配置
标准输出:
output {
stdout {
codec => rubydebug
workers => 2
}
}
保存到文件:
output {
file {
path =>"/path/to/%{+yyyy/MM/dd/HH}/%{host}.log.gz"
message_format =>"%{message}"
gzip => true
}
}
输出到elasticsearch
output {
elasticsearch {
host => "192.168.0.2"
protocol => "http"
index =>"logstash-%{type}-%{+YYYY.MM.dd}"
index_type => "%{type}"
workers => 5
template_overwrite => true
}
}
输出到redis
input {stdin {} }
output {
redis {
data_type => "channel"
key =>"logstash-chan-%{+yyyy.MM.dd}"
}
}