ELK Stack 组成
Software | Description | Function |
---|---|---|
E:Elasticsearch | Java 程序 | 存储,查询日志 |
L:Logstash | Java 程序 | 收集、过滤日志 |
K:Kibana | Java 程序 | 提供 Web 服务,将数据页面化 |
F:Filebeat | Go 程序 | 收集、过滤日志 |
ELK Stack 功能
收集: 收集所有服务器的日志
传输: 把日志稳定的传输到 ES 或者其他地方
存储: ES 能有效快速的存储日志数据
分析: 通过 Web 页面分析数据
监控: 监控集群架构
ELK Stack 优点
处理方式灵活:Elasticsearch 是实时全文索引,具有强大的搜索功能
配置相对简单:Elasticsearch 全部使用 JSON 接口,Logstash 使用模块配置,Kibana 的配置文件部分更简单。
检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
集群线性扩展:Elasticsearch 和 Logstash 都可以灵活线性扩展
前端操作绚丽:Kibana 的前端设计比较绚丽,而且操作简单
ELK Stack 用途
#=========== 收集所有的日志 ===========#
### 收集 Web 服务日志
### 收集服务日志
### 收集系统日志
#============ 统计、分析 =============#
### 统计访问量
### 统计访问量前 10 的 IP
### 站点访问次数最多的 URL
### 查询一上午以上三个值
### 查询一下午以上三个值
### 对比一下上下午用户访问量
### 对比这一周,每天用户增长还是减少
部署 ElasticSearch(走你)
部署 Kibana(走你)
部署 Logstash
安装 Java 环境
[root@web01 ~]# rpm -Uvh jdk-8u181-linux-x64.rpm
服务器时间同步
[root@web01 ~]# ntpdate time1.aliyun.com
安装 Logstash
# 上传
[root@web01 ~]# rz logstash-6.6.0.rpm
# 安装
[root@web01 ~]# rpm -ivh logstash-6.6.0.rpm
# 授权,已经授权
[root@web01 ~]# chown -R logstash.logstash /usr/share/logstash/
# 启动命令(需要指定配置文件等参数)
/usr/share/logstash/bin/logstash
Logstash 初识
输入输出插件介绍
# INPUT、OUTPUT 插件
INPUT:插件使 Logstash 收集指定源的日志
OUTPUT:插件将事件数据发送到特定的目的地
INPUT 支持事件源 | OUTPUT 支持输出源 | CODEC 编解码器支持编码 |
---|---|---|
azure_event_hubs(微软云事件中心) | elasticsearch(搜索引擎数据库) | avro(数据序列化) |
beats(filebeat日志收集工具) | email(邮件) | CEF(嵌入式框架) |
elasticsearch(搜索引擎数据库) | file(文件) | es_bulk(ES中的bulk api) |
file(文件) | http(超文本传输协议) | Json(数据序列化、格式化) |
generator(生成器) | kafka(基于java的消息队列) | Json_lines(便于存储结构化) |
heartbeat(高可用软件) | rabbitmq(消息队列 OpenStack) | line(行) |
http_poller(http api) | redis(缓存、消息队列、NoSQL) | multiline(多行匹配) |
jdbc(java连接数据库的驱动) | s3*(存储) | plain(纯文本,事件间无间隔) |
kafka(基于java的消息队列) | stdout(标准输出) | rubydebug(ruby语法格式) |
rabbitmq(消息队列 OpenStack) | tcp(传输控制协议) | |
redis(缓存、消息队列、NoSQL) | udp(用户数据报协议) | |
s3*(存储) | ||
stdin(标准输入) | ||
syslog(系统日志) | ||
tcp(传输控制协议) | ||
udp(用户数据报协议) |
Logstash 输入输出测试
# 配置环境变量
[root@web01 ~]# vim /etc/profile.d/logstash.sh
export PATH=/usr/share/logstash/bin/:$PATH
# 收集标准输入到标准输出测试
[root@web01 ~]# logstash -e 'input { stdin {} } output { stdout {} }'
# 测试输入
123456
{
# 时间戳
"@timestamp" => 2020-08-13T01:34:24.430Z,
# 主机
"host" => "web01",
# 版本
"@version" => "1",
# 内容
"message" => "123456"
}
# 收集标准输入到标准输出指定格式
[root@web01 ~]# logstash -e 'input { stdin {} } output { stdout { codec => rubydebug } }'
123456
{
"message" => "123456",
"@version" => "1",
"@timestamp" => 2020-08-13T01:39:40.837Z,
"host" => "web01"
}
Logstash 收集标准输入到文件
# 收集标准输入到文件
[root@web01 ~]# logstash -e 'input { stdin {} } output { file { path => "/tmp/test.txt" } }'
# 收集标准输入到文件
[root@web01 ~]# logstash -e 'input { stdin {} } output { file { path => "/tmp/test_%{+YYYY-MM-dd}.txt" } }'
Logstash 收集标准输入到 ES
# 收集标准输入到ES
[root@web01 ~]# logstash -e 'input { stdin {} } output { elasticsearch { hosts => ["10.0.0.51:9200"] index => "test_%{+YYYY-MM-dd}" } }'
# 随便输入些内容
# 查看页面
Logstash 使用
Logstash 是一个开源的数据收集引擎,可以水平伸缩,而且 Logstash 整个 ELK Stack 当中拥有最多插件的一个组件,其可以接收来自不同来源的数据并统一输出到指定的且可以是多个不同目的地
Logstash 配置文件
# 默认的配置文件
/etc/logstash/logstash.yml
# 一般不使用,只有 Systemd 管理时默认使用,但 Systemd 启动 Logstash 会有许多坑
收集文件日志到文件
编辑配置文件
[root@web01 ~]# vim /etc/logstash/conf.d/message_file.conf
input {
file {
path => "/var/log/messages"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
output {
file {
path => "/tmp/message_file_%{+YYYY-MM-dd}.log"
}
}
指定配置启动
# 检测配置(速度和启动一样慢)
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_file.conf -t
# 启动
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_file.conf
查看是否生成文件
[root@web01 tmp]# ll
total 4
-rw-r--r-- 1 root root 1050 Aug 13 11:24 message_file_2020-08-13.log
收集文件日志到 ElasticSearch
编辑配置文件
[root@web01 ~]# vim /etc/logstash/conf.d/message_es.conf
input {
file {
path => "/var/log/messages"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
output {
elasticsearch {
hosts => ["10.0.0.51:9200","10.0.0.52:9200","10.0.0.53:9200"]
index => "message_es_%{+YYYY-MM-dd}"
}
}
指定配置启动
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_es.conf
查看是否生成索引数据
用 ES-Head 观察是否生成索引数据,若数据收集成功,Kibana 也可以添加该索引模板,收集 ElasticSearch 中的日志数据
Logstash 多实例收集日志
创建多个数据目录
[root@web01 ~]# mkdir /data/logstash/{message_file,message_es} -p
# 授权
[root@web01 ~]# chown -R logstash.logstash /data/
指定数据目录启动
# 指定配置文件,以及数据目录
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_es.conf --path.data=/data/logstash/message_es &
[1] 18693
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_file.conf --path.data=/data/logstash/message_file &
[2] 18747
## logstash 更多选项可以观察命令帮助
验证文件以及索引数据
观察文件是否生成,观察 ElasticSearch 数据库中是否有新的索引和文档
Logstash 单实例收集多份日志
收集日志到文件
# 编辑配置文件
[root@web01 ~]# vim /etc/logstash/conf.d/more_file.conf
input {
file {
type => "messages_log"
path => "/var/log/messages"
start_position => "beginning"
}
file {
type => "secure_log"
path => "/var/log/secure"
start_position => "beginning"
}
}
output {
if [type] == "messages_log" {
file {
path => "/tmp/messages_%{+YYYY-MM-dd}"
}
}
if [type] == "secure_log" {
file {
path => "/tmp/secure_%{+YYYY-MM-dd}"
}
}
}
收集日志到 ElasticSearch
[root@web01 conf.d]# cat nginx_tomcat.conf
input {
file {
type => "nginx_log"
path => "/var/log/nginx/access.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
file {
type => "tomcat_log"
path => "/usr/local/tomcat/logs/localhost_access_log.*.txt"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
output {
if [type] == "nginx_log" {
elasticsearch {
hosts => ["10.0.0.121:9200"]
index => "nginx_%{+YYYY-MM-dd}"
}
}
if [type] == "tomcat_log" {
elasticsearch {
hosts => ["10.0.0.121:9200"]
index => "tomcat_%{+YYYY-MM-dd}"
}
}
}
# 如果资源充足,可以使用多实例收集多日志,如果服务器资源不足,启动不了多实例,配置一个文件收集多日志启动