【EFK】efk 8收集docker容器日志测试

前言

目前,efk 全家桶已经更新到版本8 了,本章节我们使用8版本的elk搭建日志收集系统,了解它的配置运行过程,方便以后在更复杂的环境中更好的使用。
版本默认就是8+最新的,也可以自己指定其他8的版本

  • elasticsearch: 8.14.1
  • filebeat: 8.14.1
  • kibana: 8.14.1
  • docker: docker-ce-26.1.4

操作系统说明
用的centos7.7 版本,内核版本3.10+

[root@kube-master ~]# uname -a
Linux kube-master 3.10.0-1062.18.1.el7.x86_64 #1 SMP Tue Mar 17 23:49:17 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@kube-master ~]# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)

安装过程

服务器主机需要能访问互联网,方便起见本文所有安装包均采用 yum 安装。
安装顺序如下:
1、系统初始化
2、 docker-ce
3、elasticsearch
4、 kibana
5 、filebeat

在阅读本文前,最好对dockerd日志管理有一定的了解。具体可以参考https://blog.csdn.net/margu_168/article/details/131075337

系统初始化

系统初始化分为以下几步:
1、修改主机名
2、关闭selinux 和 firewalld
3、配置国内yum源
4、校对时间

修改主机名
host名字没啥影响,大家可以随意改,我这复用了我之前的环境。

[root@kube-master ~]# hostnamectl set-hostname kube-master
[root@kube-master ~]# hostname kube-master
[root@kube-master ~]# echo "192.168.10.128  kube-master" >> /etc/hosts
#断开会话重新连接
[root@kube-master ~]# hostname
kube-master

关闭selinux 和 firewalld

关闭 selinux

[root@kube-master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@kube-master ~]# systemctl disable firewalld
[root@kube-master ~]# setenforce 0

配置国内yum源

[root@kube-master ~]# cd /etc/yum.repos.d/
#centos-7源
[root@kube-master yum.repos.d]#   curl http://mirrors.aliyun.com/repo/Centos-7.repo -o Centos-7.repo#docker-ce源
[root@kube-master yum.repos.d]#  curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o docker-ce.repo#epel-7源
[root@kube-master yum.repos.d]#  curl http://mirrors.aliyun.com/repo/epel-7.repo -o epel-7.repo#efk源
[root@kube-master yum.repos.d]# cat << EOF > elasticstack.repo
[elasticstack]
name = elasticstack
gpgcheck = 0
baseurl = https://mirrors.tuna.tsinghua.edu.cn/elasticstack/yum/elastic-7.x/
EOF

校对时间

[root@kube-master ~]#  yum install -y ntpdate
#任君选
[root@kube-master ~]#  ntpdate tiger.sina.com.cn 
28 Jun 11:47:21 ntpdate[6027]: step time server 202.108.0.246 offset -4.277028 sec
[root@kube-master ~]#  ntpdate ntp1.aliyun.com
28 Jun 11:48:20 ntpdate[6186]: adjust time server 120.25.115.20 offset -0.009092 se

Docker-ce

安装docker-ce

[root@kube-master ~]# yum install -y docker-ce
添加docker-ce 配置
[root@kube-master ~]# mkdir /etc/docker/
[root@kube-master ~]# cat << 'EOF' > /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://5sssm2l6.mirror.aliyuncs.com","http://hub-mirror.c.163.com/","https://docker.mirrors.ustc.edu.cn/","https://registry.docker-cn.com"],"data-root": "/data/docker","storage-driver": "overlay2","log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "3"}
}

修改系统参数并启动 docker

# 注意该下面参数是之前安装k8s的时候设置,应该也是可以使用的
[root@kube-master ~]# cat  /etc/sysctl.d/k8s.conf 
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.ip_forward = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
# 要求iptables不对bridge的数据进行处理
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.netfilter.nf_conntrack_max = 2310720
fs.inotify.max_user_watches=89100
fs.may_detach_mounts = 1
fs.file-max = 52706963
fs.nr_open = 52706963
vm.overcommit_memory=1
vm.panic_on_oom=0
vm.swappiness = 0
# https://github.com/moby/moby/issues/31208 
# ipvsadm -l --timout
# 修复ipvs模式下长连接timeout问题 小于900即可
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10#下面命令可以查看当前系统设置的参数
[root@kube-master ~]# sysctl --system
#启动docker
[root@kube-master ~]# systemctl enable docker; systemctl start docker
#查看docker信息
[root@kube-master ~]# docker info

Elasticsearch

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。安装过程如下:

安装elasticsearch

[root@kube-master ~]# yum install -y elasticsearch#在安装过程中会有以下的输出内容
--------------------------- Security autoconfiguration information ------------------------------Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.The generated password for the elastic built-in superuser is : _EEznFSkBmHWaNAEwC=4If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.You can complete the following actions at any time:Reset the password of the elastic built-in superuser with 
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.Generate an enrollment token for Kibana instances with '/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.Generate an enrollment token for Elasticsearch nodes with 
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.-------------------------------------------------------------------------------------------------
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemdsudo systemctl daemon-reloadsudo systemctl enable elasticsearch.service

请仔细查看以上上面的输出内容,注意如果在安装的时候没有上面的输出,应该是服务器之前安装过elasticsearch,需要将之前的目录(/var/lib/elasticsearch)删除干净后再次安装。
注意,这里用户名为:elastic 密码为: _EEznFSkBmHWaNAEwC=4,后面可以自行修改。

