【Elastic (ELK) Stack 实战教程】08、Logstash 分析业务 APP、Nginx、Mysql 日志实践

目录

一、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


一、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 日志收集思路 

  1. 首先通过 Filebeat 读取日志文件中的内容,并目将内容发送给 Logstash;

  2. Logstash 接收到内容后,将数据转换为结构化数据,然后输出给 Elasticsearch;

  3. 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"

整体实现思路:

  1. 将 Nginx 普通日志转换为 json

  2. 将 Nginx 日志的时间格式进行格式化输出

  3. 将 Nginx 日志的来源 IP 进行地域分析 

  4. 将 Nginx 日志的 user-agent 字段进行分析 

  5. 将 Nginx 日志的 bytes 修改为整数 

  6. 移除没有用的字段: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 慢日志思路

  1. 安装 MySQL;开启 MySQL 慢查询日志功能;

  2. 配置 filebeat 收集本地慢查询日志路径;使用 exclude_lines 排除无用行;使用 multiline 对内容进行合并;

  3. 配置 logstash 使用 grok 插件将 mysq  慢日志格式化为 json格式;使用 date 插件将 timestamp 时间转换为本地时间,然后覆盖 @timestamp

  4. 检查 json 格式是否成功,成功后可以将没用的字段删除;

  5. 最后将输出到屏幕的内容,输出至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;

解释说明:

  1. slow_query_log=1:此参数用于启用慢查询日志功能。将其设置为 1(或者 ON)意味着启用慢查询日志,而设置为 0(或者 OFF)则表示禁用慢查询日志。

  2. slow_query_log_file=/var/log/mysql/slow.log:此参数定义了慢查询日志文件的存储路径和文件名。在这个例子中,慢查询日志文件将保存在 /var/log/mysql/slow.log

  3. 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博客

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stars.Sky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值