docker方式部署ELK

Posted 当以乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker方式部署ELK相关的知识,希望对你有一定的参考价值。

1.拉取原始镜像: docker pull sebp/elk:660

2.启动下镜像方便进入,进行自定义配置修改:

docker run -dit --name elk \\

-p 5601:5601 \\

-p 9200:9200 \\

-p 5044:5044 \\

-v /data/elasticsearch:/var/lib/elasticsearch \\

-v /etc/localtime:/etc/localtime \\

sebp/elk:660

这里说明下5601是kibana的端口,9200是ES的端口,5044是logstash的端口

/data/elasticsearch 要修改为你自己的索引存放目录

3.进入到容器中,进行自定义配置修改:

docker exec -it elk /bin/bash

我们先修改logstash的配置,进入到如下目录:

cd /etc/logstash/conf.d

因为我们打算使用filebeat来发送数据给logstash,我们只保存一个配置文件: 02-beats-input.conf 其余的都删除掉

编辑02-beats-input.conf的内容,我的内容如下:

beats

port => 8871

filter

grok

patterns_dir => ["/etc/logstash/patterns"]

match =>

"message" => "\\[%LOGEVL:level\\]\\s*%DAYTIME:day\\s*%THREAD:thread\\s*%JAVACLASS:class\\s*-"

date

match => [ "day", "yyyy-MM-dd HH:mm:ss,SSS", "ISO8601" ]

locale => "en"

target => [ "@timestamp" ]

timezone => "Asia/Shanghai"

output

elasticsearch

hosts => ["localhost:9200"]

index => "log_collection_%+YYYY.MM.dd"

document_type => "logs"

这里我们使用了 filter 和 date .详细配置可以参考 https://blog.csdn.net/hushukang/article/details/84423184

这里我们的目的是为了使符合要求的日志能解析出来特殊的字段.然后我们用日志中的时间代替了timestamp方便索引的排序

这里我们完成了对数据接收的端口进行了修改,现在用8871进行数据接受了

patterns_dir => ["/etc/logstash/patterns"] 中定义了我们自己的正则匹配规则,文件内容如下:

DAYTIME \\d4-\\d2-\\d2\\s\\d2:\\d2:\\d1,2.\\d1,4

LOGEVL [a-zA-Z]4,5

THREAD \\[http-nio-\\d4-exec-\\d1,3\\]|\\[pool-\\d1,2-thread-\\d1,5\\]

如果对kibana端口有要求的话,还可以进行关修改:

vim /opt/kibana/config/kibana.yml

这里我修改为:8872

# Kibana is served by a back end server. This setting specifies the port to use.

server.port: 8872

 

4.将自定义完成后的镜像发送到我们自己的镜像仓库中:

docker ps | grep elk # 查看正在运行的 docker 的 container id docker commit container id xxxxxxx/log_collection:v1 # 生成一个新的 image docker push xxxxxxx/log_collection:v1 # 将 image push 到 docker 仓库

 

5.将镜像部署到线上,这里各个公司的平台不同,需要根据自己的平台来写脚本了.不在描述

   部署的物理机需要执行如下命令:

   echo "vm.max_map_count=262144" > /etc/sysctl.conf

 sysctl -p

6.配置相关项目,使用filebeat将日志.在打docker时加入如下内容:

 

RUN tar xzvf filebeat-6.7.1-linux-x86_64.tar.gz ##这里自己下载filebeat加入到docker中

 

RUN echo 'filebeat.inputs:' > /nerv.app/filebeat.yml

RUN echo '- type: log' >> /nerv.app/filebeat.yml

RUN echo ' enabled: true' >> /nerv.app/filebeat.yml

RUN echo ' paths:' >> /nerv.app/filebeat.yml

RUN echo ' - /home/servlets/logs/$ONEBOX/$ONEBOX.log' >> /nerv.app/filebeat.yml

RUN echo ' tags: [\\"$ONEBOX\\"]' >> /nerv.app/filebeat.yml

RUN echo 'output.logstash:' >> /nerv.app/filebeat.yml

RUN echo ' hosts: [\\"部署elk的机器:8871\\"]' >> /nerv.app/filebeat.yml

 

RUN echo '#!/bin/bash' > /nerv.app/start.sh

RUN echo '/filebeat-6.7.1-linux-x86_64/filebeat -e -c /nerv.app/filebeat.yml -d \\"sendinglog\\" 1> /dev/null &' >> /nerv.app/start.sh

RUN echo '\\$@ |tee /home/servlets/logs/$ONEBOX/$ONEBOX.log' >> /nerv.app/start.sh

RUN chmod u+x /nerv.app/start.sh

这里其实主要是加入了filebeat服务和写了一个filebeat的启动配置,具体配置信息可以网上找找.然后写了一个启动filebeat的启动脚本

 

7.部署服务发送数据到elk中.这步和你原来部署服务没有区别,只是在执行脚本前面加入 /nerv.app/start.sh 用来启动filebeat服务即可

 

8.效果展示:

 

9.定期索引删除:考虑磁盘使用.我们写个脚本定期删除索引,释放磁盘空间.内容如下

 

delete_index=`date -d '10 days ago' +%Y.%m.%d`

echo $delete_index

index_data=\\"indices\\":[\\"log_collection_$delete_index\\"]

echo $index_data

curl 'http://elk机器名:8872/api/index_management/indices/delete' -H 'Content-Type: application/json;charset=utf-8' -H 'kbn-version: 6.6.0' --data $index_data

 

我这里是只保存10天的日志内容.到这里基本大的流程结束.后面都是日志格式的微调了.

 

以上是关于docker方式部署ELK的主要内容,如果未能解决你的问题,请参考以下文章

基于Docker容器部署ELK日志分析系统

Docker 部署ELK 日志分析

Docker 部署ELK 日志分析

Docker 部署ELK 日志分析

Docker 部署ELK 日志分析

Docker部署ELK与使用