修改默认配置文件

[root@kube-master ~]# cd /etc/elasticsearch/#修改操作前,一定要做好源文件的备份
[root@kube-master ~]# cp -a elasticsearch.yml elasticsearch.yml.init# 修改后的配置文件
[root@kube-master elasticsearch]# egrep -v "^#|^$" elasticsearch.yml 
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.10.128
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl:enabled: truekeystore.path: certs/http.p12
xpack.security.transport.ssl:enabled: trueverification_mode: certificatekeystore.path: certs/transport.p12truststore.path: certs/transport.p12
cluster.initial_master_nodes: ["kube-master"]
http.cors.enabled: true
http.cors.allow-origin: "*"

启动elasticsearch

启动完成后,elasticsearch会监听 9200 和 9300

[root@kube-master ~]# systemctl enable elasticsearch; systemctl start elasticsearch
[root@kube-master elasticsearch]# netstat -ntplu | egrep '9200|9300'
tcp        0      0 0.0.0.0:9200            0.0.0.0:*               LISTEN      18194/java          
tcp        0      0 192.168.10.128:9300     0.0.0.0:*               LISTEN      18194/java  

测试, elasticsearch 8 中,无法使用 http 访问, 需要使用https: https://192.168.10.128:9200/

在这里插入图片描述
注意过程中需要输入账号密码,就是上面安装时自动生成的elastic账号和密码。 也可以使用下面的命令进行测试

[root@kube-master kibana]#  curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:_EEznFSkBmHWaNAEwC=4  -XGET "https://192.168.10.128:9200/"

Kibana

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

安装kibana

[root@kube-master ~]# yum install -y kibana

生成kibana需要的相关证书

由于上面的es开启了xpack,所以不能直接以http的方式访问,需要使用到相关的证书。在生成证书的过程中要输入密码,具体密码可以通过/usr/share/elasticsearch/bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password查看。

[root@kube-master certs]# pwd
/etc/elasticsearch/certs
[root@kube-master certs]# ll /etc/elasticsearch/certs/
total 44
-rw-rw----. 1 root elasticsearch  1915 Jul  2 12:56 http_ca.crt
-rw-rw----. 1 root elasticsearch 10013 Jul  2 12:56 http.p12
-rw-rw----. 1 root elasticsearch  5822 Jul  2 12:56 transport.p12# Private Key 私钥
[root@kube-master certs]#  openssl pkcs12 -in http.p12 -nocerts -nodes > client.key
# Public Certificate 公共证书
[root@kube-master certs]#  openssl pkcs12 -in http.p12 -clcerts -nokeys > client.cer
# CA Certificate 签署公共证书的CA
[root@kube-master certs]#  openssl pkcs12 -in http.p12 -cacerts -nokeys -chain > client-ca.cer[root@kube-master certs]#  mkdir /etc/kibana/config/
[root@kube-master certs]#  cp /etc/elasticsearch/certs/client* /etc/kibana/config/

修改 kibana 配置文件

注意:使用的是kibana账户,密码不知道可以用elasticsearch-reset-password(/usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana)命令进行重置。

[root@kube-master ~]# cd /etc/kibana/
#修改前,备份源文件
[root@kube-master ~]# cp -a kibana.yml kibana.yml.init
#修改后的配置如下
[root@kube-master certs]# egrep -v "^#|^$" /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["https://192.168.10.128:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "lUES4rBM327_eNH1NO5u"
elasticsearch.ssl.certificate: /etc/kibana/config/client.cer   #相关路径最好写绝对路径
elasticsearch.ssl.key: /etc/kibana/config/client.key
elasticsearch.ssl.certificateAuthorities: /etc/kibana/config/client-ca.cer
elasticsearch.ssl.verificationMode: certificate
logging:appenders:file:type: filefileName: /var/log/kibana/kibana.loglayout:type: jsonroot:appenders:- default- file
pid.file: /run/kibana/kibana.pid
i18n.locale: "zh-CN"

启动kibana

[root@kube-master ~]# systemctl daemon-reload
[root@kube-master ~]# systemctl enable kibana ; systemctl start kibana
#kibana监听地址默认为:5601
[root@kube-master ~]#  netstat -ntplu | egrep 5601
[root@kube-master ~]# netstat -ntplu | egrep 5601
tcp        0      0 0.0.0.0:5601            0.0.0.0:*               LISTEN      19208/node          

通过浏览器访问kibana
在这里插入图片描述

Filebeat

安装 filebeat

[root@kube-master ~]# yum install -y filebeat

到此,所有安装的软件包都已经安装就位,接下来就是配置的修改及调整。由于filebeat涉及到收集各种不同情况下的日志,所以配置不定。下面以收集 nginx 容器日志为例,进行调试配置。

配置调试过程

配置说明

在编写 filebeat 配置文件之前,先了解下 filebeat 配置文件结构,建议参考官方文档:
https://www.elastic.co/guide/en/beats/filebeat/8.14/directory-layout.html
在这里插入图片描述

通过configure目录可以看到配置有很多项,主要要添加的有inputs 和 output 两部分,我们先来看看 inputs,可以看到此版本已经没有docker相关的input了,我们直接查看container input
在这里插入图片描述

container input 使用如下:
在这里插入图片描述

