ELK面试问题
- 你们公司用ELK手机什么日志?
- 你们公司ELK日志保存多久?
- 你们公司怎么处理非json日志?
1. 使用filebeat modules收集json的nginx日志文件
使用filebeat modules收集普通格式的nginx日志
第零步: 下载es插件
http://192.168.0.163/elk/ingest-geoip-6.6.0.zip
http://192.168.0.163/elk/ingest-user-agent-6.6.0.zip
第一步: 修改nginx日志格式为普通格式
修改nginx.conf配置文件
第二步: 清空nginx日志
> /var/log/nginx/access.log
第三步: 重启nginx并验证日志格式是否为普通格式了
nginx -t
systemctl restart nginx
curl 127.0.0.1
cat /var/log/nginx/access.log
第四步: 修改filebeat配置文件
[root@lb01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
output.elasticsearch:
hosts: ["10.0.0.5:9200"]
indices:
- index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
fileset.name: "access"
- index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
fileset.name: "error"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
第五步: 激活模块并查看模块
filebeat modules enable nginx
filebeat modules list
第六步: 配置nginx模块
[root@lb01 ~]# cat /etc/filebeat/modules.d/nginx.yml
- module: nginx
access:
enabled: true
var.paths: ["/var/log/nginx/access.log"]
error:
enabled: true
var.paths: ["/var/log/nginx/error.log"]
第七步: 安装es插件
#注意!第一个插件geoip会提示你输入Y
cd /usr/share/elasticsearch/bin/
./elasticsearch-plugin install file:///root/ingest-geoip-6.6.0.zip
./elasticsearch-plugin install file:///root/ingest-user-agent-6.6.0.zip
第八步: 重启es
systemctl restart elasticsearch
第九步: 重启filebeat
systemctl restart filebeat
第十步: 访问测试nginx
curl 127.0.0.1/lalalalal
第十一步: es-head查看
查看是否生成了2个索引
nginx-access-6.6.0-2019.08
nginx-error-6.6.0-2019.08
第十二步: kibana添加查看
添加2个索引,查看是否解析成json了
2. docker的安装
rm -fr /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
systemctl start docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
systemctl restart docker
docker名词
docker-ce : 软件名称
镜像 : nginx镜像
容器 : 运行一个微型的linux系统
端口映射: 宿主机对应容器内的端口
常用命令:
启动docker
systemctl start docker
查看镜像:
docker images
查看正在运行的容器:
docker ps
查看所有的容器:
docker ps -a
查看容器日志
docker logs -f xxxx
导出镜像
docker save nginx -o nginx.tar
导入镜像
docker load -i nginx.tar
运行容器:
docker run --name nginx -p 80:80 -d nginx
停止容器
docker stop nginx
拉取镜像
docker pull nginx
查看容器所有信息
docker inspect nginx
收集单个容器日志
目前的问题:
1.索引名称是默认的
2.access和error写在了一起
我们想要的结果:
1.索引名称自定义
2.access和error分开存储
目标:
1.添加标签tag或者判断条件
实现:
1.通过关键字段"stream"可以判断
"stream": "stdout"
"stream": "stderr"
filebeat配置文件:
收集多个容器日志
docker commit nginx nginx:v2
docker images
docker run --name nginx:v2 -p 8080:80 -d nginx:v2
docker ps -q
问题:
1.无法按服务区分出来容器的日志
2.所有容器的日志都打在了一起
按容器的服务类型去创建不同的索引
理想中的索引:
mysql :
docker-db-access-6.6.0-2019.08
docker-db-error-6.6.0-2019.08
nginx :
docker-nginx-access-6.6.0-2019.08
docker-nginx-error-6.6.0-2019.08
解决方案:
使用docker-compose把标签打进容器的日志里
第一步: 安装docker-compose命令
1.安装docker-compose
yum install -y python2-pip
2.这里使用pip安装,默认源为国外,可以使用国内加速,相关网站
https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
pip加速操作命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
3.继续安装docker-compose
pip install docker-compose
4.检查
docker-compose version
第二步: 编写docker-compose文件
root@lb02 ~]# cat docker-compose.yml
version: '3'
services:
nginx:
image: nginx:v2
# 设置labels
labels:
service: nginx
# logging设置增加labels.service
logging:
options:
labels: "service"
ports:
- "8080:80"
db:
image: nginx:latest
# 设置labels
labels:
service: db
# logging设置增加labels.service
logging:
options:
labels: "service"
ports:
- "80:80"
第三步: 删除以前的容器
docker stop $(docker ps -q)
docker rm $(docker ps -aq)
第四步: 运行docker-compose命令
启动命令
docker-compose up -d
停止命令
docker-compose stop
第五步: 配置filebeat
[root@lb02 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/lib/docker/containers/*/*-json.log
json.keys_under_root: true
json.overwrite_keys: true
output.elasticsearch:
hosts: ["10.0.0.5:9200"]
indices:
- index: "docker-nginx-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
attrs.service: "nginx"
stream: "stdout"
- index: "docker-nginx-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
attrs.service: "nginx"
stream: "stderr"
- index: "docker-db-access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
attrs.service: "db"
stream: "stdout"
- index: "docker-db-error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
attrs.service: "db"
stream: "stderr"
setup.template.name: "docker"
setup.template.pattern: "docker-*"
setup.template.enabled: false
setup.template.overwrite: true
第六步: 重启filebeat
systemctl restart filebeat
第七步: 检查索引是否生成
解决内存锁定
官方解决方案:
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
重启服务
systemctl daemon-reload
systemctl restart elasticsearch
检查端口-有延迟
netstat -lntup|grep 9200
网友评论