通过filebeat实现对docker服务的通用日志收集

平台

依赖

linux
docker
docker-compose 或者 docker compose

镜像

docker.elastic.co/beats/filebeat:8.12.2
docker.elastic.co/beats/kibana:8.12.2
docker.elastic.co/beats/elasticsearch:8.12.2

正文

背景

对于有自建机房的公司来说,如果公司的运维技术能力不是很强,那么通过docker部署内部服务自然成了首选(其实K8S搭建的服务依然会遇到这个问题,部署方式于此基本相同,主要是filebeat的元数据处理器从add_docker_metadata修改为add_kubernetes_metadata)。
同时,很多服务需要保证一定的可用性,也就需要多实例加滚动更新,在这种情况下自然需要在不同机器上部署实例
当生产服务出现问题时,想查看日志就必须要登录对应的服务器去挨个查看,运气不好要看完所有实例才能找到,十分痛苦。
所以希望有个统一的日志平台收集分散在各个服务器上的日志,做集中查询,自然地ELK三剑客(众所周知,3剑客有4个,还有filebeat)就成了我们的首选。

技术原理

通过docker启动的服务,其日志会保存在 /var/lib/docker/containers目录下,并以容器ID生成子目录,保存容器的配置、日志等
在这里插入图片描述
查看完整的容器ID
在这里插入图片描述

在这里插入图片描述

平时通过docker logs -f {容器ID}读取的就是保存在上述目录下的日志文件,因为docker以json格式保存日志,所以日志文件为 容器ID-json.log
在这里插入图片描述
至此,我们有了 服务 -> 容器实例 -> 服务日志 这样的映射关系。
但是依然不太方便,需要额外自主处理服务到容器实例日志的映射。

对于这样常用场景,filebeat官方为我们提供的docker元数据处理器处理
filebeat的docker元数据处理器
我们只需要添加docker.sock这个与docker通信的套接字,filebeat就能从中获取docker启用的服务列表等元数据。
/var/run/docker.sock

When running Filebeat in a container, you need to provide access to Docker’s unix socket in order for the add_docker_metadata processor to work. You can do this by mounting the socket inside the container. For example:

之后,再借助filebeat提供的自定义处理功能,提取服务名,再把对应日志上传到各自服务名的日志即可。

至于是否需要logstash,至少以我们当前的需求来说不需要logstash在进行额外处理,已经基本满足。

由于篇幅有限,这里就不再复述如何部署es和kibana了。

部署filebeat

  1. 编写filebeat的部署文件
    docker-compose.yml
version: "3"services:filebeat:image: 'docker.elastic.co/beats/filebeat:8.12.2'container_name: filebeatrestart: alwaysuser: "root"volumes:# docker容器日志- /var/lib/docker/containers:/var/lib/docker/containers:ro# docker 进程通信socket- /var/run/docker.sock:/var/run/docker.sock:ro# 时区 保证容器与宿主机的时区统一- /etc/localtime:/etc/localtime:ro# filebeat运行使用的配置文件 请根据实际情况调整- /code/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro# filebeat运行时记录的元数据- /code/filebeat/data:/usr/share/filebeat/data:rw# filebeat运行时的日志- /code/filebeat/logs:/usr/share/filebeat/logs:rwcommand:- filebeatdeploy: # 资源限制resources:limits:# filebeat 是轻量级的日志收集程序,所需资源比较少cpus: '0.3'memory: 256M
  1. filebeat的配置文件
    filebeat.yml
filebeat.inputs:- type: containerenabled: truestream: allformat: dockerpaths:# 处理空间下的日志 支持一定的通配符,k8s环境下会包含空间前缀,可以在此处过滤掉- "/var/lib/docker/containers/*/*.log"fields:multiline:# 做多行日志聚合,此处是针对java的异常堆栈信息聚合(所有非年-月-日开头的日志会被聚合到最开始匹配到的那一行展示)type: patternpattern: '^\d+.\d+.\d+|^\d+.\w{3}.\d+'negate: truematch: afterprocessors:- add_docker_metadata:host: "unix:///var/run/docker.sock"# 去掉不需要的字段- drop_fields:ignore_missing: true # 字段不存在时不报错fields: - agent.type.keyword- agent.type- agent.name- agent.id.keyword- agent.id- host.name- host.name.keyword- script:# 增加js脚本,处理服务名称 此处我是通过获取事件中的镜像名称,切割出我需要的部分作为后续的服务名添加到事件servcie字段中lang: javascripttimeout: 100source: > function process(event) { var s = event.Get('container.image.name');if (!s) {return event;}var sp = s.lastIndexOf('/');sp = sp < 0 ? 0 : sp + 1;var ep = s.indexOf(':');if (ep < 0) {event.Put('service', s.substring(sp));}event.Put('service', s.substring(sp, ep));}- drop_event:# 不采集下面服务的日志事件when: or:- contains:service: 'filebeat'- contains: service: 'grafana'- contains: service: 'logstash'
output.elasticsearch:# es服务的地址hosts: ["https://192.168.224.170:9200"]# es用户名username: elastic# es密码password: ""# 传输压缩级别compression_leveledit: 4ssl:# 不验证ssl证书verification_mode: noneindices:# service会作为上报的日志文件的名字参与进去- index: "host-log-%{[service]}-%{+yyyy.MM.dd}"when.has_fields:- service- index: "host-log-default-%{+yyyy.MM.dd}"setup.template.enabled: false
setup.ilm.enabled: false
  1. 部署filebeat容器 在这里插入图片描述
    /code/filebeat这个目录下添加上面的2个yml文件,并创建 /data/logs目录之后