可以直接使用官方提供的示例。
接下来,查看 output 部分。可以看到output的选择也有多种,elasticsearch、redis、kafka等都是常见的。在这直接选用elasticsearch
在这里插入图片描述

目前我们处于配置调试节点,可以将日志收集直接打印在控制台展示,如果数据没问题,再进行配置到 elasticsearch 中,所以这里直接通过 Console输出。
在这里插入图片描述

综上,下面我们开始修改配置文件:

调试

注意配置文件的正确目录(使用绝对路径和相对路径都可),否则无法使用调试模式启动。

[root@kube-master ~]# cd /etc/filebeat/
[root@kube-master ~]# cat > /etc/filebeat/docker-nginx.yml  <<EOF
filebeat.inputs:
- type: containerpaths:- '/data/docker/containers/*/*.log'  #注意与实际使用中的位置一致,后面不在说明output.console:pretty: true
EOF

通过 filebeat 调试模式启动。

[root@kube-master filebeat]# filebeat -e -c docker-nginx.yml
2024-06-28T16:02:28.383+0800    INFO    [registrar]     registrar/registrar.go:109      States Loaded from registrar: 23
2024-06-28T16:02:28.383+0800    INFO    [crawler]       beater/crawler.go:71    Loading Inputs: 1
2024-06-28T16:02:28.383+0800    INFO    [crawler]       beater/crawler.go:117   starting input, keys present on the config: [filebeat.inputs.0.paths.0 filebeat.inputs.0.type]
2024-06-28T16:02:28.383+0800    WARN    [cfgwarn]       log/input.go:89 DEPRECATED: Log input. Use Filestream input instead.
2024-06-28T16:02:28.384+0800    INFO    [input] log/input.go:171        Configured paths: [/data/docker/containers/*/*.log]     {"input_id": "8767ef10-291f-44c7-9475-ccbd3ec07e90"}
2024-06-28T16:02:28.384+0800    INFO    [crawler]       beater/crawler.go:148   Starting input (ID: 17511724858553739275)
2024-06-28T16:02:28.384+0800    INFO    [crawler]       beater/crawler.go:106   Loading and starting Inputs completed. Enabled inputs: 1

出现如上信息,并占用控制台则表示启动成功,等待着日志的打印。
下面我们一个启动 nginx 容器

#新开一个窗口
[root@kube-master ~]# docker run --name ngx -p 80:80 -d nginx:alpine
# 当容器启动成功后,filebeat 控制台就会打印如下信息日志:
{"@timestamp": "2024-07-03T06:33:55.456Z","@metadata": {"beat": "filebeat","type": "_doc","version": "8.14.1"},"message": "2024/07/03 06:33:55 [notice] 1#1: start worker process 33","input": {"type": "container"},"ecs": {"version": "8.0.0"},"host": {"name": "kube-master"},"agent": {"version": "8.14.1","ephemeral_id": "f5c36e56-068b-48f6-8f59-6bda1985f121","id": "142a9309-4240-4fc0-99b9-631405d51c57","name": "kube-master","type": "filebeat"},"log": {"offset": 2197,"file": {"path": "/data/docker/containers/750f085f966d91f180a4303304ec3bd84eb0eacb32b03fd614c171dd12cf57e8/750f085f966d91f180a4303304ec3bd84eb0eacb32b03fd614c171dd12cf57e8-json.log"}},"stream": "stderr"
}

出现这样的信息,说明filebeat 已经捕获到了 容器的日志信息
接下来就要对日志信息进行筛选,大段的日志信息有很多我们并不需要过多的去关注,因此需要剔除无用的信息,继续查看官方文档,文档中有个processors,这个 Processors 可以理解为 filter ,筛选器的意思

在 Processors 子类中,找到了 drop_fields 删除字段配置,打开查看。
在这里插入图片描述

通过官方示例查看,when 当…时候… 这里就是通过条件筛选进行字段的删除,目前我们这里没有条件筛选,尝试直接删除字段。
注意:通过官方文档查看 processors 是与 input 和 output 平级的,所以注意格式。
于是,配置文件又修改为如下:

[root@kube-master ~]# cat > /etc/filebeat/docker-nginx.yml  <<EOF
filebeat.inputs:
- type: containerpaths:- '/data/docker/containers/*/*.log'
processors:
- drop_fields:fields: ["log","agent","ecs"]
output.console:pretty: true
EOF

在刚才的控制台 ctrl + c 结束,重新启动。并在另一个终端使用curl访问Nginx。

[root@kube-master filebeat]# filebeat -e -c docker-nginx.yml
#会有类似以下输出
{"@timestamp": "2024-07-03T06:37:58.196Z","@metadata": {"beat": "filebeat","type": "_doc","version": "8.14.1"},"stream": "stdout","message": "172.17.0.1 - - [03/Jul/2024:06:37:58 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"curl/7.29.0\" \"-\"","input": {"type": "container"},"host": {"name": "kube-master"}
}

到目前为止,已经提取出来对我们有用的日志信息,接下来就可以存储到 elasticsearch 中,查看官方文档如何存储到 es 中。
在这里插入图片描述
在这里插入图片描述
可以看到,如果开启了 https ,如果采用basic认证,需要添加相应的用户名和密码。修改 filebeat 配置如下:

filebeat.inputs:
- type: containerenabled: truepaths:- '/data/docker/containers/*/*.log'
processors:
- drop_fields:fields: ["log","ecs","agent"]
output.elasticsearch:hosts: ["https://192.168.10.128:9200"]ssl.verification_mode: "none"username: "elastic"password: "qz_n3JE==VqIIrPYEnGH"index: "docker-nginx-%{+yyyy.MM.dd}"
setup.ilm.enabled: false            # 关闭索引生命周期
setup.template.enabled: false       # 允许自动生成index模板
setup.template.overwrite: true      # 如果存在模块则覆盖

重启控制台,测试

#ctrl+c后执行
[root@kube-master ~]# filebeat -e -c docker-nginx.yml#重启一个终端
[root@kube-master elasticsearch]# curl http://192.168.10.128#浏览器访问 nginx 容器生成日志,然后通过 curl 查看 es 中所有索引信息:
[root@kube-master filebeat]# curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:qz_n3JE==VqIIrPYEnGH  -XGET "https://192.168.10.128:9200/_cat/indices?v"
health status index                                                              uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
green  open   .internal.alerts-transform.health.alerts-default-000001            YF2DqWchTXOwk9UyEIw6Kg   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.logs.alerts-default-000001          jVc1NW8pSa6NiiX-udEOyQ   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.uptime.alerts-default-000001        VQeUg9lSRzGR9BCUOPd9Yw   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-ml.anomaly-detection.alerts-default-000001        Nzhc5VgIQLWezHR3uf-37w   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.slo.alerts-default-000001           5eI0d1-mQfKJtm7OySZcog   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-default.alerts-default-000001                     V5mTo8DSQVWXBxjYtioKTg   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.apm.alerts-default-000001           9y2hyDdiQ4CJQyhze3dFAg   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.metrics.alerts-default-000001       JKhsfXPRQOKkhg4MTfO0oQ   1   0          0            0       249b           249b         249b
yellow open   docker-nginx-2024.07.03                                            P1WtaXoeRIiNW3VXgGz8nw   1   1          4            0     15.8kb         15.8kb       15.8kb
green  open   .kibana-observability-ai-assistant-conversations-000001            -Uq0kdc2QpuxCulxmLsx6A   1   0          0            0       249b           249b         249b
yellow open   filebeat-8.14.1                                                    TlurNMXVR0mHeYtQkSpmQw   1   1         34            0     30.3kb         30.3kb       30.3kb
green  open   .internal.alerts-ml.anomaly-detection-health.alerts-default-000001 jHcoxn-ZQD2_HD9Sb-OXQQ   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.threshold.alerts-default-000001     3vx1_2frSLaSjApUS_Aehw   1   0          0            0       249b           249b         249b
green  open   .kibana-observability-ai-assistant-kb-000001                       5UwmPLpITZawQqG3BhZt2Q   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-security.alerts-default-000001                    tLakcVM6TVaBSE4AVV42oQ   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-stack.alerts-default-000001                       z5qMabVfRhWy_0dpHVlV-Q   1   0          0            0       249b           249b         249b

可以看到docker-nginx这一条就是我们通过 filebeat 存储进去的日志信息。因为存储的是nginx 容器的日志,开始就做好将索引名修改为 nginx 相关的名字,这样就可以通过索引名确定存储的数据信息。

官网参考内容如下: output -> elasticsearch 相关文档信息
在这里插入图片描述
接下来就可以通过 kibana 展示出来。访问地址为IP+5601端口。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后选择discovery,这样就将 nginx 容器的日志信息收集展示出来了。

后续只需要将 docker-nginx.yml 配置信息整合到 主配置文件 filebeat.yml 中就行了。

进阶配置

现在的数据就简化了很多,只保留对我们有用的信息。接下来就要考虑几个问题:

  • nginx 日志分为 access.log 和 error.log 如何区分存储?
  • 如果多个容器如果区分不同的容器日志?

stdout 及 stderr 存入不同索引

对于 nginx来说,有时候我们可能只需要关注错误日志,如何区分存储呢?其实查看上面控制台输出的日志内容不难发现一个字段:stream

#kibana界面查看的
{"@timestamp": ["2024-07-03T09:59:37.389Z"],"host.name": ["kube-master"],"host.name.keyword": ["kube-master"],"input.type": ["container"],"input.type.keyword": ["container"],"message": ["172.17.0.1 - - [03/Jul/2024:09:59:37 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"curl/7.29.0\" \"-\""],"message.keyword": ["172.17.0.1 - - [03/Jul/2024:09:59:37 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"curl/7.29.0\" \"-\""],"stream": ["stdout"],"stream.keyword": ["stdout"],"_id": "Jc8OeJABFRRxL93Ei_Nk","_index": "docker-nginx-2024.07.03","_score": null
}

其实对于 nginx 这样的容器,遵循一个标准,标准输出到 stdout 标准错误输出到 stderr 可进入容器查看:

[root@kube-master filebeat]# docker exec -it 75 /bin/sh
/ # ls -l /var/log/nginx/
total 0
lrwxrwxrwx    1 root     root            11 Dec 29  2021 access.log -> /dev/stdout
lrwxrwxrwx    1 root     root            11 Dec 29  2021 error.log -> /dev/stderr

所以,对于 stream: stderr 就是需要关注的 错误日志,所以根据字段条件进行区分,修改 filebeat 调试配置文件如下:

[root@kube-master filebeat]# cat docker-nginx.yml 
filebeat.inputs:
- type: containerpaths:- '/data/docker/containers/*/*.log'
processors:
- drop_fields:fields: ["log","agent","ecs"]
output.elasticsearch:hosts: ["https://192.168.10.128:9200"]ssl.verification_mode: "none"username: "elastic"password: "qz_n3JE==VqIIrPYEnGH"indices:- index: "docker-nginx-access-%{+yyyy.MM.dd}"when.contains:stream: "stdout"- index: "docker-nginx-error-%{+yyyy.MM.dd}"when.contains:stream: "stderr"
setup.ilm.enabled: false         
setup.template.enabled: false      
setup.template.overwrite: true

开始调试,调试 filebeat 时,先关闭 filebeat服务

[root@kube-master filebeat]#  systemctl stop filebeat
[root@kube-master filebeat]# filebeat -e -c docker-nginx.yml

通过curl命令访问nginx,一个正常能访问的uri和一个并不存在的 uri 让其生成错误日志,然后查看索引:

#另开终端
[root@kube-master filebeat]# curl http://192.168.10.128
[root@kube-master filebeat]# curl http://192.168.10.128/123
[root@kube-master filebeat]# !1124
curl http://192.168.10.128:9200/_cat/indices?v
health status index                              uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .geoip_databases                   xZCNQt1qSXmYVt_ZruchyQ   1   0         33            0     31.2mb         31.2mb
yellow open   docker-nginx-access-2024.07.01     IHOUT7PJR2i1prqtBHhUPA   1   1          2            0      5.3kb          5.3kb
green  open   .kibana_task_manager_7.17.22_001   DoS2iFZNTPeRYCduvqRrXA   1   0         17         3058    434.7kb        434.7kb
green  open   .apm-custom-link                   trobzSMtS6iAUbG7jwGSuQ   1   0          0            0       227b           227b
green  open   .kibana_7.17.22_001                sHUgOQ3cRzG-oie60O7fpQ   1   0         29           13      2.3mb          2.3mb
yellow open   docker-nginx-2024.07.01            f5sBI4EMRvWg5-WdPdX7bA   1   1          3            0     10.3kb         10.3kb
green  open   .apm-agent-configuration           IO4Qcc4tR0GnJnoOVeXimw   1   0          0            0       227b           227b
yellow open   filebeat-7.17.22-2024.07.01-000001 yVVnQ8B-QgCKjbSw7CTh9g   1   1          1            0      5.1kb          5.1kb
green  open   .async-search                      r6ov63XgSD2DZJfb00ovUA   1   0          0            0       250b           250b
yellow open   docker-nginx-error-2024.07.01      FITBpG-BSqukRs-mFTU_zw   1   1          1            0      5.2kb          5.2kb
[root@kube-master filebeat]# 

可以看到已经生成 了docker-nginx-access和docker-nginx-error两个索引。然后再kibana中设置,将不同是索引展示出来。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
docker-nginx-error-* 也如上添加展示。然后通过discovery查看,可以看到错误日志中就是刚刚访问的不存在的地址。
在这里插入图片描述
这样, 就可以通过不同的索引展示各种所需日志数据。

总结:该部分解决的问题是:单容器,正常日志和错误日志分类存放的问题。

不同业务容器存入不同索引

容器使用场景,肯定会存在不同的程序或者不同的业务都运行于容器当中。举个最简单的架构 lnmp ,如果将nginx 和 php 的日志如果存储在同一个索引里,日后查询排错还不如直接查看源日志文件,这就违背了搭建日志收集系统的初衷。

通过上面 filebeat 中 inputs 可以看到是 通过解析容器日志目录来获取日志信息的,而容器的名称和ID 都会随着生命周期而变动的,因此无法像物理或者虚拟主机一样通过IP联系起来。这个时候就需要为容器打标签,通过打标签的形式区分不同业务的容器集合。

注意:做这一部分示例前,请将运行中的容器关闭并删除。

[root@kube-master filebeat]# docker rm -f `docker ps -aq`

为容器打标签,以下方式二选一,推进还是使用docker-compose。下面启动两个不同的 web 服务, 一个开启80端口,一个开启 8081 端口,并需要将它们日志存储到不同的索引里。

docker 直接启动打标签

[root@kube-master filebeat]#  docker run --name nginx -p 80:80 --label service=nginx --log-opt labels=service -d nginx:alpine[root@kube-master filebeat]# docker run --name httpd -p 8090:80 --label service=httpd --log-opt labels=service  -d httpd

通过docker-compose 打标签

[root@kube-master filebeat]# cat docker-compose.yml
### docker-compose.yml
version: "3"
services:
#web服务nginx:container_name: "nginx"image: nginx:alpineenvironment:- "TZ=Asia/Shanghai"labels:service: nginxlogging:options:labels: "service"ports:- "80:80"# 8081 web 服务httpd:container_name: "httpd"image: httpd:latestenvironment:- "TZ=Asia/Shanghai"labels:service: httpd		# 标记logging:options:labels: "service"ports:- "8081:80"[root@kube-master filebeat]# docker-compose up -d
[+] Running 2/2⠿ Container nginx  Started                                                                                                                                                                        0.7s⠿ Container httpd  Started 

上面两种方式,任意执行一种。下面查看日志

[root@kube-master filebeat]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS         PORTS                  NAMES
d86461ba1e10   httpd:latest   "httpd-foreground"       22 seconds ago   Up 4 seconds   0.0.0.0:8081->80/tcp   httpd
9dd4970f1da8   nginx:alpine   "/docker-entrypoint.…"   22 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp     nginx
[root@kube-master filebeat]# tail -1 /data/docker/containers/9dd4970f1da81433f61ae5c91c9953a737922e32e179705e5a103a33672357b0/9dd4970f1da81433f61ae5c91c9953a737922e32e179705e5a103a33672357b0-json.log 
{"log":"2024/07/04 13:10:50 [notice] 1#1: start worker process 26\n","stream":"stderr","attrs":{"service":"nginx"},"time":"2024-07-04T05:10:50.872134724Z"}

通过nginx的日志可以看到,日志中多有 attrs 属性字段,就是打的标签,然后下面通过 filebeat output 中 when 条件来过滤。编写修改 filebeat 配置文件:

#文件目录: /etc/filebeat/docker-compose-web.yml
[root@kube-master filebeat]# cat  docker-nginx.yml 
filebeat.inputs:
- type: containerpaths:- '/data/docker/containers/*/*.log'
processors:
- drop_fields:fields: ["log","agent","ecs"]
output.elasticsearch:hosts: ["https://192.168.10.128:9200"]ssl.verification_mode: "none"username: "elastic"password: "qz_n3JE==VqIIrPYEnGH"indices:- index: "web-nginx-access-%{+yyyy.MM.dd}"when.contains:# 日志中包括 docker.attrs.service==nginx 且 stream=stdout 存入web-nginx-access-%{+yyyy.MM.dd}docker.attrs.service: "nginx"           stream: "stdout"- index: "web-nginx-error-%{+yyyy.MM.dd}"when.contains:# 日志中包括 docker.attrs.service==nginx 且 stream=stderr 存入web-nginx-error-%{+yyyy.MM.dd}docker.attrs.service: "nginx"stream: "stderr"- index: "web-httpd-access-%{+yyyy.MM.dd}"when.contains:# 日志中包括 docker.attrs.service==httpd 且 stream=stdout 存入web-httpd-access-%{+yyyy.MM.dd}docker.attrs.service: "httpd"stream: "stdout"- index: "web-httpd-error-%{+yyyy.MM.dd}"when.contains:# 日志中包括 docker.attrs.service==httpd 且 stream=stderr 存入web-httpd-error-%{+yyyy.MM.dd}docker.attrs.service: "httpd"stream: "stderr"
setup.ilm.enabled: false            
setup.template.enabled: false       
setup.template.overwrite: true    

启动:

[root@kube-master filebeat]# filebeat -e -c docker-nginx.yml
#另开终端,通过curl访问后,查看索引
[root@kube-master filebeat]# curl localhost
[root@kube-master filebeat]# curl localhost:8081
[root@kube-master filebeat]# curl localhost/1234   #生成nginx的错误索引
[root@kube-master filebeat]# curl localhost:8081/abcd
[root@kube-master filebeat]# curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:qz_n3JE==VqIIrPYEnGH  -XGET "https://192.168.10.128:9200/_cat/indices?v"
health status index                                                              uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
green  open   .internal.alerts-transform.health.alerts-default-000001            YF2DqWchTXOwk9UyEIw6Kg   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.logs.alerts-default-000001          jVc1NW8pSa6NiiX-udEOyQ   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.uptime.alerts-default-000001        VQeUg9lSRzGR9BCUOPd9Yw   1   0          0            0       249b           249b         249b
yellow open   web-nginx-access-2024.07.04                                        msnfHiqfTSe8LBQfECf0TQ   1   1          2            0      8.7kb          8.7kb        8.7kb
green  open   .internal.alerts-ml.anomaly-detection.alerts-default-000001        Nzhc5VgIQLWezHR3uf-37w   1   0          0            0       249b           249b         249b
yellow open   web-nginx-error-2024.07.04                                         iUnCj98qQyWKByVe1HNvnQ   1   1          1            0      8.8kb          8.8kb        8.8kb
green  open   .internal.alerts-observability.slo.alerts-default-000001           5eI0d1-mQfKJtm7OySZcog   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-default.alerts-default-000001                     V5mTo8DSQVWXBxjYtioKTg   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.apm.alerts-default-000001           9y2hyDdiQ4CJQyhze3dFAg   1   0          0            0       249b           249b         249b
yellow open   docker-nginx-2024.07.04                                            tEN-PUNgTQGwE0xC9ulhTw   1   1         53            0     32.8kb         32.8kb       32.8kb
green  open   .internal.alerts-observability.metrics.alerts-default-000001       JKhsfXPRQOKkhg4MTfO0oQ   1   0          0            0       249b           249b         249b
yellow open   docker-nginx-2024.07.03                                            P1WtaXoeRIiNW3VXgGz8nw   1   1          4            0     15.8kb         15.8kb       15.8kb
green  open   .kibana-observability-ai-assistant-conversations-000001            -Uq0kdc2QpuxCulxmLsx6A   1   0          0            0       249b           249b         249b
yellow open   filebeat-8.14.1                                                    TlurNMXVR0mHeYtQkSpmQw   1   1         34            0     30.3kb         30.3kb       30.3kb
green  open   .internal.alerts-ml.anomaly-detection-health.alerts-default-000001 jHcoxn-ZQD2_HD9Sb-OXQQ   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.threshold.alerts-default-000001     3vx1_2frSLaSjApUS_Aehw   1   0          0            0       249b           249b         249b
yellow open   web-httpd-access-2024.07.04                                        -bmRhMRbScadgv28_wgJ8w   1   1          1            0        8kb            8kb          8kb
green  open   .kibana-observability-ai-assistant-kb-000001                       5UwmPLpITZawQqG3BhZt2Q   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-security.alerts-default-000001                    tLakcVM6TVaBSE4AVV42oQ   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-stack.alerts-default-000001                       z5qMabVfRhWy_0

查看es中的索引可以发现生成了3个我们期望的索引。但是web-httpd-error的相关索引始终没有生成。下面我们来排查原因。

[root@kube-master filebeat]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                  NAMES
d86461ba1e10   httpd:latest   "httpd-foreground"       22 minutes ago   Up 22 minutes   0.0.0.0:8081->80/tcp   httpd
9dd4970f1da8   nginx:alpine   "/docker-entrypoint.…"   22 minutes ago   Up 22 minutes   0.0.0.0:80->80/tcp     nginx
[root@kube-master filebeat]# tail -1   /data/docker/containers/d86461ba1e10bc93a19c91f85a50e0482260f7c429728749786954bf41c1e8e2/d86461ba1e10bc93a19c91f85a50e0482260f7c429728749786954bf41c1e8e2-json.log 
{"log":"172.19.0.1 - - [04/Jul/2024:13:31:44 +0800] \"GET /abcd HTTP/1.1\" 404 196\n","stream":"stdout","attrs":{"service":"httpd"},"time":"2024-07-04T05:31:44.660845556Z"}
[root@kube-master filebeat]# 

可以看到,在httpd服务中,404的相关日志它也是通过stdout输出的,与nginx有一定成差别。下面模拟其他错误来输出到httpd服务的stdout中。

#修改一个需要访问文件的权限
[root@kube-master filebeat]# docker exec -it d8 /bin/sh
# pwd
/usr/local/apache2
# touch htdocs/abcd.html
# chmod -r htdocs/abcd.html#退出容器,再测试
[root@kube-master filebeat]#  curl localhost:8081/abcd.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>[root@kube-master filebeat]# tail -1   /data/docker/containers/d86461ba1e10bc93a19c91f85a50e0482260f7c429728749786954bf41c1e8e2/d86461ba1e10bc93a19c91f85a50e0482260f7c429728749786954bf41c1e8e2-json.log 
{"log":"[Thu Jul 04 13:49:13.584204 2024] [core:error] [pid 9:tid 140382130132736] (13)Permission denied: [client 172.19.0.1:47432] AH00132: file permissions deny server access: /usr/local/apache2/htdocs/abcd.html\n","stream":"stderr","attrs":{"service":"httpd"},"time":"2024-07-04T05:49:13.653158214Z"}
[root@kube-master filebeat]# 

在这里插入图片描述

可以看到,没有权限的403错误是通过stderr输出。web-httpd-error也已经自动生成。

这里就通过不同的条件将不同业务不同类型的日志进行了分开存储,然后在 kibana 如上配置,就可以分类查看。如下:
在这里插入图片描述

从截图也可以看出我们创建的4种索引,并且web-httpd-error中也有我们无权限访问的日志。

更多关于EFK的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs 远程链接ssh 开发 简单实验

1.概要 动态编译语言&#xff0c;跨平台必须做分别的编译&#xff0c;比如linux和windows。如何再windows环境下开发编译出linux平台的程序呢&#xff0c;vs支持远程链接编辑&#xff0c;就是再vs中写代码&#xff0c;但是编译确是链接远程的环境编译的。 2.环境准备 2.1 vs…

R语言学习,入门

我是一名6年开发经验的程序员&#xff0c;后端&#xff0c;大数据&#xff0c;前端都会。 现在加入了医疗行业&#xff0c;要做数据分析&#xff0c;前同事的实验室生信专业的&#xff0c;用的是R语言&#xff0c;为了跑通他的程序。就来学一下吧&#xff0c;看了一下好像挺简…

关于软件本地化,您应该了解什么?

软件本地化是调整软件应用程序以满足目标市场的语言、文化和技术要求的过程。它不仅仅涉及翻译用户界面&#xff1b;它包含一系列活动&#xff0c;以确保软件在目标语言环境中可用且相关。以下是您应该了解的有关软件本地化的一些关键方面&#xff1a; 了解范围 软件本地化是…

水利水电安全员C证考试题库资料,2024年全国考试通用!

1.安全生产民事责任&#xff0c;是指责任主体违反安全生产法律规定造成&#xff08;&#xff09;&#xff0c;由人民法院依照民事法律强制其行使民事赔偿的一种法律责任。民事责任追究的目的是为了最大限度的维护当事人受到民事损害时享有获得民事赔偿的权利。 A.民事损伤 B.…

针对SVN、GIT版本管理工具进行源代码加密保护

针对SVN、GIT版本管理工具进行源代码加密保护 在软件开发过程中&#xff0c;版本管理工具如SVN和GIT是不可或缺的组成部分&#xff0c;它们帮助团队管理源代码的变更和版本。然而&#xff0c;这些工具也面临着源代码泄露的安全风险。如果不针对数据进行加密保护&#xff0c;很…

如何从腾讯云迁移到AWS

随着跨境出海潮不断扩大&#xff0c;企业越来越意识到将工作负载迁移到海外节点的必要性&#xff0c;以获取更多功能、灵活性和性能。然而&#xff0c;顺利迁移业务主机并确保业务稳定访问是一项具有挑战性的任务。在此挑战中&#xff0c;借助AWS迁移工具和迁移流程的强大支持&…

如何检查购买的Facebook账号优劣?

Facebook 是全球最受欢迎的社交网络之一,为品牌广告提供了巨大的潜力。许多公司和营销人员使用 Facebook 来推广他们的产品和服务&#xff0c;经常会购买账号。当然也分出了很多账号&#xff0c;比如个人号&#xff0c;BM号&#xff0c;广告号&#xff0c;小黑号等等。 但是,有…

实现点击Button,改变背景颜色(多个按钮互斥显示)

一 功能描述 在界面中&#xff0c;有一组button&#xff0c;现在需要实现下面功能&#xff1a;点击其中一个&#xff0c;改变被点击button的背景颜色。当点击下一个之后&#xff0c;之前点击过的按钮背景颜色还原&#xff0c;当前被点击的button背景色又被改变。效果如下图&…

【JavaEE】多线程代码案例(2)

&#x1f38f;&#x1f38f;&#x1f38f;个人主页&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;JavaEE专栏&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;上一篇文章&#xff1a;多线程代码案例(1)&a…

女性经济崛起,天润融通用客户感知挖掘市场潜力

每逢一年一度的国际妇女节&#xff0c;“女性”话题都会被郑重地讨论。 从消费市场上来说&#xff0c;最近几年女性群体正在拥有越来越大的影响力&#xff0c;甚至出现了“她经济”这样的专属词汇在最近几年被市场反复讨论。 毫无疑问&#xff0c;女性消费群体的崛起已经成为…

监控平台—Zabbix对接grafana

目录 一、安装grafana并启动 二.浏览器访问 三、导入zabbix数据&#xff0c;对接grafana 四.如何导入模版 一、安装grafana并启动 添加一台服务器192.168.80.102 初始化操作 systemctl disable --now firewalld setenforce 0 vim /etc/selinux/config SELINUXdisabled cd /…

一文解开关于UWB定位技术的认识误区

作为一项新兴技术产业&#xff0c;UWB定位技术具有无限发展潜力。尤其是在TB行业应用中&#xff0c;UWB定位部分在项目的产值占比为10%-20%之间&#xff0c;这便意味着&#xff0c;UWB定位市场可以撬动其本身市场产值的5-10倍。 然而&#xff0c;伴随着UWB定位技术的迅速发展&a…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【通用密钥库基础概念】

通用密钥库基础概念 在使用通用密钥库完成应用开发前&#xff0c;开发者需要了解以下相关概念&#xff0c;以下概念将贯穿整个开发过程。 可信执行环境&#xff08;TEE&#xff09; 可信执行环境&#xff08;Trusted Execution Environment&#xff09;&#xff0c;简称TEE&…

论文解读StyleGAN系列——StyleGANv1

论文&#xff1a;A Style-Based Generator Architecture for Generative Adversarial Networks&#xff08;2018.12&#xff09; 作者&#xff1a;Tero Karras, Samuli Laine, Timo Aila 链接&#xff1a;https://arxiv.org/abs/1812.04948 代码&#xff1a;https://github.com…

Movable antenna 早期研究

原英文论文名字Historical Review of Fluid Antenna and Movable Antenna 最近&#xff0c;无线通信研究界对“流体天线”和“可移动天线”两种新兴天线技术的发展引起了极大的关注&#xff0c;这两种技术因其前所未有的灵活性和可重构性而极大地提高了无线应用中的系统性能。…

怎么把视频中走来走去的人去掉?

现在短视频火爆&#xff0c;很多朋友都会将生活中一些特定的场面拍摄记录下来。通过剪辑发布到一些短视频平台上&#xff0c;但是有时拍摄的视频不是那么完美&#xff0c;会拍到不相关的人或物&#xff0c;影响画面的主体&#xff0c;这种情况下我们可以去除视频中无关的走来走…

c++ primer plus 第15章友,异常和其他:友元类

c primer plus 第15章友&#xff0c;异常和其他&#xff1a;友元类 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;友元类 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的…

5个文章生成器免费版,自动写作文章更轻松

在这个信息如洪流般涌动的时代&#xff0c;写作所具有的重要性不言而喻。不管是学生需要完成的作业&#xff0c;还是职场人士得提交的报告&#xff0c;亦或是自媒体创作者必须输出的内容&#xff0c;都迫切要求我们具备一定的写作技能。然而&#xff0c;写作对很多人来说&#…

C++实现一个简单的Qt信号槽机制(1)

昨天写这个文章《深入探讨C的高级反射机制&#xff08;2&#xff09;&#xff1a;写个能用的反射库》的时候就在想&#xff0c;是不是也能在这套反射逻辑的基础上&#xff0c;实现一个类似Qt的信号槽机制&#xff1f; Qt信号槽机制简介 所谓的Qt的信号槽&#xff08;Signals …

隐私集合求交(PSI)原理深入浅出

隐私集合求交技术是多方安全计算领域的一个子问题&#xff0c;通常也被称为安全求交、隐私保护集合交集或者隐私交集技术等&#xff0c;其目的是允许持有各自数据集的双方或者多方&#xff0c;执行两方或者多方集合的交集计算&#xff0c;当PSI执行完成&#xff0c;一方或者两方…