时间:2021-05-19
所有ELK的安装包都可以去官网下载,虽然速度稍慢,但还可以接受,官网地址:https:// 10.171.xx.xx 100.97.xx.xx [10/Jun/2015:10:53:24 +0800] "GET /api1.2/qa/getquestionlist/?limit=10&source=ios&token=12343425324&type=1&uid=304116&ver=1.2.379 HTTP/1.0" - 200 2950 "-" "TheMaster/1.2.379 (iPhone; iOS 8.3; Scale/2.00)" 0.656 0.654
下面是一个POST请求的例子:
复制代码 代码如下:
api.yejianfeng.com 10.171.xx.xx 100.97.xx.xx [10/Jun/2015:10:53:24 +0800] "POST /api1.2/user/mechanicupdate/ HTTP/1.0" start_time=1276099200&lng=110.985723&source=android&uid=328910&lat=35.039471&city=140800 200 754 "-" "-" 0.161 0.159
顺便说下,这里知识在nginx.conf中定义了一个日志格式,还要记得在具体的服务中加入日志存储。比如
log_agent的配置
这个配置就是往redis队列中塞入日志就行。output的位置设置为redis就行。
input {
file {
type => "nginx_access"
path => ["/mnt/logs/api.yejianfeng.com.logstash.log"]
}
}
output {
redis {
host => "10.173.xx.xx"
port => 8001
password => pass
data_type => "list"
key => "logstash:redis"
}
}
log_indexer的配置
log_indexer的配置就比较麻烦了,需要配置的有三个部分
input: 负责从redis中获取日志数据
filter: 负责对日志数据进行分析和结构化
output: 负责将结构化的数据存储进入elasticsearch
input部分
其中的redis配置当然要和agent的一致了。
filter部分
解析文本可以使用grokgrok debug进行分析,参照着之前的log格式,需要一个个进行日志分析比对。这个grok语法写的还是比较复杂的,还好有在线grok比对工具可以使用。比对前面的GET和POST的日志格式,修改出来的grok语句如下:
复制代码 代码如下:
%{IPORHOST:http_host} %{IPORHOST:server_ip} %{IPORHOST:client_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} (?:%{PATH:baseurl}\?%{NOTSPACE:params}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" (%{NOTSPACE:params})?|- %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} %{NUMBER:time_backend_response:float}
这里使用了一点小技巧,params的使用,为了让GET和POST的参数都反映在一个参数上,在对应的GET和POST的参数的地方,都设计使用params这个参数进行对应。
好了,现在params中是请求的参数。比如source=ios&uid=123。但是呢,最后做统计的时候,我希望得出的是“所有source值为ios的调用”,那么就需要对参数进行结构化了。而且我们还希望如果接口中新加入了一个参数,不用修改logstash_indexer就可以直接使用,方法就是使用kv,kv能实现对一个字符串的结构进行k=v格式的拆分。其中的参数prefix可以为这个key在统计的时候增加一个前缀,include_keys可以设置有哪些key包含在其中,exclude_keys可以设置要排除哪些key。
kv { prefix => "params." field_split => "&" source => "params"}好了,现在还有一个问题,如果请求中有中文,那么日志中的中文是被urlencode之后存储的。我们具体分析的时候,比如有个接口是/api/search?keyword=我们,需要统计的是keyword被查询的热门顺序,那么就需要解码了。logstash牛逼的也有urldecode命令,urldecode可以设置对某个字段,也可以设置对所有字段进行解码。
urldecode { all_fields => true}看起来没事了,但是实际上在运行的时候,你会发现一个问题,就是存储到elasticsearch中的timestamp和请求日志中的请求时间不一样。原因是es中的请求日志使用的是日志结构存放进入es的时间,而不是timestamp的时间,这里想要吧es中的时间和请求日志中的时间统一怎么办呢?使用date命令。具体设置如下:
date { locale => "en" match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]}具体的logstash_indexer中的全部配置如下:
filter { grok { match => [ "message", "%{IPORHOST:http_host} %{IPORHOST:server_ip} %{IPORHOST:client_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} (?:%{PATH:baseurl}\?%{NOTSPACE:params}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" (%{NOTSPACE:params})?|- %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} %{NUMBER:time_backend_response:float}" ] } kv { prefix => "params." field_split => "&" source => "params" } urldecode { all_fields => true } date { locale => "en" match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"] }}output部分
这里就是很简单往es中发送数据
这里有个user和password,其实elasticsearch加上shield就可以强制使用用户名密码登录了。这里的output就是配置这个使用的。
查询elasticsearch
比如上面的例子,我要查询某段时间的params.source(其实是source参数,但是前面的params是前缀)调用情况
$url = 'http://xx.xx.xx.xx:9200/logstash-*/_search';$filter = '{ "query": { "range" : { "@timestamp" : { "gt" : 123213213213, "lt" : 123213213213 } } }, "aggs" : { "group_by_source" : {"terms" : {"field" : "params.source"}} }, "size": 0}';声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
ubuntu下的nginx服务器配置详解1.nginx服务器的安装sudoapt-getinstallnginx2.nginx服务器的启动sudo/etc/in
nginx的日志配置可以参见《nginx日志配置指令详解》一文。如果要想以json格式记录nginx日志以便logstash分析,该如何指定日志格式呢?可以按照
真正意义上的网站分析是从服务器日志开始的,而且直到今天,分析服务器(也称为serverlogfile,或简称logfile)日志仍然是网站分析的重要方法。很多站
详解Nginx和PHP的两种部署方式的对比2种部署方式简介第一种前置1台nginx服务器做HTTP反向代理和负载均衡后面N太服务器的Nginx做Web服务,并调
一、Nginx服务器解决方法服务器使用的是Nginx,要在响应的头部添加Access-Control-Allow-Origin字段,添加方法是用add_head