docker部署elk

docker部署elk7.1.1

elk安装环境: 172.34.22.9

获取ES镜像:docker pull elasticsearch:7.1.1
获取kibana镜像:docker pull kibana:7.1.1
获取logstash镜像:docker pull logstash:7.1.1

获取镜像:docker pull elasticsearch:7.1.1 && docker pull kibana:7.1.1 && docker pull logstash:7.1.1

############################################################################# 安装 elasticsearch #############################################################################
mkdir -p /xhs_backups/xhs120logs/elk/es/ && chown -R 1000:1000 /xhs_backups/xhs120logs/elk/es/ && chmod -R 777 /xhs_backups/xhs120logs/elk/es/
创建自定义网络:
docker network create somenetwork
创建es容器:
#docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.1.1

docker run \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=50 \
-d --restart=always \
--name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.1.1

容器内配置文件路径: /usr/share/elasticsearch/config/elasticsearch.yml

等待容器启动完毕后,验证安装是否成功:curl http://172.34.22.9:9200

############################################################################# 安装kibana #############################################################################

创建容器命令:
#docker run -d --name kibana --net somenetwork -p 5601:5601 kibana:7.1.1

docker run -d \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=50 \
--restart=always \
--name kibana --net somenetwork -p 5601:5601 kibana:7.1.1

等待容器启动完毕后,验证安装是否成功: http://172.34.22.9:5601

********************汉化配置************************************
容器内配置文件路径: docker exec -it kibana bash
vi /usr/share/kibana/config/kibana.yml
# Kibana is served by a back end server. This setting specifies the port to use.
server.port: 5601
# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
server.host: "0.0.0.0"
# Specifies locale to be used for all localizable strings, dates and number formats.
i18n.locale: "zh-CN"


#############################################################################安装 logstash #############################################################################

mkdir -p /xhs_backups/xhs120logs/elk/logstash && mkdir -p /xhs_backups/xhs120logs/elk/logstash/conf.d && chmod -R 777 /xhs_backups/xhs120logs/elk/logstash

