若是没有安装ELK,可以参考文章
https://blog.youkuaiyun.com/CodeTom/article/details/148927542?spm=1011.2415.3001.5331
要监控一个 JAR 包产生的日志文件,最标准、最可靠的方法是使用 Filebeat。
Filebeat 是一个轻量级的日志托运工具(Shipper),它可以安装在您的应用服务器上,专门用来监听文件变化(比如日志文件的新增内容),然后将这些变化发送给 Logstash 或直接发送给 Elasticsearch。
我们将对之前的 ELK 架构进行扩展,新的数据流架构将是:
JAR 应用 -> 日志文件 -> Filebeat -> Logstash -> Elasticsearch -> Kibana
第一步,准备您的 JAR 应用和日志文件
首先,您需要有一个正在运行并持续生成日志的 JAR 包。为了演示,我们假设文件目录如下:
elk-stack/
├── docker-compose.yml
├── logs/ <-- 新建的日志存放目录
├── logstash/
│ └── pipeline/
│ └── logstash.conf
└── filebeat/ <-- 新建的目录
└── filebeat.yml <-- 新建的配置文件
第二步,创建 filebeat/filebeat.yml 文件,并填入以下内容:
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/share/filebeat/logs/*.log # 这是容器内的路径,不是Linux系统的路径不要搞混了!!!我们稍后会把本地的logs目录挂载到这里
# =================================- Outputs ===================================
output.logstash:
# The Logstash hosts
hosts: ["logstash:5000"] # 直接指向我们docker-compose中定义的Logstash服务
配置说明:
filebeat.inputs: 定义了输入源。我们使用 log 类型,并让它监控 /usr/share/filebeat/logs/ 目录下所有以 .log 结尾的文件。
output.logstash: 定义了输出目标。我们将日志发送到名为 logstash 的主机的 5000 端口,这正是您在 docker-compose.yml 中为 Logstash 服务定义的名字和端口。
第三步,我们需要把 Filebeat 服务添加到 docker-compose.yml 文件中。请将以下 filebeat 服务配置追加到 services 部分。
完整的 docker-compose.yml 文件如下:
version: '3.8'
services:
elasticsearch:
image: elasticsearch:8.14.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms1g -Xmx1g
volumes:
- es-data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
networks:
- elk-net
kibana:
image: kibana:8.14.0
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- elk-net
logstash:
image: logstash:8.14.0
container_name: logstash
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro
ports:
- "5000:5000/tcp"
- "5000:5000/udp"
depends_on:
- elasticsearch
networks:
- elk-net
# vvvvvvvvvv 这是新增的服务 vvvvvvvvvv
filebeat:
image: elastic/filebeat:8.14.0 # 版本号与ELK保持一致
container_name: filebeat
user: root # 某些环境下需要root权限才能读取挂载的卷
volumes:
# 挂载Filebeat配置文件
- ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
# 挂载我们存放日志的目录到容器内,路径要与filebeat.yml中配置的一致
- ./logs:/usr/share/filebeat/logs:ro
depends_on:
- logstash # 确保Logstash启动后再启动Filebeat
networks:
- elk-net
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
volumes:
es-data:
driver: local
networks:
elk-net:
driver: bridge
重要改动说明:
新服务 filebeat:我们定义了一个新的容器,使用官方的 Filebeat 镜像,并确保版本号一致。
volumes 挂载:这是最关键的一步。
我们将本地的 filebeat.yml 文件挂载到容器内,作为其配置文件。
我们将本地的 logs 目录挂载到容器内的 /usr/share/filebeat/logs 目录。这样,当我们的 Jar 包在主机上向 logs/app.log 写入日志时,Filebeat 容器内就可以立刻读取到这些变化。
第四步,启动并进行端到端测试
1、重新启动服务
在 elk-stack 目录下,打开终端,先关闭可能还在运行的旧服务,然后重新启动:
docker-compose down
docker-compose up -d
使用 docker-compose ps 检查,确保 elasticsearch, kibana, logstash, filebeat 四个容器都已正常运行。
2、启动 Jar 包并生成日志
将之前生成的 SimpleApp.jar (就是需要监控的程序)复制到 elk-stack 目录下。然后打开一个 新的终端窗口,运行以下命令:
java -jar SimpleApp.jar > logs/app.log
这个命令会执行 Jar 包,并把所有标准输出(就是我们 System.out.println 的内容)追加到 elk-stack/logs/app.log 文件中。
现在,这个终端会保持运行,每5秒钟就会有一条新的日志被写入 app.log 文件。
3、在 Kibana 中查看日志
打开 Kibana 界面 (http://localhost:5601)。
导航到 Analytics > Discover。
您应该会看到新的日志源源不断地流入!这些日志的 message 字段内容正是我们 Jar 包中定义的 “This is log entry #…”。
您可以展开日志条目,看到 app, level, timestamp 这些我们自定义的字段都已经被正确解析,因为我们一开始就发送了 JSON 格式。
至此,您已经成功搭建了一条完整的日志处理流水线:Java App -> Log File -> Filebeat -> Logstash -> Elasticsearch -> Kibana。