docker-compose -f docker-compose.yml up -d
  1. 验证日志上传
    登录kibana的web界面,查看索引管理信息,就能看到日志已经按照服务进行了切割
    在这里插入图片描述
  2. 配置数据视图
    在这里插入图片描述
    由于我已经创建过该数据视图,所以提示错误了
    在这里插入图片描述
  3. 使用kibana查询日志

进入discover,我们就能选择已经创建的数据视图,切换完成后,搜索的日志就全是该服务下的日志信息了。
在这里插入图片描述
比较抱歉,上述演示的服务没有日志,我换了一个展示,途中所展示的字段偏少,是因为很多无用字段被我剔除了。
在这里插入图片描述
异常日志聚合展示的效果
在这里插入图片描述

在k8s下部署filebeat的调整

  1. 日志采集路径可以不做调整,但使用/var/log/containers会更加清楚方便。
    在这里插入图片描述
    pd-line-manage-x-6956486dc9-ptb9f_dev_pd-line-manage-x-929ae622ee5d893c8aa87dba621a3bb25508f2a7e0ca09791133ee804c2ad179.log举例,日志会按照{POD的ID}_{命名空间}_{Deployment名}-{容器ID}这样的规则软连接到docker容器下的日志存放目录。
    注:这是k8s使用的是docker容器,如果使用其他CRI就不一定是这样了。

在这里插入图片描述

在这里插入图片描述
2. filebeat的部署方式建议采用Daemonsets
这样filebeat的实例会自动在每个机器上部署。

  1. filbeat配置文件调整
paths:# 处理空间下的日志 支持一定的通配符,k8s环境下会包含空间前缀,可以在此处过滤掉- "/var/lib/docker/containers/*/*.log"
processors:- add_docker_metadata:host: "unix:///var/run/docker.sock"

修改为

paths:# 只处理dev空间下的日志- "/var/log/containers/*_dev_*.log"
processors:- add_kubernetes_metadata:host: ${NODE_NAME}# 只收集dev空间的日志namespace: dev# 提取k8s集群中的一些环境变量信息in_cluster: truematchers:- logs_path:logs_path: "/var/log/containers/"

这样大体就实现了在k8s部署filebeat,整体与收集docker日志类似。

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

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

相关文章

Stable Diffusion使用ControlNet:IP-Adapter实现图片风格迁移

IP-Adapter 全称是 Text Compatible Image Prompt Adapter for Text-to-Image Diffusion Models&#xff08;文本到图像扩散模型的文本兼容图像提示适配器&#xff09;&#xff0c;是腾讯研究院出品的一个新的ControlNet模型&#xff0c;旨在使预训练的文本到图像扩散模型能够生…

【06】JAVASE-数组讲解【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

MySQL商城数据表(20-29)

