ELK日志服务器docker安装使用
本文最后更新于42 天前,其中的信息可能已经过时,如有错误请发送邮件到1979007616@qq.com

简介

ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。

官网:下载 Elastic 产品 | Elastic

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

FilebeatLogstash 都是 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 的区别

特性FilebeatLogstash
功能轻量级日志采集,数据传输数据收集、转换、过滤和输出
资源消耗轻量,占用少比较重,资源消耗较大
用途从日志文件中采集数据并发送到目的地对数据进行复杂的处理和转发,如解析、格式转换等
配置复杂度简单,主要配置输入路径和输出目的地配置相对复杂,需要定义输入、过滤和输出管道
处理能力主要用于数据转发,处理能力有限强大的数据处理能力,适合复杂的数据管道处理
使用场景适用于资源受限的环境,收集日志并快速转发到 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是可以单独使用的,也可以配合使用。

相关链接

使用 Docker 搭建 ELK 环境 – 知乎 (zhihu.com)

小提示:您可以通过RSS订阅本站文章更新,订阅地址:https://blog.xmhweb.cn/feed

评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