一、ELK介绍
ELK 是三个开源软件的缩写,提供一套完整的企业级日志平台解决方案。
分别是:
• Elasticsearch:搜索、分析和存储数据
• Logstash :采集日志、格式化、过滤,最后将数据推送到Elasticsearch存储
• Kibana:数据可视化
• Beats :集合了多种单一用途数据采集器,用于实现从边缘机器向 Logstash 和
Elasticsearch 发送数据。里面应用最多的是Filebeat,是一个轻量级日志采集器。
二、ELK架构图
三、Elasticsearch
Elasticsearch(简称ES)是一个分布式、RESTful 风格的搜索和数据分析引擎,
用于集中存储日志数据。
Elasticsearch术语:
• Index:索引是多个文档的集合
• Document:Index里每条记录称为Document,若干文档构建一个Index
• Type:一个Index可以定义一种或多种类型,将Document逻辑分组
• Field:ES存储的最小单元
四、Elasticsearch 服务部署
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
支持多种部署方式:
• 二进制包
• yum
• rpm
• docker
4.1、本文以二进制方式部署 Elasticsearch 服务
cd /opt/elk
tar zxvf elasticsearch-7.9.3-linux-x86_64.tar.gz
mv elasticsearch-7.9.3 elasticsearch
useradd es # 出于安全考虑,默认不能用root账号启动
chown -R es:es elasticsearch
4.2、启动先决条件(修改服务器参数)
启动先决条件:
• 调整进程最大打开文件数数量
# 临时设置
ulimit -n 65535
# 永久设置,重启生效
vi /etc/security/limits.conf
* hard nofile 65535
* soft nofile 65535
• 调整进程最大虚拟内存区域数量
# 临时设置
sysctl -w vm.max_map_count=262144
# 永久设置
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
• 配置集群环境
4.3、Elasticsearch master节点配置如下
# vim config/elasticsearch.yml
cluster.name: elk-cluster # 集群名称
node.name: node-1 # 集群节点名称
#path.data: /path/to/data # 数据目录
#path.logs: /path/to/logs # 日志目录
network.host: 0.0.0.0 # 监听地址
http.port: 9200 # 监听端口
# transport.tcp.port: 9300 #内部节点之间通信端口
discovery.seed_hosts: [“192.168.31.61”, “192.168.31.62”,“192.168.31.63”] # 集群节点列表
cluster.initial_master_nodes: [“node-1”] # 首次启动指定的Master节点
4.4、Elasticsearch node1 节点配置如下
# vim config/elasticsearch.yml
cluster.name: elk-cluster # 集群名称
node.name: node-1 # 集群节点名称
#path.data: /path/to/data # 数据目录
#path.logs: /path/to/logs # 日志目录
network.host: 0.0.0.0 # 监听地址
http.port: 9200 # 监听端口
# transport.tcp.port: 9300 #内部节点之间通信端口
discovery.seed_hosts: [“192.168.1.100”, “192.168.1.101”,“192.168.1.102”] # 集群节点列表
# cluster.initial_master_nodes: [“node-1”] # 首次启动指定的Master节点
# node1和node2 不启用此参数,将其注释即可
4.5、Elasticsearch node2 节点配置如下
# vim config/elasticsearch.yml
cluster.name: elk-cluster # 集群名称
node.name: node-1 # 集群节点名称
#path.data: /path/to/data # 数据目录
#path.logs: /path/to/logs # 日志目录
network.host: 0.0.0.0 # 监听地址
http.port: 9200 # 监听端口
# transport.tcp.port: 9300 #内部节点之间通信端口
discovery.seed_hosts: [“192.168.1.100”, “192.168.1.101”,“192.168.1.102”] # 集群节点列表
# cluster.initial_master_nodes: [“node-1”] # 首次启动指定的Master节点
# node1和node2 不启用此参数,将其注释即可
4.6、配置系统服务管理
# cat /usr/lib/systemd/system/elasticsearch.service
[Unit]
Description=elasticsearch
[Service]
User=es
LimitNOFILE=65535
ExecStart=/opt/elk/elasticsearch/bin/elasticsearch
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl start elasticsearch
# systemctl start elasticsearch
# 说明:三个节点相同配置即可
4.7、检查 Elasticsearch 服务是否正常
查看集群节点:curl -XGET 'http://127.0.0.1:9200/_cat/nodes?pretty'
查询集群状态: curl -i -XGET http://127.0.0.1:9200/_cluster/health?pretty
五、Logstash 服务部署
5.1、Logstash 介绍
Logstash能够将采集日志、格式化、过滤,最后将数据推送到Elasticsearch存储。
Input:输入,输入数据可以是Stdin、File、TCP、Redis、Syslog等。
Filter:过滤,将日志格式化。有丰富的过滤插件:Grok正则捕获、Date时间处理、Json编解码、Mutate数据修改等。
Output:输出,输出目标可以是Stdout、File、TCP、Redis、ES等。
5.2、Logstash 部署
5.2.1、本文采用二进制方式部署Logstash
# https://www.elastic.co/cn/downloads/past-releases#logstash # logstash 下载地址
yum install java-1.8.0-openjdk –y
cd /opt/elk
tar zxvf logstash-7.9.3.tar.gz
mv logstash-7.9.3 logstash
5.3、Logstash 配置文件
# vim config/logstash.yml
pipeline: # 管道配置
batch:
size: 125
delay: 5
path.config: /opt/elk/logstash/conf.d # conf.d目录自己创建
# 定期检查配置是否修改,并重新加载管道。也可以使用SIGHUP信号手动触发
# config.reload.automatic: false
# config.reload.interval: 3s
# http.enabled: true
http.host: 0.0.0.0
http.port: 9600-9700
log.level: info
path.logs: /opt/elk/logstash/logs
5.4、配置系统启动Logstash服务
# vi /usr/lib/systemd/system/logstash.service
[Unit]
Description=logstash
[Service]
ExecStart=/opt/elk/logstash/bin/logstash
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
六、Logstash 基本使用
6.1、示例:从标准输入获取日志并打印到标准输出
# logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
hello world
{
"@version" => "1",
"message" => "hello world ",
"@timestamp" => 2020-11-05T09:23:44.025Z,
"host" => "localhost"
}
说明:
默认给日志加的三个字段:
• “@timestamp” 标记事件发生的时间点
•“host” 标记事件发生的主机
•“type” 标记事件的唯一类型
命令行参数:
• -e 字符串形式写配置
• -f 指定配置文件
• -t 测试配置文件语法
6.2、输入插件(Input)
输入阶段:从哪里获取日志
常用插件:
• Stdin(一般用于调试)
• File
• Redis
• Beats(例如filebeat)
6.3、输入插件:File
File插件:用于读取指定日志文件
常用字段:
• path 日志文件路径,可以使用通配符
• exclude 排除采集的日志文件
• start_position 指定日志文件什么位置开始读,默认从结尾
开始,指定beginning表示从头开始读
6.3.1、示例1:读取日志文件并输出到文件
input {
file {
path => "/var/log/test/*.log"
exclude => "error.log"
start_position => "beginning"
}
}
filter {
}
output {
file {
path => "/tmp/test.log"
}
}
6.3.2、示例2:配置日志来源
input {
file {
path => "/var/log/test/*.log"
exclude => "error.log"
start_position => "beginning"
tags => "web"
tags => "nginx"
type => "access"
add_field => {
"project" => "microservice"
"app" => "product"
}
}
}
6.4、输入插件:Beats
Beats插件:接收来自Beats数据采集器发来的数据,例如Filebeat
常用字段:
• host 监听地址
• port 监听端口
6.4.1、示例
input {
beats {
host => "0.0.0.0"
port => 5044
}
}
filter {
}
output {
file {
path => "/tmp/test.log"
}
}
6.5、过滤插件:JSON
JSON插件:接收一个json数据,将其展开为Logstash事件中的
数据结构,放到事件顶层。
常用字段:
• source 指定要解析的字段,一般是原始消息message字段
• target 将解析的结果放到指定字段,如果不指定,默认在
事件的顶层
6.5.1、模拟数据
{"remote_addr": "192.168.1.100","url":"/index","status":"200"}
示例:解析HTTP请求
input {
file {
path => "/var/log/test/*.log"
}
}
filter {
json {
source => "message"
}
}
output {
file {
path => "/tmp/test.log"
}
}
6.6、输出插件(Output)
输出阶段:将处理完成的日志推送到远程数据库存储
常用插件:
• file
• Elasticsearch
6.7、输入插件:Elasticsearch
Elasticsearch插件:将数据推送到ES存储。
常用字段:
• hosts 指定ES主机地址
• index 指定写入的ES索引名称,一般按日期ec 划分
6.7.1、示例
output {
elasticsearch {
hosts =>
["192.168.1.100:9200","192.168.1.101:9200","192.168.1.102:9200"]
index => "microservice-product-%{+YYYY.MM.dd}"
}
}
6.8、条件判断
操作符:
- 比较操作符:==,!= , < , > , <= ,>=
- 正则匹配操作符:=~(匹配正则) ,!~(不匹配正则)
- 成员操作符:in(包含) , not in(不包含)
- 逻辑操作符:and(与),or(或), nand(非与) , xor(非或)
- 一元运算符:!(取反) ,()(复合表达式) ,!()(对复合表达式结果取反)
6.8.1、条件判断语句
if <表达式> {
<语句>
} else if <表达式> {
<语句>
} else {
<语句>
}
6.8.2、示例
input {
file {
path => "/var/log/test/test.log"
add_field => {
"log_type" => "test"
}
}
file {
path => "/var/log/test/prod.log"
add_field => {
"log_type" => "prod"
}
}
}
filter {
if [log_type] in ["test","dev"] {
mutate {
add_field => {
"[@metadata][target_index]" => "test-%{+YYYY.MM}"
}
}
} else if [log_type] == "production" {
mutate {
add_field => {
"[@metadata][target_index]" => "prod-%{+YYYY.MM.dd}"
}
}
} else {
mutate {
add_field => {
"[@metadata][target_index]" => "unknown-%{+YYYY}"
}
}
}
}
output {
elasticsearch {
hosts => "192.168.1.100:9200"
index => "%{[@metadata][target_index]}"
}
}
七、Kibana服务部署
7.1、Kibana介绍
Kibana 是一个图形页面系统,用于对 Elasticsearch 数据可视化。
7.2、Kibana 部署
7.2.1、本文采用二进制方式部署
cd /opt/elk
tar zxvf kibana-7.9.3-linux-x86_64.tar.gz
mv kibana-7.9.3-linux-x86_64 kibana
# vi config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.1.100:9200"]
i18n.locale: "zh-CN"
7.3、配置系统服务管理:
# vi /usr/lib/systemd/system/kibana.service
[Unit]
Description=kibana
[Service]
ExecStart=/opt/elk/kibana/bin/kibana --allow-root
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
八、Filebeat 服务部署
8.1、本文采用RPM安装方式
rpm -ivh filebeat-7.9.3-x86_64.rpm
8.2、配置采集指定日志
# vi /etc/filebeat/filebeat.yml
# 配置不同的输入
- type: log
# 是否启用该输入配置
enabled: false
# 采集的日志文件路径,可以通配
paths:
- /var/log/*.log
# 正则匹配要排除的行,这里以DBG开头的行都过滤掉
#exclude_lines: ['^DBG']
# 正则匹配要采集的行,这里以ERR/WARN开头的行都采集
#include_lines: ['^ERR', '^WARN']
# 排除的文件,默认采集所有
#exclude_files: ['.gz$']
# 添加标签
#tags: ["nginx"]
# 下面fields添加的字段默认是在fields.xxx,可以设置在顶级对象下
# fields_under_root: true
# 自定义添加的字段,一般用于标记日志来源
#fields:
# level: debug
# review: 1
8.2.1、示例
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/test/*.log
tags: ["nginx"]
fields_under_root: true
fields:
project: microservice
app: product
8.3、推送到Logstash或ES
推送到Logstash:
output.logstash:
hosts: ["192.168.1.102:5044"]
推送到ES:
setup.ilm.enabled: false
setup.template.name: "microservice-product"
setup.template.pattern: "microservice-product-*"
output.elasticsearch:
hosts: ["localhost:9200"]
index: "microservice-product-%{+yyyy.MM.dd}"
九、增加数据缓冲队列
9.1、安装redis
yum install redis
bind 0.0.0.0
requirepass 123456
9.2、filebeat配置输出到redis
output.redis:
hosts: ["192.168.31.71:6379"]
password: "123456"
key: "filebeat"
db: 0
datatype: "list"
9.3、检查redis是否有数据
# redis
-cli
-a 123456
127.0.0.1:6379> keys *
1) "filebeat"
9.4、logstash配置从redis里读
input {
redis {
host => "192.168.31.71"
port => 6379
password => "123456"
key => "filebeat"
db => 0
data_type => "list"
}
}