环境

Ip 主机名 cpu 内存
192.168.10.100 master01 4c 8G
组件 版本
Ubuntu Ubuntu 26.04 server
Docker 29.1.3
docker compose v2
filebeat 7.17.18
elasticsearch 7.17.18
kibana 7.17.18
logstash 7.17.18

具体步骤

创建docker-compose文件夹
mkdir /compose_elkf
cd /compose_elkf
vim docker-compose.yaml
version: '3.3'
services:
  elasticsearch:
    container_name: elasticsearch
    image: elasticsearch:7.17.18
    environment:
      - bootstrap.memory_lock=true
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
      - 9300:9300
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data
      - ./elasticsearch/logs:/usr/share/elasticsearch/logs
    stdin_open: true
    tty: true
    network_mode: bridge
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "50"
  kibana:
    container_name: kibana
    image: kibana:7.17.18
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 5601:5601
    links:
      - elasticsearch:elasticsearch
    depends_on:
      - elasticsearch
    stdin_open: true
    tty: true
    network_mode: bridge
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "50"
  logstash:
    container_name: logstash
    image: logstash:7.17.18
    restart: always
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    ports:
      - 5044:5044
    links:
      - elasticsearch:elasticsearch
    depends_on:
      - elasticsearch
    stdin_open: true
    tty: true
    network_mode: bridge
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "50"
  filebeat:
    user: root
    container_name: filebeat
    image: docker.elastic.co/beats/filebeat:7.17.18
    volumes:
      - /var/log:/usr/share/filebeat/logs
      - ./config/filebeat.yml:/usr/share/filebeat/filebeat.yml
    command: ["--strict.perms=false"]
    ulimits:
      memlock:
        soft: -1
        hard: -1
    stdin_open: true
    tty: true
    network_mode: host
    deploy:
      mode: global
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "50"
创建配置文件目录
mkdir ./config
vim ./config/filebeat.yml
编辑filebeat配置文件

注:hosts需要改成logstash所在节点的ip

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/logs/syslog
    - /usr/share/filebeat/logs/messages
  tags: ["syslog"]
  processors:
    - add_host_metadata:
        netinfo.enabled: true
output.logstash:
  hosts: ["192.168.10.100:5044"] #这里写logstash节点的ip
vim ./config/logstash.conf
编辑logstash配置文件
input {
  beats {
    port => 5044
  }
}


filter {

  json {
    source => "message"
  }

  # 从message里获取日志级别
  grok {
    match => {
      "message" => "(?<log_level>TRACE|DEBUG|INFO|WARN|ERROR|FATAL)"
    }
  }

  # 获取ipv4地址
  mutate {
    add_field => { "ipv4" => "%{[host][ip][0]}" }
  }

  # 删除不必要字段
  mutate {
    remove_field => ["agent","@version", "ecs", "log","host"]
  }

  # 格式化时间戳
  date {
    match => ["timestamp", "MMM dd HH:mm:ss", "MMM dd yyyy HH:mm:ss"]
    target => "@timestamp"
  }

  # 添加索引日期
  ruby {
    code => "event.set('indexDay', event.get('@timestamp').time.localtime('+09:00').strftime('%Y%m%d'))"
  }

}
output {
  if "syslog" in [tags] {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "syslog-%{indexDay}"
    codec => json

  }
}
  stdout {
    codec => rubydebug
  }
}
创建es数据目录
mkdir -p ./elasticsearch/data
mkdir -p ./elasticsearch/logs
给docker-compose文件夹加权
chmod 777 -R /compose_elkf
启动docker-compose
docker compose up -d

如果你的docker-compose版本是v1

docker-compose up -d

在这里插入图片描述

访问kibana
http://192.168.10.100:5601
进来是这个页面
在这里插入图片描述

在这里插入图片描述
这里会提示创建索引模式
如果没有就稍等2,3分钟,es里还没有数据,等待logstash把数据传到es里
在这里插入图片描述
可以看到自动匹配了一个索引,名称按照匹配的索引来就行
*代表匹配任意多个字符
时间戳选第一个
在这里插入图片描述
在这里插入图片描述
这里就可以看到收集到的日志了
显示的格式是已经经过优化的
在这里插入图片描述
也可以通过这里显示固定时间段的日志
在这里插入图片描述
也可以通过左侧点击自己需要看到的字段
列如,我只想看ipv4,message字段
在这里插入图片描述
在这里插入图片描述

这个就是最终效果
在这里插入图片描述

拿到压缩包后怎么操作

如果觉得上面麻烦,或者无法科学上网。也可以直接下载我主页的compose_elkf.tar.xz资源,包括了所有文件和镜像
cscn的资源强制1g以下,只能压缩成xz格式了

tar -xJvf elkf.tar.xz
vim  ./compose_elkf/config/logstash.conf
# 把hosts改成本地ip
cd compose_elkf
docker compose up -d
# 如果你的docker-compose版本是v1
docker-compose up -d

一些可能的疑问解答

为什么索引名是syslog+日期

索引名称是在logstash.conf里定义的
在这里插入图片描述

为什么docker-compose文件里filebeat的网络模式是hosts?

因为如果不是hosts获取ip的时候只会获取容器ip,只有当网络模式是hosts时获取的ip才是服务器ip

web页面里的字段是如何定义的?

是logstash.conf过滤出来的
如message日志本身是不带有ip的,当我们需要获取服务器ip时,需要配置获取并过滤
首先让filebeat抓取网络配置信息
在这里插入图片描述
然后通过logstash过滤出ipv4地址并赋值给ipv4这个字段
在这里插入图片描述

结尾

注:这套docker-compose只适合监控小群集,机器数量<50台,或者测试环境
如果是大群集,机器数量>100台,则需要elk+filebeat+kafka
其中es和kafka需要部署群集
中间件的群集只能保证应用层的高可用
需要保障硬件高可用还需要单独的运维k8s群集上部署
且密码需要密文和中间件之间通过证书连接来保证安全
后续有时间会出上面说的这一套群集

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