创建配置文件1:
vi /xhs_backups/xhs120logs/elk/logstash/logstash.yml
path.config: /usr/share/logstash/config/conf.d/*.conf

创建配置文件2:
vi /xhs_backups/xhs120logs/elk/logstash/conf.d/logstash.conf

input {
beats {
port => "5044"
client_inactivity_timeout => 36000
}
}

#filter {
# #全局匹配
# grok {
# match => { "message" => "%{TIMESTAMP_ISO8601:time}\s*\[%{DATA:thread}\]\s*%{LOGLEVEL:level}\s*%{GREEDYDATA:msg}" }
# }
# #条件匹配华三 172.34.22.123 环境
# if [fields][document_type] == 'hs_123_report' {
# grok {
# match => { "message" => "%{TIMESTAMP_ISO8601:time}\s*\[%{DATA:thread}\]\s*%{LOGLEVEL:level}\s*%{GREEDYDATA:msg}" }
# }
# }
# if [fields][document_type] == 'hs_123_vehicle' { # 这里写两个一样的grok,实际上可能出现多种不同的日志格式,这里做个提示而已,当然如果是相同的格式,这里可以不写的
# grok {
# match => { "message" => "%{TIMESTAMP_ISO8601:time}\s*\[%{DATA:thread}\]\s*%{LOGLEVEL:level}\s*%{GREEDYDATA:msg}" }
# }
# }
#}

filter {
if [fields][document_type] == 'hs_14_nginx_access' {
grok {
match => { "message" => "%{IP:remote_addr}\s*-\s*(?:%{DATA:remote_user}|-)\s*\[%{DATA:time_local}\]\s*\"%{DATA:request}\"\s*%{NUMBER:status}\s*(?:%{NUMBER:body_bytes_sent}|-)\s*\"%{DATA:http_referer}\"\s*\"%{DATA:http_user_agent}\"\s*\"%{DATA:http_x_forwarded_for}\"" }
}
} else if [fields][document_type] == 'hs_14_nginx_error' {
grok {
match => ["message", "%{DATA:data_time}\s*\[%{DATA:level}\]\s*%{GREEDYDATA:msg}"]
}
date {
match => ["data_time", "yyyy/MM/dd HH:mm:ss"]
target => "data_time"
}

#grok {
# match => { "message" => "%{DATA:date_time}\s*\[%{DATA:level}\]\s*%{GREEDYDATA:msg}" }
# match => {"message" => "%{YEAR:year}\/%{MONTHNUM2:month}\/%{MONTHDAY:day}\s*%{HOUR:hour}\:%{MINUTE:minu}\:%{SECOND:sec}\s*\[%{DATA:level}\]\s*%{GREEDYDATA:msg}" }
# match => {"message" => "%{DATA:year}\/%{DATA:month}\/%{DATA:day}\s*%{DATA:hour}\:%{DATA:minu}\:%{DATA:sec}\s*\[%{DATA:level}\]\s*%{GREEDYDATA:msg}" }
#}

} else if [fields][document_type] == 'hs_14_nginx_nacos_access' {
grok {
match => { "message" => "%{IP:remote_addr}\s*-\s*(?:%{DATA:remote_user}|-)\s*\[%{DATA:time_local}\]\s*\"%{DATA:request}\"\s*%{DATA:status}\s*%{DATA:body_bytes_sent}\s*\"%{DATA:http_referer}\"\s*\"%{DATA:http_user_agent}\"" }
}
} else {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:time}\s*\[%{DATA:thread}\]\s*%{LOGLEVEL:level}\s*%{GREEDYDATA:msg}" }
}
}
}

 

output {
elasticsearch {
hosts => [ "172.34.22.9:9200" ]
index => "%{[fields][document_type]}-%{+YYYY.MM.dd}"
}
}

容器创建:
docker run -it -d \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=50 \
--restart=always \
-p 5044:5044 -p 9600:9600 \
--name logstash \
-v /xhs_backups/xhs120logs/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /xhs_backups/xhs120logs/elk/logstash/conf.d/:/usr/share/logstash/config/conf.d/ \
logstash:7.1.1

#############################################################################安装 filebeat收集nginx #############################################################################
上传安装包到需要被采集的服务器上: (以172.34.22.2为例在目录: /xhs/soft/filebeat-6.1.1-linux-x86_64.tar.gz )

cd /xhs/soft && tar -xvf filebeat-6.1.1-linux-x86_64.tar.gz
cd /xhs/soft/filebeat-6.1.1-linux-x86_64 && mv filebeat.yml filebeat.yml.bak

vi filebeat.yml

filebeat.prospectors:
- paths:
- /var/log/nginx/access.log
# 配置多行日志规则,匹配ip开头行
multiline.pattern: '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_14_nginx_access'
- paths:
- /var/log/nginx/error.log
# 配置多行日志规则,,匹配日期开头行
multiline.pattern: '^[0-9]{4}/[0-9]{2}/[0-9]{2}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_14_nginx_error'
- paths:
- /var/log/nginx/nacos.access.log
# 配置多行日志规则,
multiline.pattern: '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_14_nginx_nacos_access'

# 配置logstash
output.logstash:
#logstash地址
hosts: ["172.34.22.9:5044"]
将Filebeat后台进程方法启动服务:
nohup /xhs/soft/filebeat-6.1.1-linux-x86_64/filebeat -e -c /xhs/soft/filebeat-6.1.1-linux-x86_64/filebeat.yml -d "publish" -path.logs /xhs/soft/filebeat-6.1.1-linux-x86_64/logs/ &

将Filebeat 配置成系统服务进行管理:
vi /etc/systemd/system/filebeat.service

[Unit]
Description=filebeat.service
[Service]
User=root
ExecStart=/xhs/soft/filebeat-6.1.1-linux-x86_64/filebeat -e -c /xhs/soft/filebeat-6.1.1-linux-x86_64/filebeat.yml
[Install]
WantedBy=multi-user.target

管理服务的相关命令
systemctl reload filebeat #加载filebeat服务
systemctl start filebeat #启动filebeat服务
systemctl stop filebeat #停止filebeat服务
systemctl enable filebeat #设置开机自启动
systemctl disable filebeat #停止开机自启动
systemctl restart filebeat  #重新启动服务
systemctl status filebeat #查看服务当前状态
systemctl list-units --type=service #查看所有已启动的服务

systemctl reload filebeat.service && systemctl start filebeat.service && systemctl enable filebeat.service && systemctl status filebeat.service

#############################################################################安装 filebeat收集Java #############################################################################

上传安装包到需要被采集的服务器上: (以172.34.22.2为例在目录: /xhs/soft/filebeat-6.1.1-linux-x86_64.tar.gz )

cd /xhs/soft && tar -xvf filebeat-6.1.1-linux-x86_64.tar.gz
cd /xhs/soft/filebeat-6.1.1-linux-x86_64 && mv filebeat.yml filebeat.yml.bak

vi filebeat.yml

filebeat.prospectors:
- paths:
- /xhs/xhs120java/xhemss-xems-report/logs/xhemss-xems-report/*/*.log
# 配置多行日志规则,
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_123_report'
- paths:
- /xhs/xhs120java/xhemss-xems-vehicle/logs/xhemss-xems-vehicle/*/*.log
# 配置多行日志规则,
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_123_vehicle'
- paths:
- /xhs/xhs120java/xhemss-uaa-admin-server/logs/xhemss-uaa-admin-server/*.log
# 配置多行日志规则,
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_123_admin'
- paths:
- /xhs/xhs120java/xhemss-base-server/logs/xhemss-base-server/*.log
# 配置多行日志规则,
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_123_base'
- paths:
- /xhs/xhs120java/xhemss-deviceecg-server/logs/xhemss-deviceecg-server/*.log
# 配置多行日志规则,
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_123_deviceecg'
- paths:
- /xhs/xhs120java/xhemss-app-server/logs/xhemss-app-server/*.log
# 配置多行日志规则,
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
#此配置使用negate: true和match: after设置来指定任何不符合指定模式的行都属于上一行
multiline.negate: true
multiline.match: after
fields.document_type: 'hs_123_app'

# 配置logstash
output.logstash:
#logstash地址
hosts: ["172.34.22.9:5044"]

将Filebeat后台进程方法启动服务:
nohup /xhs/soft/filebeat-6.1.1-linux-x86_64/filebeat -e -c /xhs/soft/filebeat-6.1.1-linux-x86_64/filebeat.yml -d "publish" -path.logs /xhs/soft/filebeat-6.1.1-linux-x86_64/logs/ &

将Filebeat 配置成系统服务进行管理:
vi /etc/systemd/system/filebeat.service

[Unit]
Description=filebeat.service
[Service]
User=root
ExecStart=/xhs/soft/filebeat-6.1.1-linux-x86_64/filebeat -e -c /xhs/soft/filebeat-6.1.1-linux-x86_64/filebeat.yml
[Install]
WantedBy=multi-user.target

管理服务的相关命令
systemctl reload filebeat #加载filebeat服务
systemctl start filebeat #启动filebeat服务
systemctl stop filebeat #停止filebeat服务
systemctl enable filebeat #设置开机自启动
systemctl disable filebeat #停止开机自启动
systemctl restart filebeat  #重新启动服务
systemctl status filebeat #查看服务当前状态
systemctl list-units --type=service #查看所有已启动的服务

systemctl reload filebeat.service && systemctl start filebeat.service && systemctl enable filebeat.service && systemctl status filebeat.service

############################################################################################################################

 

########################################清理1天前的elk日志#####################################################################
vi /xhs_backups/xhs120logs/elk/dle_1D_ago_dada.sh

#!/bin/bash
#清理1天前的elk日志
shijian=`date +%Y.%m.%d -d "1 days ago"`
curl -XDELETE "172.34.22.9:9200/hs_*_*-${shijian}"

curl -XDELETE "172.34.22.9:9200/hs*"

crontab -e
#2分钟执行一次
*/1 * * * * sh /xhs_backups/xhs120logs/elk/dle_1D_ago_dada.sh > /dev/null 2>&1

