filebeat(
日志数据采集器
) -> logstash:5044(搜集日志
) -> es:9200(存储日志
) -> kibana:5601(查询和可视化
)
elk/
├── dockerFile # 空文件夹
├── filebeat
│ └── filebeat.yml
├── module # 空文件夹
└── nginx
├── conf
│ ├── index
│ │ └── index.html
│ └── nginx.conf
├── docker-compose.yaml
└── logs
├── access.log # nginx 启动后会自动生成
└── error.log # nginx 启动后会自动生成
# 1. 调高JVM线程数限制数量, 防止启动容器时,报出如下错误:
# bootstrap checks failed max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
# 方式1: 运行 ELK 镜像需要 vm.max_map_count 至少需要 262144 内存(永久性修改)
sudo vim /etc/sysctl.conf
# 存在 vm.max_map_count 参数则修改,没有则新增
vm.max_map_count = 262144
# 方式2: 临时改变某个指定参数的值
sysctl -w vm.max_map_count=262144
# 重新加载内核参数
sudo sysctl -p
# 2. 添加本地IP的域名映射
sudo vim /etc/hosts
127.0.0.1 elk.answer.com
# ELK_VERSION=7.0.1 & ES_VERSION=7.0.1 & LOGSTASH_VERSION=7.0.1 & KIBANA_VERSION=7.0.1
# ES_PACKAGE=elasticsearch-7.0.1-linux-x86_64.tar.gz
# LOGSTASH_PACKAGE=logstash-7.0.1.tar.gz
# KIBANA_PACKAGE=kibana-7.0.1-linux-x86_64.tar.gz
# 拉取 sebp/elk 镜像, 此次部署版本号为: 7.0.1
docker pull sebp/elk
# 拉取 nginx 镜像, 用于产生日志
docker pull nginx
# 拉取 filebeat 镜像, 如果是 deb 方式部署 filebeat 则不需要下载该镜像
# docker 中 filebeat 版本: FILEBEAT_VERSION=6.2.3
docker pull prima/filebeat
# 查看 镜像对应的 filebeat 版本
docker image inspect prima/filebeat:latest | grep FILEBEAT_VERSION
# 进入 nginx 目录
cd elk/nginx
# 启动 nginx 容器实例
docker-compose -f docker-compose.yaml up -d
# 验证 nginx 服务启动状态. 由于映射的是80端口, 因此无需写端口号
curl http://IP
# 启动 elk 容器实例
docker run -p 7050:9200 -p 7053:5044 -p 7051:5601 -v /data/elk/dockerFile:/data -it -d --name elk sebp/elk
# 查看 elk 容器日志
docker logs -f elk --tail=100
# 验证
# 访问 es
http://10.135.XXX.XXX:7050
http://10.135.XXX.XXX:7050/_search?pretty
# 访问 kibana
http://10.135.XXX.XXX:7051
# 下载 filebeat-6.2.4-amd64.deb
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-amd64.deb
# 安装 filebeat
sudo dpkg -i ./filebeat-6.2.4-amd64.deb
sudo systemctl daemon-reload
# 验证, 查看 filebeat 版本
filebeat version
# 编辑 filebeat.yml 文件内容, 内容见下面
sudo vim /etc/filebeat/filebeat.yml
# 启动 filebeat 服务
sudo service filebeat start
# 查看 filebeat 日志
sudo tail -f /var/log/filebeat/filebeat
# 进入 elk 容器内部
docker exec -it elk bash
# 修改 02-beats-input.conf 文件, 去掉 ssl 配置
vim /etc/logstash/conf.d/02-beats-input.conf
ssl => true
ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
ssl_key => "/etc/pki/tls/private/logstash-beats.key"
# 重启 elk 容器
docker restart elk
# 注意将宿主机的日志文件挂载到容器内部, 以及 filebeat.yml 文件配置域名时需要在容器内部做域名映射(add-host)
docker run -d --name filebeat \
-v /data/elk/filebeat/filebeat.yml:/filebeat.yml \
-v ~/elk/filebeat/logs/:/home/logs/ \
-v /data/elk/module:/module \
-v /data/elk/nginx/logs/:/data/elk/nginx/logs/ \
--add-host elk.answer.com:111.XXX.XXX.XXX\
prima/filebeat
# 查看 filebeat 容器实例的日志
docker logs -f filebeat
#############################################
# deb 方式卸载
#############################################
# 查看
dpkg -l filebeat
# 卸载
dpkg -r filebeat
sudo dpkg --purge filebeat
# 重载配置文件
sudo systemctl daemon-reload
#############################################
# docker 方式卸载
#############################################
# 删除容器
docker rm -f filebeat
# 删除镜像
docker rmi -f prima/filebeat:latest
# sudo vim /etc/filebeat/filebeat.yml
filebeat:
prospectors:
-
# 指定要监控的日志,可以指定具体得文件或者目录
paths:
- /data/elk/nginx/logs/access.log
# 指定文件的输入类型log(默认)或者stdin
input_type: log
enabled: true
# 设定Elasticsearch输出时的document的type字段 可以用来给日志进行分类。Default: log
# document_type: nginx-access
# 如果设置为0s,则Filebeat会尽可能快地感知更新(占用的CPU会变高)。默认是10s
scan_frequency: 10s
# 记录filebeat处理日志文件的位置的文件,默认是在启动的根目录下
registry_file: /var/lib/filebeat/registry
output:
logstash:
# filebeat收集后放到 logstash 里
hosts: ["elk.answer.com:7053"]
enabled: true
index: filebeat
注意: 此处需要在 /etc/hosts 文件中添加域名映射 127.0.0.1 elk.answer.com
input {
beats {
host => "0.0.0.0"
port => 5044
}
}
注意: 此处关闭 ssl, filebeat.yml 中也必须关掉 ssl, 这个文件在 elk 容器内部, 路径为: /etc/logstash/conf.d/
- docker exec -it elk bash
- vim /etc/logstash/conf.d/02-beats-input.conf
version: '2'
services:
poc.sdk.nginx:
container_name: aal_nginx
hostname: aal_nginx
image: nginx:latest
environment:
- HOSTNAME=aal_nginx
working_dir: /var/log/nginx
volumes:
- ./logs:/var/log/nginx
- ./conf/index/index.html:/usr/share/nginx/html/index.html:ro
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- /etc/localtime:/etc/localtime:ro
expose:
- 80
ports:
- 80:80
logging:
driver: "json-file"
options:
max-size: "200M"
max-file: "5"
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format json '{"@timestamp":"$time_iso8601",
"@version":"1","host":"$server_addr",
"client":"$remote_addr", "size":"$body_bytes_sent",
"responsetime":"$request_time",
"domain":"$host","url":"$uri","status":"$status"}';
access_log /var/log/nginx/access.log json;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
<html>
<head>
<title>Welcome to nginx!title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
style>
head>
<body>
<h5>Welcome to nginx, Answer.AL.L!h1>
body>
html>
# Questions1 - 如果 filebeat 日志报错, 解决方案: 重启 elk
ERR Failed to publish events caused by: lumberjack protocol error
# Questions1 - 解决方案
# 进入 elk 容器内部
docker exec -it elk bash
# 注释掉 ssl 配置
vim /etc/logstash/conf.d/02-beats-input.conf
# ssl => true
# ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
# ssl_key => "/etc/pki/tls/private/logstash-beats.key"
# 重启 elk 容器
docker restart elk
问题排查原因:
- filebeat.yml 中的域名是否已经完成映射(注意docker部署时需要在容器内部完成映射)
- filebeat.yml 中的日志源是否挂载到容器内部