20快递表 DROP TABLE IF EXISTS xuge_express; CREATE TABLE xuge_express (expressId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,expressName varchar(50) NOT NULL COMMENT 快递名称,-dataFlag tinyint(4) NOT NULL DEFAULT 1 COMMENT 有效标记&#xff08;1 &#x…

安装 wsl-ubuntu 24.04

安装 wsl-ubuntu 24.04 1. 安装 Ubuntu-24.042. (可选)配置阿里云软件源3. 系统更新 1. 安装 Ubuntu-24.04 安装 Ubuntu-24.04&#xff0c;默认会安装在 C 盘&#xff0c; wsl --install -d Ubuntu-24.04导出 Ubuntu-24.04&#xff0c; wsl --export Ubuntu-24.04 D:\tmp\Ub…

最全GPTs使用教程+Prompt预设词教程

使用指南 直接复制使用 可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; https://ai.sparkaigf.com 现已支持GPTs 雅思写作考官 我希望你假定自己是雅思写作考官&#xff0c;根据雅思评判标准&#xff0c;按我给你的雅思考题和对应…

从零入门区块链和比特币(第三期)

欢迎来到我的区块链与比特币入门指南&#xff01;如果你对区块链和比特币感兴趣&#xff0c;但不知道从何开始&#xff0c;那么你来对地方了。本博客将为你提供一个简明扼要的介绍&#xff0c;帮助你了解这个领域的基础知识&#xff0c;并引导你进一步探索这个激动人心的领域。…

一些基础知识FK

1. 群体稳定性指数PSI 通过 PSI(Population Stability Index) 指标&#xff0c;可以得到不同样本下&#xff0c;模型在各分数段分布的稳定性。用于衡量两个群体(比如两个时间点、两个子群体等)之间稳定性的指标。通常PSI被用于评估信用风险模型、预测模型等在不同时间点或不同群…

selenium显式等待和隐式等待的区别

Selenium是一个自动化测试工具&#xff0c;用于模拟用户在Web浏览器上的操作。在Selenium中&#xff0c;等待是一种常见的操作&#xff0c;因为网页元素可能不会立即加载。Selenium提供了两种主要的等待策略&#xff1a;显式等待和隐式等待。 显式等待&#xff08;Explicit Wai…

Java 长字符串拼接性能优化

文章目录 引言I values 值拼接II RestController 返回参数不需要手动转JSON字符串III 多语句执行(allowMultiQueries=true)3.1 需求:通过XML手动拼接SQL实现多值插入3.2 案例引言 批量新增数据( values 值拼接 )RestController 返回参数不需要手动转JSON字符串。I values …

安装配置Maven(idea里面配置)

放在这个路径下&#xff08;如果需要可以免费发给你&#xff0c;dd我就好了&#xff09; D:\IearnSoftware\maven\apache-maven-3.6.1-bin.zip&#xff08;我自己的路径下面&#xff0c;防止忘记&#xff09; 1.首先测试maven在不在&#xff0c;配置对不对 mvn -v 这样就是成…

STM32HAL库++ESP8266+cJSON连接阿里云物联网平台

实验使用资源&#xff1a;正点原子F1 USART1&#xff1a;PA9P、A10&#xff08;串口打印调试&#xff09; USART3&#xff1a;PB10、PB11&#xff08;WiFi模块&#xff09; DHT11&#xff1a;PG11&#xff08;采集数据、上报&#xff09; LED0、1&#xff1a;PB5、PE5&#xff…

【微信小程序调用百度API实现图像识别实战】-前后端加强版

前言&#xff1a;基于前面两篇图像识别项目实战文章进行了改造升级。 第一篇 入门【微信小程序调用百度API实现图像识别功能】----项目实战 第二篇 前后端结合 【微信小程序调用百度API实现图像识别实战】----前后端分离 这一篇主要讲述的是在第二篇的基础上新增意见反馈功能&a…

第72天:漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

案例一&#xff1a;某 APP-Web 扫描-常规&联动-Burp&Awvs&Xray Acunetix 一款商业的 Web 漏洞扫描程序&#xff0c;它可以检查 Web 应用程序中的漏洞&#xff0c;如 SQL 注入、跨站脚本攻击、身份验证页上的弱口令长度等。它拥有一个操作方便的图形用户界 面&#…

探索Midjourney的艺术地图:常用画质关键词导航

在这个由人工智能驱动的创意世界中&#xff0c;画质的控制成为了每一位创作者追求作品完美的关键。Midjourney提供了一系列的关键词&#xff0c;让我们能够细致地调整我们心中所想象的场景与人物。从质感、明暗到风格&#xff0c;这些关键词就像是调色盘上的色彩&#xff0c;每…

实验8 NAT配置

实验8 NAT配置 一、 原理描述二、 实验目的三、 实验内容1.实验场景2.实验要求 四、 实验配置五、 实验步骤2.静态NAT配置3.NAT Outbound配置4.NAT Easy-IP配置 一、 原理描述 2019年11月26日&#xff0c;全球43亿个IPv4地址正式耗尽&#xff0c;这意味着没有更多的IPv4地址可…

Taro引入echarts【兼容多端小程序(飞书/微信/支付宝小程序)】

近期接到公司新需求&#xff0c;开发飞书小程序&#xff0c;并且原型中含有大量的图表&#xff0c;本想使用飞书内置图表组件 —— chart-space&#xff0c;但官方表示已经停止维护了&#xff0c;无奈之下&#xff0c;只能另寻他路&#xff0c;于是乎&#xff0c;图表之王&…

【Godot4.2】自定义Todo清单类 - myTodoList

概述 在写myList类的时候&#xff0c;就想到可以写一个类似的Todo清单类。 基础思路 本质还是在内部维护一个数组&#xff0c;在其基础上进行增删改查操作的封装为了方便存储数据&#xff0c;编写一个自定义内置类TodoItem&#xff0c;内部数组就变成了Array[TodoItem]类型的…

【Flutter】GetX

前言 状态管理 / 路由管理 / 依赖管理 这三部分之间存在联系 参考文章 建议看官网文章&#xff0c;很详细 &#xff0c;pub.dev搜索get pub.dev的文档 状态管理文章相关链接 状态管理 案例 实现一个计算器&#xff0c;运用GetX去管理它 构建界面 构建一个计算器界面 …

openssl3.2 - exp - get openssl version info

文章目录 openssl3.2 - exp - get openssl version info概述笔记END openssl3.2 - exp - get openssl version info 概述 查资料时&#xff0c;看到用API取旧版openssl取版本信息。 去openssl工程中看了一下&#xff0c;有个内部测试程序有如何取openssl版本信息的API调用例子…

GateWay具体的使用之全链路跟踪TraceId日志

1.创建全局过滤器&#xff0c;在请求头上带入traceId参数&#xff0c;穿透到下游服务. package com.by.filter;import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.jwt.JWTValidator;…