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.****.net/hushukang/article/details/84423184

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

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

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

DAYTIME \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{1,2}.\d{1,4}

LOGEVL [a-zA-Z]{4,5}

THREAD \[http-nio-\d{4}-exec-\d{1,3}\]|\[pool-\d{1,2}-thread-\d{1,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.将镜像部署到线上,这里各个公司的平台不同,需要根据自己的平台来写脚本了.不在描述

 

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 '\[email protected] |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.效果展示:

docker方式部署ELK

 

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天的日志内容.到这里基本大的流程结束.后面都是日志格式的微调了.