ELK实践(二):收集Nginx日志
Nginx访问日志
这里补充下Nginx访问日志使用的说明。一般在nginx.conf主配置文件里需要定义一种格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
上面的格式我是基于默认的加了一个$request_time
。
然后子配置使用:
access_log logs/myapp.log main;
即可。
Filebeat采集日志数据到ElasticSearch
配置:
su -e elk
cd /usr/local/elk
vim beats/filebeat/filebeat.test_nginx.yml
配置详情:
filebeat.prospectors:
- type: log
input_type: log
paths:
- /work/yphp/nginx/logs/*.log
tags: ["ngx", "yujc"]
fields:
logIndex: nginx
docType: nginx-access
fields_under_root: true
tail_files: false
output.elasticsearch:
hosts: ["127.0.0.1:9200"]
index: "test-nginx-%{+yyyy.MM.dd}"
配置说明:
filebeat.prospectors:
- type 日志类型,默认log
- input_type 输入类型,默认log
- paths 采集的日志,可以使用通配符。支持多个
- tags 自定义标签,是个数组。自定义
- fields 自定义字段
- fields_under_root 自定义字段是否追加到根。如果为false,fields配置的字段键名是fields
- tail_files 是否从末尾开始采集
- document_type 自定义字段,用于Logsatsh区分来源,在Logsatsh里用变量
type
表示
output.elasticsearch:
- hosts 配置ES节点,数组格式,支持多个。
- index 配置ES索引。不配置使用默认的 filebeat-*
- protocol 配置协议,例如http,https
- username 配置ES用户名,例如elastic
- password 配置ES密码,例如changeme
设置权限600,并启动filebeat:
chmod -R 600 beats/filebeat/filebeat.test_nginx.yml
./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx.yml
然后访问Nginx应用,查看ES是否新增了一个索引:
$ curl http://127.0.0.1:9200/_cat/indices?v | grep test-nginx
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
105 1161 105 1161 0 0 123k 0 --:--:-- --:--:-- --:--:-- 125k
yellow open test-nginx-2018.09.24 ArxrVVOkTjG8ZlXJjb9bVg 5 1 1 0 11.6kb 11.6kb
我们查看一条数据:
$ curl http://127.0.0.1:9200/test-nginx-2018.09.24/_search?q=*&size=1
{
"_index": "test-nginx-2018.09.24",
"_type": "doc",
"_id": "AWYKkBqtJzfnbYlB_DRX",
"_version": 1,
"_score": null,
"_source": {
"@timestamp": "2018-09-24T07:51:43.140Z",
"beat": {
"hostname": "2106567e5bce",
"name": "2106567e5bce",
"version": "5.6.2"
},
"docType": "nginx-access",
"input_type": "log",
"logIndex": "nginx",
"message": "172.16.10.1 - - [24/Sep/2018:07:51:40 +0000] \"GET /?time=22 HTTP/1.1\" 200 97991 \"-\" \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\" \"-\" 0.009",
"offset": 5243,
"source": "/work/yphp/nginx/logs/hello71.log",
"tags": [
"ngx",
"yujc"
],
"type": "log"
},
"fields": {
"@timestamp": [
1537775503140
]
},
"sort": [
1537775503140
]
}
可以看到已经有数据了。但是日志内容作为一个整体(字段是message
)了。
Filebeat采集日志数据,Logstash过滤发到ElasticSearch
配置:
su -e elk
cd /usr/local/elk
vim beats/filebeat/filebeat.test_nginx2.yml
配置详情:
filebeat.prospectors:
- type: log
input_type: log
paths:
- /work/yphp/nginx/logs/*.log
tags: ["ngx", "yujc"]
fields:
logIndex: nginx
docType: nginx-access
fields_under_root: true
tail_files: false
output.logstash:
hosts: ["127.0.0.1:5044"]
配置logstash
su -e elk
cd /usr/local/elk
vim logstash/config/conf.d/filebeat.conf
配置详情:
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] \"%{WORD:method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent:bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\" \"%{DATA:x_forwarded_for}\" %{NUMBER:request_time}" }
remove_field => "message"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "test-nginx2-%{type}-%{+YYYY.MM.dd}"
document_type => "%{type}"
}
stdout { codec => rubydebug }
}
我使用的nginx日志格式是在标准格式后面加了2个字段$http_x_forwarded_for
和$request_time
:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
日志示例:
172.16.10.1 - - [24/Sep/2018:09:04:40 +0000] "GET /?time=2244 HTTP/1.1" 200 98086 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-" 0.002
上面的grok表达式是:
%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] \"%{WORD:method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent:bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\" \"%{DATA:x_forwarded_for}\" %{NUMBER:request_time}
我们先使用Grok Debugger 工具在线调试下,看看写的grok是否正确。我之前没有测试之前启动,发现ES里没有grok里解析出来的字段,后来在命令行看到filebeat的输出(前台运行):
$ ./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx2.yml
{
"@timestamp" => 2018-09-24T09:01:19.555Z,
"logIndex" => "nginx",
"offset" => 6467,
"docType" => "nginx-access",
"@version" => "1",
"input_type" => "log",
"beat" => {
"name" => "2106567e5bce",
"hostname" => "2106567e5bce",
"version" => "5.6.2"
},
"host" => "2106567e5bce",
"source" => "/work/yphp/nginx/logs/hello71.log",
"message" => "172.16.10.1 - - [24/Sep/2018:09:01:14 +0000] \"GET /?time=2244 HTTP/1.1\" 200 98087 \"-\" \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\" \"-\" 0.195",
"type" => "log",
"tags" => [
[0] "ngx",
[1] "yujc",
[2] "beats_input_codec_plain_applied",
[3] "_grokparsefailure"
]
}
最后面提示了_grokparsefailure
,说明grok部分写的有问题。由于是参考的网上教程,也加上刚接触,不知道怎么配置,filebeat.conf调试了很久才生效。
我们打开Grok Debugger,第一个输入框输入filebeat采集的消息原文message字段里的内容,第二个输入框输入grok表达式:
点击Go按钮即可解析。如果下面的内容是{}
说明解析失败,然后可以修改表达式,该工具会自动解析。最终解析结果:
{
"remote_ip": [
[
"172.16.10.1"
]
],
"HOSTNAME": [
[
"172.16.10.1"
]
],
"IP": [
[
null
]
],
"IPV6": [
[
null
]
],
"IPV4": [
[
null
]
],
"user_name": [
[
"-"
]
],
"time": [
[
"24/Sep/2018:08:47:59 +0000"
]
],
"MONTHDAY": [
[
"24"
]
],
"MONTH": [
[
"Sep"
]
],
"YEAR": [
[
"2018"
]
],
"TIME": [
[
"08:47:59"
]
],
"HOUR": [
[
"08"
]
],
"MINUTE": [
[
"47"
]
],
"SECOND": [
[
"59"
]
],
"INT": [
[
"+0000"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/?time=2244"
]
],
"http_version": [
[
"1.1"
]
],
"BASE10NUM": [
[
"1.1",
"200",
"98086",
"0.002"
]
],
"response_code": [
[
"200"
]
],
"body_sent": [
[
"98086"
]
],
"referrer": [
[
"-"
]
],
"agent": [
[
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
]
],
"x_forwarded_for": [
[
"-"
]
],
"request_time": [
[
"0.002"
]
]
}
然后可以启动logstash了。
测试logstash配置是否通过:
./logstash/bin/logstash -f logstash/config/conf.d/filebeat.conf --config.test_and_exit
Config Validation Result: OK. Exiting Logstash
# 启动logstash
./logstash/bin/logstash &
# 启动filebeat
./beats/filebeat/filebeat -c beats/filebeat/filebeat.test_nginx2.yml
我们再次访问Nginx应用,然后我们查看一条数据:
$ curl http://127.0.0.1:9200/test-nginx2-log-2018.09.24/_search?q=*&size=1&sort=@timestamp:desc
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": null,
"hits": [
{
"_index": "test-nginx2-log-2018.09.24",
"_type": "log",
"_id": "AWYK0to8JzfnbYlB_DRx",
"_score": null,
"_source": {
"response_code": "200",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"logIndex": "nginx",
"offset": 6875,
"method": "GET",
"docType": "nginx-access",
"user_name": "-",
"input_type": "log",
"http_version": "1.1",
"source": "/work/yphp/nginx/logs/hello71.log",
"message": """172.16.10.1 - - [24/Sep/2018:09:04:40 +0000] "GET /?time=2244 HTTP/1.1" 200 98086 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-" 0.002""",
"type": "log",
"url": "/?time=2244",
"tags": [
"ngx",
"yujc",
"beats_input_codec_plain_applied"
],
"x_forwarded_for": "-",
"referrer": "-",
"@timestamp": "2018-09-24T09:04:40.404Z",
"remote_ip": "172.16.10.1",
"request_time": "0.002",
"@version": "1",
"beat": {
"name": "2106567e5bce",
"hostname": "2106567e5bce",
"version": "5.6.2"
},
"host": "2106567e5bce",
"body_sent": "98086",
"time": "24/Sep/2018:09:04:40 +0000"
},
"sort": [
1537779880404
]
}
]
}
}
里面就包含了所有我们解析出来的字段。
kibana里查看
打开kibana web地址:http://127.0.0.1:5601,依次打开:Management
-> Kibana
-> Index Patterns
,选择Create Index Pattern
:
a. Index pattern 输入:test-nginx2-*
;
b. Time Filter field name 选择 @timestamp
。
c. 点击Create。
然后打开Discover,选择 filebeat-* 就能看到日志数据了。
可以看到详细字段:
参考
1、Logstash使用grok过滤nginx日志(二) - Orgliny - 博客园
https://www.cnblogs.com/Orgliny/p/5592186.html
2、Rsyslog日志服务搭建 - K‘e0llm - 博客园
http://www.cnblogs.com/Eivll0m/p/6700828.html
3、Logstash中如何处理到ElasticSearch的数据映射 - Cocowool - 博客园
https://www.cnblogs.com/cocowool/p/7347069.html
4、ELK 架构之 Logstash 和 Filebeat 安装配置 - 田园里的蟋蟀 - 博客园
http://www.cnblogs.com/xishuai/p/elk-logstash-filebeat.html
5、搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器-zero菌-51CTO博客
http://blog.51cto.com/zero01/2082794
ELK实践(二):收集Nginx日志的更多相关文章
- ELK 二进制安装并收集nginx日志
对于日志来说,最常见的需求就是收集.存储.查询.展示,开源社区正好有相对应的开源项目:logstash(收集).elasticsearch(存储+搜索).kibana(展示),我们将这三个组合起来的技 ...
- ELK日志系统之使用Rsyslog快速方便的收集Nginx日志
常规的日志收集方案中Client端都需要额外安装一个Agent来收集日志,例如logstash.filebeat等,额外的程序也就意味着环境的复杂,资源的占用,有没有一种方式是不需要额外安装程序就能实 ...
- ELK 6安装配置 nginx日志收集 kabana汉化
#ELK 6安装配置 nginx日志收集 kabana汉化 #环境 centos 7.4 ,ELK 6 ,单节点 #服务端 Logstash 收集,过滤 Elasticsearch 存储,索引日志 K ...
- ELK Stack (2) —— ELK + Redis收集Nginx日志
ELK Stack (2) -- ELK + Redis收集Nginx日志 摘要 使用Elasticsearch.Logstash.Kibana与Redis(作为缓冲区)对Nginx日志进行收集 版本 ...
- ELK filter过滤器来收集Nginx日志
前面已经有ELK-Redis的安装,此处只讲在不改变日志格式的情况下收集Nginx日志. 1.Nginx端的日志格式设置如下: log_format access '$remote_addr - $r ...
- 安装logstash5.4.1,并使用grok表达式收集nginx日志
关于收集日志的方式,最简单性能最好的应该是修改nginx的日志存储格式为json,然后直接采集就可以了. 但是实际上会有一个问题,就是如果你之前有很多旧的日志需要全部导入elk上查看,这时就有两个问题 ...
- ELK整合Filebeat监控nginx日志
ELK 日志分析 1. 为什么用到 ELK 一般我们需要进行日志分析场景:直接在日志文件中 grep. awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如 ...
- 第七章·Logstash深入-收集NGINX日志
1.NGINX安装配置 源码安装nginx 因为资源问题,我们先将nginx安装在Logstash所在机器 #安装nginx依赖包 [root@elkstack03 ~]# yum install - ...
- Docker 部署 ELK 收集 Nginx 日志
一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...
随机推荐
- django安装及简单使用
1 web应用2 cs和bs架构3 http协议----重点 -特点:1 2 3 4 -请求头: 请求首行 get / http/1.1\r\n key:value\r\n key:value\r\n ...
- C#框架类
C# 开源框架(整理) Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用J ...
- 如何定制 antd 的样式(theme)
> antd 的组件样式(主题)是支持定制的,它的样式实现是基于 less.官方的订制手册参看 https://github.com/ant-design/ant-design/blob/mas ...
- Linux 入门视频教程
http://v.youku.com/v_show/id_XNzM4NTU0MjQ4.html?f=28697585&o=1 1.1.1 Linux系统简介-UNIX发展历史和发行版本http ...
- 基于UML的时空建模
一.基本信息 标题:基于UML的时空建模 时间:2018 出版源:东北大学学报(自然科学版) 领域分类:UML模型:RCC-8空间拓扑:Allen-13时态拓扑:时空数据:建模 二.研究背景 问题定义 ...
- karaf 控制台 常用linux指令(1)
0,切换命令当前域名 -bash代码 *:feature 命令是由域名+命令名组成的,切换当前域名,比如切换到*:feature,那么再输入list,则执行的是feature:list,切换到*:bu ...
- Readme.txt
进入大学,越来越发现自学确实很重要,在学习计算机上,老师上课讲的远远不够,光凭理论是不够的.第一个接触的是VC++6.0这个老版的软件,一节理论课可以过三章内容着实惊吓,现在发现Vscode 可以将代 ...
- PMP:8.项目质量管理
内容中包含 base64string 图片造成字符过多,拒绝显示
- es6的几种写法
语法:1.只有一个参数,可以不用写小括号: var single = a => a; //相当于var single = function(a){return a;}console.log(si ...
- Jenkins的初级应用(1)-Publish Over SSH
作为Jenkins最基本的应用也是重要的一环就是可以把文件传到服务器上面,或者在服务器上面远程执行命令.一个可在在远程分发了文件之后就控制远程服务器的操作.另外一个就是分发了文件之后,结合自动化工具在 ...