######################################修改elk单机部署状态为gree#########################################################################
vi /xhs_backups/xhs120logs/elk/up_ELK_gree.sh
#!/bin/bash
curl -XPUT "http://172.34.22.9:9200/hs_*/_settings" -H 'Content-Type: application/json' -d '{ "number_of_replicas":0 }'

 

crontab -e
#第1分钟执行一次
*/1 * * * * sh /xhs_backups/xhs120logs/elk/up_ELK_gree.sh > /dev/null 2>&1

每5个小时执行一次脚本
0 */5 * * * sh /xhs_backups/xhs120logs/elk/dle_1D_ago_dada.sh > /dev/null 2>&1

 

 

 

 

###################################################################################################################################################

elk 日志筛选举例:
level:error AND time:2022-02-08

###########################################################elk 搜索 语法_ELK常用搜索命令###############################################################
kibana在ELK阵营中用来查询展示数据,elasticsearch构建在Lucene之上,过滤器语法和Lucene相同

# 全文搜索
在搜索栏输入login,会返回所有字段值中包含login的文档,使用双引号包起来作为一个短语搜索
"like Gecko"
# 字段
也可以按页面左侧显示的字段搜索
限定字段全文搜索:field:value
精确搜索:关键字加上双引号 filed:"value"
http.code:404 搜索http状态码为404的文档

# 字段本身是否存在
_exists_:http:返回结果中需要有http字段
_missing_:http:不能含有http字段
# 通配符
? 匹配单个字符
* 匹配0到多个字符
kiba?a, el*search
? * 不能用作第一个字符,例如:?text *text

# 正则
es支持部分正则功能
mesg:/mes{2}ages?/

# 模糊搜索
~:在一个单词后面加上~启用模糊搜索
first~ 也能匹配到 frist
还可以指定需要多少相似度
cromm~0.3 会匹配到 from 和 chrome
数值范围0.0 ~ 1.0,默认0.5,越大越接近搜索的原始值

# 近似搜索
在短语后面加上~
"select where"~3 表示 select 和 where 中间隔着3个单词以内

# 范围搜索
数值和时间类型的字段可以对某一范围进行查询
length:[100 TO 200]
date:{"now-6h" TO "now"}
[ ] 表示端点数值包含在范围内,{ } 表示端点数值不包含在范围内

# 逻辑操作
AND
OR
+:搜索结果中必须包含此项
-:不能含有此项
+apache -jakarta test:结果中必须存在apache,不能有jakarta,test可有可无

# 分组
(jakarta OR apache) AND jakarta

# 字段分组
title:(+return +"pink panther")

转义特殊字符
+ - && || ! () {} [] ^" ~ * ? : \

以上字符当作值搜索的时候需要用\转义

# 创建过滤器
可通过单击可视化中的元素进行筛选,并可修改要查询的字段值

相关资源:elktail,用于查询搜索和跟踪EL(elasticsearch,logstash)日志的.