EFK日志分析系统部署

什么是EFK?

相比ELK日志系统,EFK实际就是把Logstash组件替换成了Filebeat组件,相比ELK架构EFK会更加地轻量级别。

TOC

★准备工作★

这里我直接用docker部署进行示范
docker镜像版本
Elasticsearch镜像版本:elasticsearch:7.17.16
Kibana镜像版本:kibana:7.17.16
Filebeat安装包
Filebeat安装包:filebeat-7.17.16-linux-x86_64.tar.gz
Filebeat下载地址:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.16-linux-x86_64.tar.gz

部署EFK日志分析系统

使用docker部署es和kibana

1.先创建一个专属网络

docker network create -d bridge efk

2.编写docker-compose.yaml文件:

version: '3.8'

services:
  es:
    image: elasticsearch:7.17.16
    container_name: elasticsearch
    restart: unless-stopped
    privileged: true
    environment:
      - discovery.type=single-node
      - ELASTIC_USERNAME=elastic
      - ELASTIC_PASSWORD=elastic123456
      - network.host=0.0.0.0
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./data:/usr/share/elasticsearch/data

  kibana:
    image: kibana:7.17.16
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      - ELASTICSEARCH_HOSTS=http://es:9200
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=elastic123456
      - I18N_LOCALE=zh-CN

networks:
  default:
    name: efk
    external: true

3.启动服务

docker compose up -d

注意:一定要记得授权es的data目录为1000的uid和gid,因为es默认是用其他用户启动,映射进去则会权限不够!!!

chown -R 1000.1000 data

部署filebeat推送日志

1.下载filebeat安装包

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.16-linux-x86_64.tar.gz

2.解压目录到安装目录

tar zxf filebeat-7.17.16-linux-x86_64.tar.gz
mv filebeat-7.17.16-linux-x86_64 /usr/local/filebeat

3.编写filebeat配置文件
我安装的nginx日志在/usr/local/nginx/logs目录下,根据自己的日志位置进行配置,不同的需求和喜好可以进行不同的配置体现

vim /usr/local/filebeat/filebeat.yml
-----------------------------
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
  fields:
    app: nginx
    type: access
  multiline.pattern: '^#\['
  multiline.negate: true
  multiline.match: after

- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/error.log
  fields:
    app: nginx
    type: error
  multiline.pattern: '^#\['
  multiline.negate: true
  multiline.match: after

output.elasticsearch:
  hosts: ["localhost:9200"]
  protocol: "http"
  username: "elastic"
  password: "elastic123456"
  index: "%{[fields.app]}-%{[fields.type]}-%{[agent.version]}-%{+yyyy.MM.dd}"

setup.ilm.enabled: false
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.overwrite: false

processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded

我这边定义了两种日志,一个是nginx的access日志和error日志,分别推送到不同的索引上去。
4.可以通过命令进行调试,将配置的日志推送到es上。

cd /usr/local/filebeat
./filebeat

在默认的情况下命令会自动加载名字为"filebeat.yml"的配置文件,如果自己配置的配置文件名不是这个则需要用以下命令进行运行。

/usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat-test.yml

我们可以到kibana的开发工具上进行查询索引是否创建,命令如下:

GET /_cat/indices/nginx-*?h=index,health,docs.count,store.size&format=json
# 使用curl命令
curl -s -X GET "http://127.0.0.1:9200/_cat/indices/nginx-*?h=index,health,docs.count,store.size&format=json"

如下图所示:
efk.001
5.配置filebeat的服务加入到systemctl进行管理

cat > /usr/lib/systemd/system/filebeat.service << EOF
[Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml
Restart=always

[Install]
WantedBy=multi-user.target
EOF

重新加载systemctl服务并启动服务

systemctl daemon-reload
systemctl start filebeat --now

测试阶段

我们可以在kibana上创建对应的索引模式进行查看日志。
可以通过两个索引分别查看access日志,如下图所示:
efk.002
查看error日志,如下图所示:
efk.003