ELK监控jar

若是没有安装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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值