Logstash系列之--实战演练

实现如下功能,以此熟悉一些logstash的语法:


**1、接收本机514端口udp数据** **2、只接收指定IP发过来的日志** **3、过滤出现“色情”词语的日志** **4、日志正则匹配抓取字段** **5、解析sourceIp经纬度、国家省份城市** **6、输出保存到Elasticsearch**


首先我们看看配置文件的结构:


input { ...   #输入 } • filter { ...   #数据处理转换 } • output { ...   #输出 }


下面我们开始实现以上功能:

测试syslong格式:


<13>Jan 13 16:09:47 localhost 1578902986 2020/01/13 Mon 16:09:46 ipt_log=ACCEPT IN=vEth0 OUT=enp2s0 MAC=82:4b:ad:48:b6:0e:00:10:f3:71:9b:93:08:00 SRC=172.16.7.170 DST=192.168.0.100 LEN=124 TOS=0x00 PREC=0x00 TTL=122 ID=17313 PROTO=UDP SPT=51424 DPT=54218 LEN=104"|nc -u 172.16.110.243 514


1、接收514端口的udp数据


input {   udp {       port => "514"   } }


2、只接收指定IP发过来的日志


filter {   #过滤指定IP,如果上报IP在数组中,则丢弃   if [host] in ["172.16.110.55","10.53.187.101"]{       drop {}     } }


3、过滤出现“色情”词语的日志


filter {     #关键字过滤,日志中出现色情和傻逼的都丢弃   if[message]=~"色情|傻逼"{       drop{}     } }


4、日志正则匹配抓取字段

Grok 正则捕获


filter {     #抓取了日志中的时间、事件名称、IP和协议等字段     grok {       match => {           "message" => ".*\>(?<logtime>.*)\slocalhost.*IN=(?<eventName>.*)\sOUT.*SRC=(?<sourceIp>.*)\sDST=(?<destIp>.*)\sLEN.*PROTO=(?<appproto>\w+)\sSPT=(?<sourcePort>\d+)\sDPT=(?<destPort>\d+)\s.*"       }   } } output { ...   #输出 }


5、解析sourceIp经纬度、国家省份城市(使用geoip插件)


filter{ #地理位置   geoip {           source => "sourceIp"           #用《find / -name 名字》查找mmdb文件在linux的为止           database => "/../../GeoLite2-City.mmdb"             add_field => ["src_country" , "%{[geoip][country_name]}"]           add_field => ["src_province" , "%{[geoip][region_name]}"]           add_field => ["src_city" , "%{[geoip][city_name]}"]           add_field => ["src_latitude" , "%{[geoip][latitude]}"]           add_field => ["src_longitude" , "%{[geoip][longitude]}"]           } }


6、输出保存到Elasticsearch


output {   elasticsearch {       hosts => "10.10.110.110"       index => "syslog_%{+YYYYMMdd}"   } }


完整配置文件:


input {   udp {       port => "514"   } } filter {   #过滤指定IP,如果上报IP在数组中,则丢弃   if [host] in ["172.16.110.55","10.53.187.101"]{       drop {}     }       #关键字过滤,日志中出现色情和傻逼的都丢弃   if[message]=~"色情|傻逼"{       drop{}     }             #抓取了日志中的时间、事件名称、IP和协议等字段     grok {       match => {           "message" => ".*\>(?<logtime>.*)\slocalhost.*IN=(?<eventName>.*)\sOUT.*SRC=(?<sourceIp>.*)\sDST=(?<destIp>.*)\sLEN.*PROTO=(?<appproto>\w+)\sSPT=(?<sourcePort>\d+)\sDPT=(?<destPort>\d+)\s.*"       }   }       #地理位置   geoip {           source => "sourceIp"           #用《find / -name 名字》查找mmdb文件在linux的为止           database => "/../../GeoLite2-City.mmdb"             add_field => ["src_country" , "%{[geoip][country_name]}"]           add_field => ["src_province" , "%{[geoip][region_name]}"]           add_field => ["src_city" , "%{[geoip][city_name]}"]           add_field => ["src_latitude" , "%{[geoip][latitude]}"]           add_field => ["src_longitude" , "%{[geoip][longitude]}"]           } } output { elasticsearch {       hosts => "10.10.110.110"       index => "syslog_%{+YYYYMMdd}"   } }


启动运行:

bin/logstash -f syslog.conf --config.reload.automatic

如果想删除某些字段


{ mutate {         remove_field => ["src_longitude","appproto"]   } }


说明:

上面用的这些都是很基础的,logstash还有很多各种各样的插件,想学好要去官网慢慢看!