目录
一、Logstash Output 插件
1.1 stdout 插件
1.2 file 插件
1.3 elastic 插件
二、Logstash 分析 App 日志实践
2.1 APP 日志收集概述
2.2 APP 日志收集架构
2.3 APP 日志收集思路
2.4 配置 Filebeat
2.5 配置 Logstash
2.6 配置 kibana
2.6.1 创建 kibana 索引
2.6.2 创建饼图
2.6.3 创建标签云
2.6.4 整合
三、Logstash 分析 Nginx 日志实践
3.1 Nginx 日志收集概述
3.2 Nginx 日志收集架构
3.3 Nginx 日志收集实践
3.3.1 配置 logstash
3.3.2 配置 Filebeat
3.3.3 配置 Kibana
四、Logstash 分析 MySQL 日志实践
4.1 MySQL 日志收集概述
4.1.1 什么是慢日志
4.1.2 为什么要收集慢日志
4.2 MySQL 日志收集架构
4.3 MySQL 慢日志思路
4.4 MySQL 慢日志收集实践
4.4.1 配置 MySQL
4.4.2 配置 Filebeat
4.4.3 配置 Logstash
4.4.4 配置 kibana
stdout
file
elasticsearch
stdout 插件将数据输出到屏幕终端,便于调试:
output {
stdout {
codec => rubydebug
}
}
输出到文件,实现将分散在多地的文件统一到一处。比如将所有 web 机器的 web 日志收集到一个文件中,从而方便查阅信息。
output {
file {
path => "/var/log/web.log"
}
}
输出到 elasticsearch,是最常用的输出插件:
output {
elasticsearch {
# 一般写 data 节点地址
hosts => ["192.168.170.132:9200","192.168.170.133:9200","192.168.170.134:9200"]
# 索引名称
index => "nginx-%{+YYYY.MM.dd}"
# 覆盖索引模板
template_overwrite => true
}
}
APP日志,主要是用来记录用户的操作,大体内容如下:
[INFO] 2022-08-28 08:08:12 [cn.sky.dashboard.Main] - DAU|9136|加入收藏|2022-08-28 01:05:02
[INFO] 2022-08-28 08:08:14 [cn.sky.dashboard.Main] - DAU|5035|搜索|2022-08-28 01:07:01
[INFO] 2022-08-28 08:08:15 [cn.sky.dashboard.Main] - DAU|669|使用优惠券|2022-08-28 08:05:13
首先通过 Filebeat 读取日志文件中的内容,并目将内容发送给 Logstash;
Logstash 接收到内容后,将数据转换为结构化数据,然后输出给 Elasticsearch;
Kibana 添加 Elasticsearch 索引,读取数据,然后在 Kibana 中进行分析,最后进行展示。
[root@se-node3 /]# vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log # 收集日志的类型
enabled: true # 启用日志收集
paths:
- /opt/app.log # 日志所在路径
output.logstash: # 输出日志到logstash
hosts: ["192.168.170.132:5044"] # logstash 所在节点IP
[root@se-node3 /]# systemctl restart filebeat.service
[root@es-node1 /]# vim /etc/logstash/conf.d/test5.conf
input {
beats {
port => 5044
}
}
filter {
mutate {
split => { "message" => "|" }
# 添加字段
add_field => {
"UserID" => "%{[message][1]}"
"Action" => "%{[message][2]}"
"Date" => "%{[message][3]}"
}
convert => {
"UserID" => "integer"
"Action" => "string"
"Date" => "string"
}
remove_field => ["message"]
}
date {
# 2022-08-28 01:05:02
match => ["Date", "yyyy-MM-dd HH:mm:ss"]
target => "@timestamp"
timezone => "UTC"
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["192.168.170.132:9200","192.168.170.133:9200","192.168.170.134:9200"]
index => "app-%{+YYYY.MM.dd}"
template_overwrite => true
}
}
[root@es-node1 /]# logstash -f /etc/logstash/conf.d/test5.conf -r
这个Logstash配置文件的含义如下:
(1)输入部分(input):使用beats作为输入插件,监听在5044端口上。
(2)过滤部分(filter):对从beats输入的日志进行处理,包括:
将"message"字段按"|"分隔为三个子字段;
添加三个新字段,分别为"UserID"、"Action"和"Date",它们的值分别来自于"message"字段的第1、2、3个子字段;
将"UserID"字段转换为整数类型,将"Action"和"Date"字段转换为字符串类型;
删除"message"字段;
(3)日期部分(date):将"Date"字段解析为日期格式,并将其作为时间戳赋值给"@timestamp"字段,使用UTC时区。
(4)输出部分(output):将处理过的日志输出到控制台和Elasticsearch中。
控制台输出使用"stdout"插件,并将日志格式设置为 rubydebug;
Elasticsearch 输出使用"elasticsearch"插件,将日志发送到三个 Elasticsearch 节点上,使用"app-%{+YYYY.MM.dd}"作为索引名,同时覆盖默认的模板。
使用 Logstash 对文件 access-Togstash-2015-1122.1og 进行日志分析。
123.150.183.45 - - [22/Nov/2022:12:01:01 +0800] "GET /online/ppjonline/images/forms/validatePass.png HTTP/1.1" 200 370 "http://www.papaonline.com.cn/online/ppjonline/order/orderNow.jsp" "Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; SCH-N719 Build/JSS15J) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.5.489 U3/0.8.0 Mobile Safari/533.1"
101.226.61.184 - - [22/Nov/2022:11:02:00 +0800] "GET /mobile/sea-modules/gallery/zepto/1.1.3/zepto.js HTTP/1.1" 200 24662 "http://m.papaonline.com.cn/mobile/theme/ppj/home/index.html" "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; HUAWEI CRR-UL00 Build/HUAWEICRR-UL00) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025478 Mobile Safari/533.1 MicroMessenger/6.3.7.51_rbb7fa12.660 NetType/3gnet Language/zh_CN"
整体实现思路:
将 Nginx 普通日志转换为 json
将 Nginx 日志的时间格式进行格式化输出
将 Nginx 日志的来源 IP 进行地域分析
将 Nginx 日志的 user-agent 字段进行分析
将 Nginx 日志的 bytes 修改为整数
移除没有用的字段:message、headers
[root@es-node1 /]# vim /etc/logstash/conf.d/test6.conf
input {
beats {
port => 5044
}
}
filter {
if "nginx-access" in [tags][0] {
grok {
match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request} (?:HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequet})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:useragent}" }
}
useragent {
source => "useragent"
target => "useragent"
}
geoip {
source => "clientip"
}
date {
match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
timezone => "Asia/Shanghai"
}
mutate {
convert => ["bytes","integer"]
remove_field => ["message"]
add_field => { "target_index" => "logstash-nginx-access-%{+YYYY.MM.dd}" }
}
}
else if "nginx-error" in [tags][0] {
date {
match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
timezone => "Asia/Shanghai"
}
mutate {
add_field => { "target_index" => "logstash-nginx-error-%{+YYYY.MM.dd}" }
}
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["192.168.170.132:9200","192.168.170.133:9200","192.168.170.134:9200"]
index => "%{[target_index]}"
template_overwrite => true
}
}
[root@es-node1 ~]# logstash -f /etc/logstash/conf.d/test6.conf -r
filebeat.inputs:
- type: log # 收集日志的类型
enabled: true # 启用日志收集
paths:
- /opt/access.log # 日志所在路径
tags: ["nginx-access"]
- type: log # 收集日志的类型
enabled: true # 启用日志收集
paths:
- /opt/error.log # 日志所在路径
tags: ["nginx-error"]
output.logstash: # 输出日志到logstash
hosts: ["192.168.170.132:5044"] # logstash 所在节点IP
[root@se-node3 ~]# systemctl restart filebeat.service
创建 Kibana 索引:
整合:
当 SQL 语句执行时间超过所设定的闻值时,便会记录到指定的日志文件中,所记录内容称之为慢查询日志。
数据库在运行期间,可能会存在 SQL 语查询过慢,那我们如何快速定位、分析哪些 SQL 语句需要优化处理又是哪些 SQL 语句给业务系统造成影响呢?
当我们进行统一的收集分析,SQL 语句执行的时间,以及执行的 SQL 语句,一目了然。
安装 MySQL;开启 MySQL 慢查询日志功能;
配置 filebeat 收集本地慢查询日志路径;使用 exclude_lines 排除无用行;使用 multiline 对内容进行合并;
配置 logstash 使用 grok 插件将 mysq 慢日志格式化为 json格式;使用 date 插件将 timestamp 时间转换为本地时间,然后覆盖 @timestamp
检查 json 格式是否成功,成功后可以将没用的字段删除;
最后将输出到屏幕的内容,输出至Elasticsearch集群。
安装 mysql:Linux 部署 JDK+MySQL+Tomcat 详细过程_移植mysql+tomcat_Stars.Sky的博客-CSDN博客
开启慢日志功能:
[root@se-node3 ~]# vim /etc/my.cnf
[mysqld]
······
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2
······
[root@se-node3 ~]# systemctl restart mysqld
# 模拟慢查询
mysql> select sleep(1) user,host from mysql.user;
解释说明:
slow_query_log=1
:此参数用于启用慢查询日志功能。将其设置为 1(或者 ON
)意味着启用慢查询日志,而设置为 0(或者 OFF
)则表示禁用慢查询日志。
slow_query_log_file=/var/log/mysql/slow.log
:此参数定义了慢查询日志文件的存储路径和文件名。在这个例子中,慢查询日志文件将保存在 /var/log/mysql/slow.log
。
long_query_time=2
:此参数定义了一个查询执行所需时间的阈值,以秒为单位。如果查询执行时间超过这个阈值,MySQL 将把它记录在慢查询日志中。在这个例子中,执行时间超过 2 秒的查询将被认为是慢查询,进而被记录在慢查询日志文件中。
[root@se-node3 ~]# vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log # 收集日志的类型
enabled: true # 启用日志收集
paths:
- /var/log/mysql/slow.log # 日志所在路径
tags: ["slow"]
exclude_lines: ['\# Time']
multiline.pattern: '^\# User'
multiline.negate: true
multiline.match: after
multiline.max_lines: 1000
output.logstash: # 输出日志到logstash
hosts: ["192.168.170.132:5044"] # logstash 所在节点IP
[root@se-node3 ~]# systemctl restart filebeat.service
[root@es-node1 ~]# vim /etc/logstash/conf.d/test7.conf
input {
beats {
port => 5044
}
}
filter {
mutate {
gsub => [ "message", "\n", " "]
}
grok {
match => { "message" => "(?m)^# User@Host: %{USER:User}\[%{USER-2:User}\] @ (?:(?\S*) )?\[(?:%{IP:Client_IP})?\] # Thread_id: %{NUMBER:Thread_id:integer}\s+ Schema: (?:(?\S*) )\s+QC_hit: (?:(?\S*) )# Query_time: %{NUMBER:Query_Time}\s+ Lock_time: %{NUMBER:Lock_Time}\s+ Rows_sent: %{NUMBER:Rows_Sent:integer}\s+Rows_examined: %{NUMBER:Rows_Examined:integer} SET timestamp=%{NUMBER:timestamp}; \s*(?(?\w+)\s+.*)" }
}
date {
match => ["timestamp","UNIX", "YYYY-MM-dd HH:mm:ss"]
target => "@timestamp"
timezone => "Asia/Shanghai"
}
mutate {
#移除message等字段
remove_field => ["message","input","timestamp"]
#对Query_time Lock_time 格式转换为浮点数
convert => ["Lock_Time","float"]
convert => ["Query_Time","float"]
#添加索引名称
add_field => { "[@metadata][target_index]" => "logstash-mysql-%{+YYYY.MM.dd}" }
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["192.168.170.132:9200","192.168.170.133:9200","192.168.170.134:9200"]
index => "%{[@metadata][target_index]}"
template_overwrite => true
}
}
[root@es-node1 ~]# logstash -f /etc/logstash/conf.d/test7.conf -r
上一篇文章:【Elastic (ELK) Stack 实战教程】07、Logstash 快速入门及 Input、Filter 插件讲解_Stars.Sky的博客-CSDN博客
下一篇文章:【Elastic (ELK) Stack 实战教程】09、Kibana 分析站点业务日志_Stars.Sky的博客-CSDN博客