简介
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。
Docker compose安装
安装docker和docker compose:Docker入门基础 – 谢幕后 (xmhweb.cn)
下载项目
apt-get install git
git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
编辑配置文件vim docker-compose.yml
,添加container_name参数,默认的容器名称太冗长了
container_name: elasticsearch
docker-compose.yml文件中有容器自启设置:restart:unless-stopped
restart:unless-stopped
:容器意外停止或退出时,Docker 会重新启动容器
restart:always
:无论容器是如何停止的,都会自动重新启动【即使是手动停止的】
启动项目
使用docker-compose up -d
来启动项目。
docker-compose up 和 docker-compose up -d 都用于启动 Docker Compose 中定义的服务,但它们之间有一些区别:
docker-compose up
:这个命令会启动 Docker Compose 文件中定义的所有服务,并在终端中实时输出它们的日志。当你使用此命令时,你可以看到每个服务的输出,以便及时了解它们的状态和日志信息。通常在开发或调试过程中使用,因为可以即时查看服务的输出。
docker-compose up -d
:这个命令也会启动 Docker Compose 文件中定义的所有服务,但是使用 -d 参数,它会在后台运行服务,不会将服务的输出显示在终端上。与 docker-compose up 不同,它不会实时输出服务的日志信息,而是将服务放在后台运行。通常在生产环境中使用,因为在生产环境中通常不需要即时查看服务的日志,而是希望服务在后台默默地运行。
总的来说,docker-compose up 更适合开发和调试,而 docker-compose up -d 更适合生产环境中的部署。
要完全关闭堆栈并删除所有持久化数据,请使用以下 Docker Compose 命令:docker-compose down -v
。
为了验证,我们可以使用浏览器或者 curl 等工具访问机器地址加端口号 9200,并使用默认用户名elastic
和默认密码changeme
来访问 Elasticsearch HTTP 端口,如果一切正常,你将看到类似下面的结果。
{
"name": "elasticsearch",
"cluster_name": "docker-cluster",
"cluster_uuid": "7S0UwLQTQKmkGNh4cgWbnQ",
"version": {
"number": "8.13.2",
"build_flavor": "default",
"build_type": "docker",
"build_hash": "16cc90cd2d08a3147ce02b07e50894bc060a4cbf",
"build_date": "2024-04-05T14:45:26.420424304Z",
"build_snapshot": false,
"lucene_version": "9.10.0",
"minimum_wire_compatibility_version": "7.17.0",
"minimum_index_compatibility_version": "7.0.0"
},
"tagline": "You Know, for Search"
}
现在不着急访问 Kibana ,我们继续进行配置调整。
重置内建用户密码
使用docker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords auto --batch
命令对服务默认的账户进行默认密码重置,输出如下:
Changed password for user apm_system
PASSWORD apm_system = dLa1we2mehIDvxKjdRNu
Changed password for user kibana_system
PASSWORD kibana_system = ZacLOywPlQ2O2qrBsXVb
Changed password for user kibana
PASSWORD kibana = ZacLOywPlQ2O2qrBsXVb
Changed password for user logstash_system
PASSWORD logstash_system = pnmP0Tl5mw8S025uMpNt
Changed password for user beats_system
PASSWORD beats_system = VVongPz5BdogJH7CA0hR
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = nIiOwnwWYda0ZhQX0Ot5
Changed password for user elastic
PASSWORD elastic = OoXkxKNwAHjbfOyy8VbU
将密码妥善保存后,我们需要将 docker-compose.yml
配置文件中的 elasticsearch 服务的 ELASTIC_PASSWORD
删除,这样可以确保服务启动只使用我们刚刚重置后的密码。
同时需要对 kibana 、 logstash 配置文件中的信息进行替换,将文件中的 elastic 用户的密码进行更新。前面两个文件好像不修改也是可以的,可能需要将kibana.yml文件中的kibana_system用户密码进行替换一下。
- kibana/config/kibana.yml
- logstash/config/logstash.yml
- logstash/pipeline/logstash.conf
需要注意的是, logstash pipeline 需要一个高权限账号vim logstash/pipeline/logstash.conf
,将用户名和密码替换成elastic的:
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "OoXkxKNwAHjbfOyy8VbU"
}
}
在配置修改完毕后,我们执行 docker-compose restart
重启相关服务。
修改默认语言
默认 kibana的界面是英文,设置过程也比较简单:
修改kibana的配置文件(/kibana/config/kibana.yml),在最下方添加一行:i18n.locale: "zh-CN"
。汉化的不是很彻底,总比全英文好一点。
设置好后重启kibana容器:docker restart kibana
。
Docker安装
安装部署elasticsearch
拉取指定镜像
docker pull elasticsearch:7.12.1
创建elasticsearch容器
# 创建⼀个docker⽹络⽤于容器间通信
docker network create elk
# 运⾏
docker run -d --name es --net elk -P -e "discovery.type=single-node" elasticsearch:7.12.1
获取配置⽂件
cd /opt
# 创建elasticsearch⽬录
mkdir -p elasticsearchmk/data
# 将容器内配置⽂件复制到elasticsearch⽬录下
docker cp es:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch
docker cp es:/usr/share/elasticsearch/data /opt/elasticsearch/data
cd elasticsearch
# 修改⽂件权限
chmod 666 elasticsearch.yml
chmod -R 775 data
cd ../
重设elasticsearch容器
# 删除原本容器
docker rm -f es
# 指定名称,⽹络,端⼝,挂载⽬录,镜像名运⾏
docker run -d --name es --net elk -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --privileged=true -v /opt/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/elasticsearch/data/:/usr/share/elasticsearch/data elasticsearch:7.12.1
访问验证
# 查看⽇志
docker logs es
ip地址:9200访问
安装部署kibana
拉取指定镜像
docker pull kibana:7.12.1
创建kibana容器
docker run -d --name kibana --net elk -P -e "ELASTICSEARCH_HOSTS=http://es:9200" -e "I18N_LOCALE=zh-CN" kibana:7.12.1
获取配置⽂件
cd /opt
mkdir kibana
# 复制kibana容器配置⽂件到本地
docker cp kibana:/usr/share/kibana/config/kibana.yml kibana
vim /opt/kibana/kibana.yml
# 建议改为ip,⽅便容器访问
elasticsearch.hosts ["http://10.10.166.214:9200"]
# 设置web界⾯为中⽂
i18n.locale: zh-CN
wq!
# 修改⽂件权限
chmod -R 666 /opt/kibana/kibana.yml
重设kibana容器
# 删除原本容器
docker rm -f kibana
# 指定名称,⽹络,端⼝,⽂件挂载,镜像运⾏
docker run -d --name kibana -p 5601:5601 -v /opt/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml --net elk --privileged=true kibana:7.12.1
访问验证
# 查看kibana⽇志
docker logs kibana
ip地址:5601访问
安装部署logstash
拉取logstash镜像
docker pull logstash:7.12.1
创建logstash容器
docker run -d -P --name logstash --net elk logstash:7.12.1
获取配置⽂件
cd /opt
# 创建logstash⽂件夹
mkdir logstash
# 复制logstash⽂件夹内容到本地
docker cp logstash:/usr/share/logstash/config logstash/
docker cp logstash:/usr/share/logstash/data logstash/
docker cp logstash:/usr/share/logstash/pipeline logstash/
# 添加权限
chmod -R 777 logstash/
修改配置⽂件。
vim /opt/logstash/config/logstash.yml
# 修改为如下内容,elasticsearchIP为部署elasticsearch的服务器地址
xpack.moitoring.elasticsearch.hosts: ["http://10.10.166.214:9200"]
wq!
vim /opt/logstash/pipeline/logstash.conf
# 修改为如下内容
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://10.10.166.214:9200"]
index => "elk"
codec => "json"
}
stdout {
codec => rubydebug
}
}
重设logstash容器
# 删除原本容器
docker rm -f logstash
# 指定名称,端⼝,⽹络,⽂件挂载运⾏
docker run -d --name logstash --net elk --privileged=true -p 5044:5044 -p 9600:9600 -v /opt/logstash/config/:/usr/share/logstash/config -v /opt/logstash/data/:/usr/share/logstash/data -v /opt/logstash/pipeline/:/usr/share/logstash/pipeline logstash:7.12.1
访问验证
docker logs logstash
安装部署filebeat
拉取指定镜像
docker pull elastic/filebeat:7.12.1
创建filebeat容器
docker run -d --name=filebeat elastic/filebeat:7.12.1
获取配置⽂件
cd /opt/
docker cp filebeat:/usr/share/filebeat /opt/filebeat
vim filebeat/filebeat.yml
# 修改如下内容
output.logstash:
hosts: ["10.10.166.214:5044"]
cd /opt/filebeat/
# 应⽤指定模块
./filebeat modules enable system
重设filebeat容器
docker rm -f filebeat
# 指定名称,⽹络,权限,⽂件挂载运⾏
docker run -d --name=filebeat --net=elk --user=root -v /opt/filebeat:/usr/share/filebeat -v /opt/log/messages:/var/log/messages elastic/filebeat:7.12.1
# ps:不知道映射log这个文件干嘛,有什么用途
访问验证
docker logs filebeat
如果权限不⾜报错
# 修改⽂件权限
chmod -R 777 /opt/filebeat
# 进⼊容器
docker exec -it filebeat /bin/bash
# 修改容器内⽂件权限
chmod go-w /usr/share/filebeat/modules.d/system.yml
chmod go-w /usr/share/filebeat/filebeat.yml
chmod go-w /usr/share/filebeat/module/system/auth/manifest.yml
chmod go-w /usr/share/filebeat/module/system/syslog/manifest.yml
# 退出
exit
docker restart filebeat
ip地址:5601访问,搜索Stack Management,查看elk的上传(不知道为什么看不到elk的索引,需要设置nginx的索引才能看到,貌似是因为没有日志内容所以才不显示)。
Nginx日志上传
yum源安装nginx
apt-get install nginx
nginx -v
验证nginx是否安装成功,浏览器访问IP。访问的文件是:/var/www/html/index.nginx-debian.html
。
查看nginx日志保存位置。
vim /etc/nginx/nginx.conf
# 日志目录
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
docker安装nginx
# 拉取镜像
docker pull nginx
# 创建容器
docker run -d -p 8888:80 --privileged=true --net elk --name nginx nginx
# 获取配置文件
mkdir -p /opt/nginx/conf
docker cp nginx:/usr/share/nginx/html /opt/nginx/html
docker cp nginx:/etc/nginx/conf.d/default.conf /opt/nginx/conf/default.conf
docker cp nginx:/etc/nginx/nginx.conf /opt/nginx/
docker cp nginx:/var/log/nginx /opt/nginx/logs
# 重设容器
docker rm -f nginx
docker run -d -p 8888:80 --privileged=true -v /opt/nginx/html:/usr/share/nginx/html -v /opt/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf -v /opt/nginx/logs:/var/log/nginx --net elk --name nginx nginx
将日志目录挂在到logstash容器
# 重设容器
docker rm -f logstash
docker run -d --name logstash --net elk --privileged=true -p 5044:5044 -p 9600:9600 -v /opt/logstash/config/:/usr/share/logstash/config -v /opt/logstash/data/:/usr/share/logstash/data -v /opt/logstash/pipeline/:/usr/share/logstash/pipeline -v /opt/nginx/logs/:/usr/share/logs/ logstash:7.12.1
新建管道配置文件:vim /opt/logstash/pipeline/nginx2.conf
input {
file {
path => ['/usr/share/logs/*']
type => "nginx2-log"
}
}
output {
if[type] == "nginx2-log" {
elasticsearch {
hosts => ["http://10.10.166.214:9200"]
index => "nginx2-log-%{+YYYY-MM-dd}"
}
}
stdout {
codec => rubydebug
}
}
# 应⽤指定模块
cd /opt/filebeat
./filebeat modules enable nginx
重启容器:docker restart logstash
不知道为什么需要设置完nginx日志才能看到elk的索引。
创建索引模式
输入索引模式名称
选择时间字段
搜索Discover
向nginx发送请求,这里就能看到日志了。
群晖NAS日志上传
首先需要在群晖日志中心设置syslog服务器信息
然后新建管道配置文件:vim /opt/logstash/pipeline/nas.conf
input {
tcp {
port => 5044
type => "nas-log"
}
}
output {
if[type] == "nas-log" {
elasticsearch {
hosts => ["http://10.10.166.214:9200"]
index => "nas-log-%{+YYYY-MM-dd}"
}
}
stdout {
codec => rubydebug
}
}
重启容器:docker restart logstash
刚添加好可以搜索到日志,第二天就搜索不到了,不知道为什么,logstash容器有异常日志。
FortiGate防火墙日志上传
防火墙开启日志发送到日志服务器,配置如下:
飞塔防火墙默认端口为514,发送协议默认是UDP,这里我设置成可靠的TCP。
然后新建管道配置文件:vim /opt/logstash/pipeline/fortigate.conf
input {
tcp {
port => 514
type => "fortigate-log"
}
}
output {
if [type] == "fortigate-log" {
elasticsearch {
hosts => ["10.10.166.214:9200"]
index => "fortigate-log-%{+YYYY-MM-dd}"
}
}
stdout {
codec => rubydebug
}
}
拓展
Filebeat和Logstash
Filebeat
和 Logstash
都是 Elastic Stack(也称为 ELK Stack)的一部分,它们各自承担不同的职责,通常配合使用来处理和传输日志数据。下面我将对它们的作用、区别以及如何协作做个详细介绍:
Filebeat 是一个轻量级的日志采集器,它的主要任务是从文件中读取日志数据,并将其传输到指定的目的地(通常是 Elasticsearch 或 Logstash)。
- 用途:
- 轻量级地收集日志文件并将数据传输到 Elasticsearch 或 Logstash。
- 它支持多种日志文件格式,如文本日志、JSON 日志等。
- Filebeat 可以通过指定文件路径或日志文件模式来监控日志文件的变化。
- 它支持多种输出方式(如 Elasticsearch、Logstash、Kafka、Redis 等)。
- 工作原理:
- Filebeat 在被配置后,启动时会不断地监控指定目录下的日志文件,当有新日志产生时,它会读取这些日志并转发到下游系统。
- 它提供了 Harvester 和 Registrar 组件来帮助读取和记录日志文件的状态,避免重复读取。
- 优点:
- 轻量级:Filebeat 对系统资源占用非常少,适合大量部署在边缘服务器上。
- 高效:Filebeat 能够高效地处理大量日志数据,支持多种协议进行数据传输。
- 简单配置:Filebeat 配置文件简单明了,易于上手。
Logstash 是一个功能强大的数据处理管道工具,用于收集、处理和转发日志数据。它可以接收不同来源的数据(如日志文件、数据库、消息队列等),进行格式转换、过滤、增强等操作,然后将数据输出到多个目标系统(如 Elasticsearch、Kafka、文件系统等)。
- 用途:
- 数据处理和转换:Logstash 可用于在数据存储之前对日志数据进行复杂的处理。
- 它可以执行多种数据转换操作,如解析日志格式、去除不需要的数据、应用正则表达式提取信息等。
- Logstash 支持多种输入、过滤和输出插件,可以满足复杂的日志处理需求。
- 工作原理:
- Logstash 使用 Input 插件接收数据,使用 Filter 插件进行数据处理和格式转换,最后通过 Output 插件将数据发送到目标系统(如 Elasticsearch)。
- 它支持高度自定义的管道设计,可以通过配置文件实现不同的处理逻辑。
- 优点:
- 灵活性高:Logstash 提供丰富的插件,可以非常灵活地进行数据处理和格式转换。
- 强大的数据处理能力:它支持多种过滤器,如
grok
(用于日志解析),mutate
(修改字段),date
(时间解析)等,可以处理各种复杂的日志格式。 - 集成丰富:Logstash 支持多种输入和输出来源,几乎可以接入任何数据源和目的地。
Filebeat 与 Logstash 的区别
特性 | Filebeat | Logstash |
---|---|---|
功能 | 轻量级日志采集,数据传输 | 数据收集、转换、过滤和输出 |
资源消耗 | 轻量,占用少 | 比较重,资源消耗较大 |
用途 | 从日志文件中采集数据并发送到目的地 | 对数据进行复杂的处理和转发,如解析、格式转换等 |
配置复杂度 | 简单,主要配置输入路径和输出目的地 | 配置相对复杂,需要定义输入、过滤和输出管道 |
处理能力 | 主要用于数据转发,处理能力有限 | 强大的数据处理能力,适合复杂的数据管道处理 |
使用场景 | 适用于资源受限的环境,收集日志并快速转发到 Elasticsearch 或 Logstash | 适用于需要复杂日志处理和转换的场景 |
是否支持多输入来源 | 主要支持文件输入,但也支持其他输入来源(如 网络、消息队列等) | 支持多种输入来源,包括日志、数据库、消息队列等 |
Filebeat 和 Logstash 如何协作
- 基本工作流程:
- Filebeat 负责从各个日志文件中收集数据并将其发送到 Logstash 或 Elasticsearch。
- Logstash 接收数据后,进行复杂的过滤和转换操作,最后将处理后的数据发送到 Elasticsearch 或其他系统。
- 典型部署模式:
- Filebeat -> Logstash -> Elasticsearch: 在这种模式下,Filebeat 作为日志采集器,负责把日志数据发送到 Logstash。Logstash 接收到数据后,可以进行各种复杂的处理(如日志解析、数据清洗等),然后将数据发送到 Elasticsearch 进行索引和存储。
- Filebeat -> Elasticsearch: 如果日志处理不需要复杂的转换,可以直接将 Filebeat 发送的数据推送到 Elasticsearch,跳过 Logstash。这种方式适用于不需要复杂数据处理的场景。
- 处理流程示例:
- Filebeat 从 Nginx 日志文件中读取数据。
- 发送到 Logstash,Logstash 使用
grok
过滤器解析 Nginx 日志格式,提取出如请求时间、状态码、URL 等字段。 - Logstash 将数据发送到 Elasticsearch,然后 Elasticsearch 对这些数据进行索引和存储。
- 最终用户可以通过 Kibana 来查询和分析这些日志数据。
使用场景
- Filebeat 适用于那些需要从日志文件中实时获取日志并转发到 Elasticsearch 或 Logstash 的场景,尤其适合资源受限的环境,如边缘节点、容器等。
- Logstash 适用于复杂的日志处理场景,比如需要做日志解析、格式转换、字段增强等操作,或者数据源多样化,且需要多步骤处理的情况。
所以说Filebeat和logstash是可以单独使用的,也可以配合使用。
评论