在实际应用中,我们可能会对apache产生的请求访问日志进行解析,对其中的一些数据进行处理。我们可以使用Logstash中提供的grok插件(该插件是针对apache的日志,里面可以帮我们自动识别一些信息)对数据格式进行处理,并将数据输出到elasticsearch。
关于elk的搭建,可以参考这篇:kafka与elk整合搭建日志系统_QYHuiiQ的博客-CSDN博客
1.启动elasticsearch
由root切换至elasticsearch用户:elssearch(该用户在之前我们已经创建好了)
[elssearch@localhost elk-kafka]$ cd elasticsearch-6.6.0
[elssearch@localhost elasticsearch-6.6.0]$ cd bin
[elssearch@localhost bin]$ ./elasticsearch
启动成功,访问页面:
2.启动kibana:
[root@localhost elk-kafka]# cd kibana-6.6.0-linux-x86_64/bin
[root@localhost bin]# ./kibana
启动成功后访问5601端口:
3.配置logstash:
3.1我们要对apache的log进行解析,这里我就创建一个文件里面复制了一下apache格式的log(我这里的log存放路径:/usr/local/wyh/elk-kafka/apache-log/apachelog.txt)。
假设log中有一条记录:
192.168.184.128 - - [12/Apr/2019:16:47:37 -0400] Second:18 "POST /index/article?writer=wyh&articleid=jsd_kojb_91.43.68_2548_33_87_3849 HTTP/1.1" 200 658 "-" "Java/1.8.0_51"
3.2进入logstash的config目录下创建配置解析log的配置文件:
[root@localhost config]# vi wyh-apache-log.conf
input{
file{ --从文件中读取
path => "/usr/local/wyh/elk-kafka/apache-log/apachelog.txt" --要解析的log路径
type => "apachelog" --自定义一个type
start_position => "beginning" --从文件起始位置读起
}
}
filter{
grok{ --logstash自带的filter插件,用来解析apache类型的Log
patterns_dir => "/usr/local/wyh/elk-kafka/logstash-6.6.0/custom/patterns" --前面我提供的log数据中的articleid这个字段中包含了数字、字母、下划线、圆点等复杂符号。grok中没有对应的正则,所以需要自定义一个正则。该配置指定了自定义正则所在的路径。(若你的Log中不需要自定义正则,可不添加此配置)
match => { --对log进行正则匹配
"message" => "%{IP:client_address} - - \[%{HTTPDATE:timestamp}\] Second:%{NUMBER:second} \"%{WORD:http_method} %{URIPATHPARAM:url}\?writer=%{WORD:writer}&articleid=%{ARTICLEID:articleid} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_code} %{NUMBER:bytes} \"(?:%{URI:http_referer}|-)\" %{QS:java_version}"
}
remove_field => "message" --上面一行对数据进行了拆分解析,此处就没必要再完整地显示一遍Log信息,所以可以移除掉message这个字段。
}
}
output{
elasticsearch{ --输出到elasticsearch中
hosts => ["192.168.184.128:9200"] --elasticsearch的ip及端口
index => "wyh-apache-log" --输出到哪个index
}
}
(配置中不要写注释,因为它不识别,会报错)
上面的%{A:b}中A表示grok提供的已经定义好的正则名称,比如IP会自动匹配到IP格式的信息,NUMBER是匹配数字格式,WORD匹配字符串,QS匹配带引号的字符串。。。冒号后面的b表示将匹配得到的信息以什么字段名展示,这个是自己起的名字。在匹配的时候有些特殊符号是需要在前面加上一个\来转义的。如果字符串中含有特殊字符且没有双引号,没有空格时(如:https://www.google.com/),WORD是不能识别的(WORD只能识别字母和数字),而且不带双引号时,QS(含有双引号的字符串)也不能用,可以试一下NOTSPACE。如果是有特殊字符,且有空格,没有双引号的(如:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537)可以用GREEDYDATA。
如果是在filter中有If判断数据中含有某个字符串进行分别解析:
filter{
if "xxxxxx" in [message]{
grok{
}
}
}
如果是判断tag是解析失败的,tag是一个数组,所以也应该用"xxxx" in [tags]的格式:
output{
if "_grokparsefailure" in [tags] {
elasticsearch{
hosts => []
index => ""
}
}
}
grok提供的正则默认表达式详细信息:Logstash6中grok插件的常用正则表达式 - 云+社区 - 腾讯云
Logstash笔记(三)----Filter插件及grok的正则表达式来解析日志_清风明月的技术博客_51CTO博客
3.3在3.2的配置中提到了自定义正则,patterns_dir是路径。我们在/usr/local/wyh/elk-kafka/logstash-6.6.0下创建目录:custom,在custom下创建文件patterns:
cd /usr/local/wyh/elk-kafka/logstash-6.6.0/custom
[root@localhost custom]# vi patterns
这里我们要自定义的是articleid字段的正则,所以就根据articleid的特征编辑正则:
[root@localhost custom]# cat patterns
ARTICLEID [a-z]{3}_[a-z]{4}_[0-9]{2}.[0-9]{2}.[0-9]{2}_[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}
前面的ARTICLEID是自定义的表达式名称,在filter匹配时直接使用这个名称。
如果自定义多个正则,那就换行另写。
3.4启动logstash:
[root@localhost logstash-6.6.0]# ./bin/logstash -f ./config/wyh-apache-log.conf
启动过程要稍微等一会儿。。。
3.5在kibana中创建一个刚才在配置文件中指定的index:
创建好之后查看刚才的log信息:
蓝色方框中的就是我们对Log解析之后的每一个属性的值,在elasticsearch中可以对这些属性进行操作分析等。
在测试的过程中可能遇到的问题:
1)如果遇到message没有解析成我们指定的字段,一般就是因为filter中的正则没有匹配对。
2)如果你只修改了logstash的配置,没有修改Log源文件,可能会导致kibana中刷新不出来,可以修改一下源文件中的内容再测试。
以上就完成了logstash对apache日志解析的过程。