1.ELK概括
ELK 是一个流行的开源日志管理和分析平台,广泛用于收集、存储、搜索和可视化日志数据。它的名字来源于三个核心组件的首字母缩写:Elasticsearch、Logstash 和 Kibana。
1. ELK 的核心组件
(1) Elasticsearch
- 功能:分布式搜索引擎,负责存储和索引数据。
- 特点:
- 基于 Apache Lucene 构建,提供强大的全文搜索能力。
- 支持分布式架构,可以处理大规模数据集。
- 提供 RESTful API 接口,便于集成到各种应用中。
- 用途:
- 存储从 Logstash 或其他来源接收的数据。
- 提供快速的查询和数据分析能力。
(2) Logstash
- 功能:数据采集和处理管道,负责从各种来源收集数据,并将其转换为适合 Elasticsearch 的格式。
- 特点:
- 支持多种输入(如文件、网络、数据库等)。
- 提供丰富的过滤器插件(如解析 JSON、正则表达式、日期处理等)。
- 支持多种输出目标(如 Elasticsearch、Kafka、Redis 等)。
- 用途:
- 作为中间层,负责日志数据的收集、清洗和传输。
(3) Kibana
- 功能:可视化工具,用于展示 Elasticsearch 中的数据。
- 特点:
- 提供直观的界面,支持创建仪表盘、图表和报告。
- 支持复杂的查询和过滤操作。
- 可以与 Elasticsearch 实时交互,动态生成可视化内容。
- 用途:
- 将日志数据转化为易于理解的图表和报告。
- 提供实时监控和告警功能。
3. ELK 的工作流程
-
数据采集:
- 使用 Filebeat、Logstash 或其他工具从各种来源(如服务器日志、应用程序日志、数据库等)收集数据。
-
数据处理:
- Logstash 对数据进行解析、过滤和转换,使其符合 Elasticsearch 的存储格式。
-
数据存储:
- 处理后的数据被存储到 Elasticsearch 中,构建索引以便快速查询。
-
数据可视化:
- 使用 Kibana 创建仪表盘和图表,帮助用户分析和监控数据。
4. ELK 的应用场景
(1) 日志管理
- 集中化管理来自多个系统的日志数据。
- 快速定位问题日志,提升故障排查效率。
(2) 性能监控
- 监控服务器和应用程序的性能指标(如 CPU、内存、响应时间等)。
- 通过可视化工具实时了解系统状态。
(3) 安全分析
- 分析安全事件日志,检测潜在威胁。
- 结合规则引擎实现自动化的安全告警。
(4) 数据分析
- 对业务数据进行深度分析,提取有价值的信息。
- 支持多维度查询和统计。
5. ELK 的优势
- 开源免费:所有组件均为开源软件,社区活跃,扩展性强。
- 灵活扩展:支持水平扩展,能够处理海量数据。
- 强大的生态系统:拥有丰富的插件和工具,满足不同场景需求。
- 易用性:通过 Kibana 提供友好的可视化界面,降低使用门槛。
6. ELK 的局限性
- 资源消耗较高:尤其是 Elasticsearch,在处理大规模数据时需要较高的硬件配置。
- 复杂性:对于初学者来说,部署和配置可能有一定难度。
- 维护成本:需要定期优化索引、清理数据以保持性能。
7. 总结
ELK 是一个功能强大且灵活的日志管理和分析平台,适用于各种规模的企业和项目。通过结合 Elasticsearch、Logstash 和 Kibana,它可以实现从数据采集到可视化的全流程处理,帮助企业更好地理解和利用数据。
2.准备工作
安装ES,Logstash ,Kibana
2.1 自定义桥接网络
考虑到ES容器和Kibana容器需要网络互通,这里先创建一个桥接网络。
docker network create elk-net
2.2 docker安装ES
2.2.1 拉取ES镜像
docker pull elasticsearch:7.13.4
2.2.2运行ES容器
运行前先把相关挂载目录建立了
目录的建立不一定要一样啊,看自己想挂载在哪个目录。
启动ES容器
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-e "http.host=0.0.0.0" \
-v /soft/es/data:/usr/share/elasticsearch/data \
-v /soft/es/plugins:/usr/share/elasticsearch/plugins \
-v /soft/es/logs:/usr/share/elasticsearch/logs \
--privileged \
--network elk-net \
elasticsearch:7.13.4
参数说明
-d
:以后台模式运行容器。--name elasticsearch
:为容器指定名称。-p 9200:9200
:将主机的 9200 端口映射到容器的 9200 端口(HTTP API 接口)。-p 9300:9300
:将主机的 9300 端口映射到容器的 9300 端口(节点间通信端口,适用于集群模式)。-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"
:设置 Elasticsearch 的 JVM 堆内存大小为 512MB(可根据需求调整)。-e "discovery.type=single-node"
:配置为单节点模式,适用于开发或测试环境。-e "http.host=0.0.0.0"
:允许 Elasticsearch 监听所有网络接口上的请求。-v /soft/es/data:/usr/share/elasticsearch/data
:将主机的./es-data
目录挂载到容器的数据目录,用于持久化存储数据。-v /soft/es/plugins:/usr/share/elasticsearch/plugins
:将主机的./es-plugins
目录挂载到容器的插件目录,用于存放自定义插件。-v /soft/es/logs:/usr/share/elasticsearch/logs
:将主机的./es-logs
目录挂载到容器的日志目录,用于持久化存储日志文件。--privileged
:赋予容器更高的权限,避免因权限不足导致的问题。--network elk-net
:将容器连接到名为elk-net
的 Docker 网络,便于与其他容器通信。elasticsearch:7.13.4
:使用的 Elasticsearch 镜像版本
2.2.3 测试ES运行情况
2.2.3.1 查看ES容器是否正常运行
docker ps -a
我这可以看到没有正常运行,那么就需要找下运行失败的原因
# 查询容器日志 docker logs <container_id_or_name>
docker logs elasticsearch
看日志使权限问题,没权限往logs目录下写文件。我这直接放开logs目录和其他两个挂载目录的权限了
chmod 777 /soft/es/logs/
chmod 777 /soft/es/plugins/
chmod 777 /soft/es/data/
权限放开之后,重新启动容器
docker restart elasticsearch
发现启动成功,我们可以访问下es试试,访问发现没问题。
curl -X GET http://127.0.0.1:9200/
2.3 docker安装Kibana
2.3.1 拉取Kibana的镜像
docker pull kibana:7.13.4
2.3.2 运行Kibana容器
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \
--network=elk-net \
-p 5601:5601 \
kibana:7.13.4
参数说明:
-d
:以后台模式运行容器。--name kibana
:为容器指定名称为kibana
。-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200
:设置环境变量,指定 Kibana 连接的 Elasticsearch 地址为http://elasticsearch:9200
。--network=elk-net
:将容器连接到名为 elk-net 的 Docker 网络,确保 Kibana 和 Elasticsearch 可以通过网络通信。-p 5601:5601
:将主机的 5601 端口映射到容器的 5601 端口,用于访问 Kibana 的 Web 界面。kibana:7.13.4
:使用的 Kibana 镜像版本为7.13.4
,需确保与 Elasticsearch 版本匹配。
2.3.3 查询Kibana的运行情况
浏览器访问:http://主机ip:5601/
2.4 docker安装Logstash
2.4.1.拉取Logstash镜像
docker pull logstash:7.13.4
2.4.2 启动Logstash容器
启动容器,创建挂载目录
# 启动容器
docker run -d --name=logstash logstash:7.13.4
# 主机创建文件夹,用于挂载logstash容器的文件
mkdir /soft/logstash/logstash/config
# 复制容器logstash的配置文件出来
docker cp logstash:/usr/share/logstash/config/logstash.yml /soft/logstash/logstash/config/logstash.yml
编辑logstash.yml
http.host: "0.0.0.0"
#根据实际修改es的ip:port
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
# 主管道的Logstash配置路径,如果指定目录或通配符,配置文件将按字母顺序从目录中读取
# path.config: /usr/share/logstash/config/*.conf
path.config: /usr/share/logstash/config/logstash.conf
#Logstash将其日志写到的目录
path.logs: /usr/share/logstash/logs
创建配置文件 logstash.conf
在刚才的config目录下建一个conf文件
vim /soft/logstash/logstash/config/logstash.conf
# Logstash.conf 配置文件示例
input {
# 读取文件数据
file {
#采集点(注意,由于是docker启动的logstash,这里是容器内的文件,如果要采集外面主机的日志,那么文件的路径一定要挂载正确,docker启动的时候挂载下路径就好)
path => ["/usr/share/logstash/logFile/*.log"]
#从文件的开头开始读取,也可以选择'end'从文件末尾开始读取
start_position => "beginning"
#扫描间隔时间,默认是1s,建议5s
stat_interval => "5"
# sincedb文件路径,用于记录读取位置,确保在Logstash重启后不会重复读取数据,
# 该路径必须指定到文件不能指定到文件的目录 ,不指定会默认创建
# sincedb_path => "/usr/share/logstash/file/sincedb.txt"
# 利用linux黑洞可以达到每次重头读取日志文件
sincedb_path => "/dev/null"
}
}
output {
elasticsearch {
#集群的话,直接添加多个url
hosts => ["elasticsearch:9200"]
#es的用户名和密码(无密码则不需要)
#user =>"elastic"
#password =>"elastic"
#建立的索引以日期区分
index => "logstash-log-%{+YYYY.MM.dd}"
}
#在控制台输出logstash的日志
stdout { codec=> rubydebug }
}
启动容器
docker run -d \
--name logstash \
-p 9600:9600 \
-p 5044:5044 \
--network elk-net \
-v /soft/logstash/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /soft/logstash/logstash/config/logstash.conf:/usr/share/logstash/config/logstash.conf \
-v /soft/logstash/logstash/config/logFile:/usr/share/logstash/logFile \
logstash:7.13.4
-d
:以后台模式运行容器。--name logstash
:为容器指定名称为logstash
。-p 9600:9600
:将主机的 9600 端口映射到容器的 9600 端口,用于访问 Logstash 的监控接口。-p 5044:5044
:将主机的 5044 端口映射到容器的 5044 端口,用于接收 Filebeat 或其他 Beats 工具发送的数据。--network elk-net
:将容器连接到名为elk-net
的 Docker 网络,确保 Logstash 和 Elasticsearch 可以通过网络通信。-v /soft/logstash/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
:将主机路径/soft/logstash/logstash/config/logstash.yml
挂载到容器内的/usr/share/logstash/config/logstash.yml
,用于加载 Logstash 的全局配置文件。-v /soft/logstash/logstash/config/logstash.conf:/usr/share/logstash/config/logstash.conf
:将主机路径/soft/logstash/logstash/config/logstash.conf
挂载到容器内的/usr/share/logstash/config/logstash.conf
,用于定义 Logstash 的数据处理管道配置。-v /soft/logstash/logstash/config/logFile:/usr/share/logstash/logFile
:将主机路径/soft/logstash/logstash/config/logFile
挂载到容器内的/usr/share/logstash/logFile
,用于存储日志文件或其他需要持久化的数据。logstash:7.13.4
:使用的 Logstash 镜像版本为7.13.4
,需确保与 Elasticsearch 和 Kibana 的版本匹配。
查看启动日志
docker logs logstash
2.4.3 测试logstash
在 /soft/logstash/logstash/config/logFile目录下建一个a.log,随便往里面写点东西
查看logstash日志,发现有日志打印出来了
docker logs logstash
3. kibana查询日志
查看logstash的索引是否成功建立
get /_cat/indices
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理