ELK 日志采集使用
💡第三方组件声明
因依赖于第三方版本,请第三方组件、中间件和本文保持一致,避免由于第三方升级的兼容性导致无法正常使用。
ELK 即 Elasticsearch、Logstash、Kibana 的组合,可以搭建分布式日志系统。在微服务架构中,ELK 能够集中管理和分析各个服务的日志,提供强大的日志查询和统计能力。
本文以 PIGX 的 UPMS 模块为例,演示如何整合 ELK 日志采集系统。
ELK 组件说明
ELK 是三个开源组件的首字母缩写,各组件职责如下:
| 组件 | 作用 | 说明 |
|---|
| Elasticsearch | 日志存储与检索 | 分布式搜索引擎,用于存储和检索日志数据 |
| Logstash | 日志采集与转发 | 接收应用程序发送的日志,并转发至 Elasticsearch |
| Kibana | 日志可视化查询 | 提供 Web 界面,用于查询和分析日志 |
部署 ELK 环境
1. 编写 Docker Compose 配置文件
创建 docker-compose.yml 文件,配置 ELK 三个服务:
version: '3'
services:
elasticsearch:
image: elasticsearch:6.4.0
container_name: elasticsearch
environment:
- "cluster.name=elasticsearch" # 设置集群名称
- "discovery.type=single-node" # 单节点模式
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # JVM 内存设置
volumes:
- /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /mydata/elasticsearch/data:/usr/share/elasticsearch/data
ports:
- 9200:9200
kibana:
image: kibana:6.4.0
container_name: kibana
links:
- elasticsearch:es # 使用 es 域名访问 Elasticsearch
depends_on:
- elasticsearch
environment:
- "elasticsearch.hosts=http://es:9200"
ports:
- 5601:5601
logstash:
image: logstash:6.4.0
container_name: logstash
volumes:
- /mydata/logstash/upms-logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch
links:
- elasticsearch:es
ports:
- 4560-4600:4560-4600
2. 创建挂载目录
执行以下命令创建容器所需的挂载目录:
mkdir -p /mydata/logstash
mkdir -p /mydata/elasticsearch/data
mkdir -p /mydata/elasticsearch/plugins
# 授予 Elasticsearch 数据目录写入权限
chmod 777 /mydata/elasticsearch/data
⚠权限配置
Elasticsearch 数据目录必须设置 777 权限,否则容器启动时会因权限不足而失败。
3. 配置 Logstash 日志采集规则
在 /mydata/logstash 目录下创建 upms-logstash.conf 文件:
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines # 使用 JSON Lines 格式解析日志
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "upms-logstash-%{+YYYY.MM.dd}" # 按日期创建索引
}
}
💡配置说明
input 配置 TCP 端口接收日志,output 配置将日志写入 Elasticsearch,索引名称按日期自动分割。
4. 启动 ELK 服务
在 docker-compose.yml 所在目录执行启动命令:
⚠启动时间
Elasticsearch 首次启动需要几分钟时间进行初始化,请耐心等待服务完全启动。
启动成功后,可以看到三个容器运行状态:
5. 安装 Logstash 插件
进入 Logstash 容器安装 JSON Lines 编解码器插件:
# 进入 Logstash 容器
docker exec -it logstash /bin/bash
# 进入 bin 目录
cd /bin/
# 安装 json_lines 插件
logstash-plugin install logstash-codec-json_lines
# 退出容器
exit
# 重启 Logstash 使插件生效
docker restart logstash
6. 访问 Kibana 控制台
浏览器访问 http://宿主机IP:5601 即可打开 Kibana 管理界面。
PIGX 服务整合 Logstash
1. 添加 Maven 依赖
在 UPMS 模块的 pom.xml 中添加 Logstash 依赖:
<!-- 集成 Logstash -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
2. 配置 Logback 输出
在 logback-spring.xml 中新增 Logstash appender 配置:
<!-- 输出到 Logstash 的 appender -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- Logstash 日志收集端口地址 -->
<destination>192.168.0.31:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH"/>
</root>
💡地址配置
destination 中的 IP 地址需要替换为实际部署 Logstash 服务的宿主机地址。
3. 启动服务并查询日志
启动 PIGX UPMS 服务后,在 Kibana 中即可查询到应用日志:
采集多个微服务日志
在生产环境中,通常需要同时采集多个微服务的日志。通过为每个服务分配独立的 TCP 端口,可以实现日志隔离和分类存储。
💡端口映射
增加新服务时,需要在 docker-compose.yml 中扩展 Logstash 的端口映射范围。
修改 /mydata/logstash/upms-logstash.conf 配置文件:
input {
tcp {
add_field => {"service" => "upms"} # 添加服务标识字段
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
tcp {
add_field => {"service" => "auth"} # 添加服务标识字段
mode => "server"
host => "0.0.0.0"
port => 4561
codec => json_lines
}
}
output {
if [service] == "upms" {
elasticsearch {
hosts => "es:9200"
index => "upms-logstash-%{+YYYY.MM.dd}"
}
}
if [service] == "auth" {
elasticsearch {
hosts => "es:9200"
index => "auth-logstash-%{+YYYY.MM.dd}"
}
}
}
✓多服务配置
通过 add_field 和条件判断,可以将不同服务的日志写入不同的 Elasticsearch 索引,便于日志管理和检索。