目录
一、Logstash Output 插件
-
stdout
-
file
-
elasticsearch
1.1 stdout 插件
stdout 插件将数据输出到屏幕终端,便于调试:
output {
stdout {
codec => rubydebug
}
}
1.2 file 插件
输出到文件,实现将分散在多地的文件统一到一处。比如将所有 web 机器的 web 日志收集到一个文件中,从而方便查阅信息。
output {
file {
path => "/var/log/web.log"
}
}
1.3 elastic 插件
输出到 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
}
}
二、Logstash 分析 App 日志实践
2.1 APP 日志收集概述
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
2.2 APP 日志收集架构
2.3 APP 日志收集思路
-
首先通过 Filebeat 读取日志文件中的内容,并目将内容发送给 Logstash;
-
Logstash 接收到内容后,将数据转换为结构化数据,然后输出给 Elasticsearch;
-
Kibana 添加 Elasticsearch 索引,读取数据,然后在 Kibana 中进行分析,最后进行展示。
2.4 配置 Filebeat
[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
2.5 配置 Logstash
[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}"作为索引名,同时覆盖默认的模板。
2.6 配置 kibana
2.6.1 创建 kibana 索引
2.6.2 创建饼图
2.6.3 创建标签云
2.6.4 整合
三、Logstash 分析 Nginx 日志实践
3.1 Nginx 日志收集概述
使用 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
3.2 Nginx 日志收集架构
3.3 Nginx 日志收集实践
3.3.1 配置 logstash
[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
3.3.2 配置 Filebeat
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
3.3.3 配置 Kibana
创建 Kibana 索引:
整合:
四、Logstash 分析 MySQL 日志实践
4.1 MySQL 日志收集概述
4.1.1 什么是慢日志
当 SQL 语句执行时间超过所设定的闻值时,便会记录到指定的日志文件中,所记录内容称之为慢查询日志。
4.1.2 为什么要收集慢日志
数据库在运行期间,可能会存在 SQL 语查询过慢,那我们如何快速定位、分析哪些 SQL 语句需要优化处理又是哪些 SQL 语句给业务系统造成影响呢?
当我们进行统一的收集分析,SQL 语句执行的时间,以及执行的 SQL 语句,一目了然。
4.2 MySQL 日志收集架构
4.3 MySQL 慢日志思路
-
安装 MySQL;开启 MySQL 慢查询日志功能;
-
配置 filebeat 收集本地慢查询日志路径;使用 exclude_lines 排除无用行;使用 multiline 对内容进行合并;
-
配置 logstash 使用 grok 插件将 mysq 慢日志格式化为 json格式;使用 date 插件将 timestamp 时间转换为本地时间,然后覆盖 @timestamp
-
检查 json 格式是否成功,成功后可以将没用的字段删除;
-
最后将输出到屏幕的内容,输出至Elasticsearch集群。
4.4 MySQL 慢日志收集实践
4.4.1 配置 MySQL
安装 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 秒的查询将被认为是慢查询,进而被记录在慢查询日志文件中。
4.4.2 配置 Filebeat
[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
4.4.3 配置 Logstash
[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}\] @ (?:(?<Clienthost>\S*) )?\[(?:%{IP:Client_IP})?\] # Thread_id: %{NUMBER:Thread_id:integer}\s+ Schema: (?:(?<DBname>\S*) )\s+QC_hit: (?:(?<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*(?<Query>(?<Action>\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
4.4.4 配置 kibana
上一篇文章:【Elastic (ELK) Stack 实战教程】07、Logstash 快速入门及 Input、Filter 插件讲解_Stars.Sky的博客-CSDN博客
下一篇文章:【Elastic (ELK) Stack 实战教程】09、Kibana 分析站点业务日志_Stars.Sky的博客-CSDN博客