通过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.rhkb.cn/news/315566.html

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

相关文章

应用实战 | 别踩白块小游戏,邀请大家来PK挑战~

“踩白块会输”是一个简单的微信小程序游戏&#xff0c;灵感来自当年火热的别踩白块游戏&#xff0c;程序内分成三个模块&#xff1a;手残模式、经典模式和极速模式&#xff0c;分别对应由易到难的三种玩法&#xff0c;可以查看游戏排名。动画效果采用JS实现&#xff0c;小程序…

opencv可视化图片-----c++

可视化图片 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>// 将数据类型转换为字符串 std::string opencvTool::type2str(int type) {std::string r;uchar depth type & CV_MAT_DEPTH_MASK;uchar chans 1 (typ…

java开发之路——用户管理中心_简单初始化

用户管理中心_简单初始化 (一) 初始化项目1. 使用 Ant Design Pro(现成的管理系统) 进行前端初始化2. 后端初始化三种初始化java项目 (二) 遇到的问题【问题1】Ant design pro页面打不开&#xff0c;一直在budiling控制台出现错误error-./src/components/index.ts【问题2】初始…

数据结构和算法:贪心

贪心算法 贪心算法是一种常见的解决优化问题的算法&#xff0c;其基本思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优的决策&#xff0c;以期获得全局最优解。 贪心算法和动态规划都常用于解决优化问题。它们之间存在一…

51.HarmonyOS鸿蒙系统 App(ArkUI)通知

普通文本通知测试 长文本通知测试 多行文本通知测试 图片通知测试 进度条通知测试 通知简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知常见的使用场景&#xff1a; 显示接收到的短消息、…

GPT-3.5 Turbo 的 temperature 设置为 0 就是贪婪解码?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 将 GPT-3.5 Turbo 的 temperature 设置为 0 通常意味着采用贪婪解码&#xff08;greedy decoding&#xff09;策略。在贪婪解码中&#xff0c;模型在每一步生成文本时选择概率最高的词元&#xff0c;从…

Leetcode—1672. 最富有客户的资产总量【简单】

2024每日刷题&#xff08;120&#xff09; Leetcode—1672. 最富有客户的资产总量 实现代码 class Solution { public:int maximumWealth(vector<vector<int>>& accounts) {int ans 0;for(vector<vector<int>>::iterator it accounts.begin();…

SEGGER Embedded Studio IDE移植FreeRTOS

SEGGER Embedded Studio IDE移植FreeRTOS 一、简介二、技术路线2.1 获取FreeRTOS源码2.2 将必要的文件复制到工程中2.2.1 移植C文件2.2.2 移植portable文件2.2.3 移植头文件 2.3 创建FreeRTOSConfig.h并进行配置2.3.1 处理中断优先级2.3.2 configASSERT( x )的处理2.3.3 关于系…

PostgreSQL 14 向量相似度搜索插件 (pgvector) 安装指南

本文是关于在 PostgreSQL 14 中安装并使用向量相似度搜索插件(pgvector)的详细指南。此插件允许用户在数据库中执行高效的向量运算,特别适用于机器学习模型的向量数据存储与检索场景。 环境需求 已安装PostgreSQL 14或更高版本。安装了Visual Studio 2022,用于编译插件。安装…

CentOS命令大全:掌握关键命令及其精妙用法!

CentOS是一种流行的开源企业级Linux发行版&#xff0c;它基于Red Hat Enterprise Linux (RHEL)的源代码构建。对于系统管理员和运维工程师来说&#xff0c;掌握CentOS的常用命令至关重要。 这些命令不仅可以帮助管理服务器&#xff0c;还可以进行故障排查、性能监控和安全加固等…

fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/

Git error. Command: git fetch stdout: stderr: fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/’: Failed to connect to github.com port 443 after 75005 ms: Couldn’t connect to server exit code: 128 GitHub (国际型)代码 分发平台/托管平…

IDM下载器安装cmd注册

一、下载注册 安装包去IDM官网下载最新的试用版即可 或者直达百度网盘下载&#xff08;担心被河蟹&#xff0c;放在txt中了&#xff09;包含IDM下载器安装包和注册软件 IDM下载器安装包和注册软件下载地址链接 https://download.csdn.net/download/qq_31237581/89215452 如果…

第十五届蓝桥杯省赛第二场PythonB组A题【进制】题解(AC)

解题思路 按照题意进行模拟&#xff0c;计算 x x x 的 b b b 进制过程中&#xff0c;若出现余数大于 9 9 9&#xff0c;则说明 x x x 的 b b b 进制一定要用字母进行表示。 x 8100178706957568def check(x, b):while x:if x % b > 10:return Falsex // breturn True…

C# 开源SDK 工业相机库 调用海康相机 大恒相机

C# MG.CamCtrl 工业相机库 介绍一、使用案例二、使用介绍1、工厂模式创建实例2、枚举设备&#xff0c;初始化3、启动相机4、取图5、注销相机 三、接口1、相机操作2、启动方式3、取图4、设置/获取参数 介绍 c# 相机库&#xff0c;含海康、大恒品牌2D相机的常用功能。 底层采用回…

AI大模型探索之路-训练篇2:大语言模型预训练基础认知

文章目录 前言一、预训练流程分析二、预训练两大挑战三、预训练网络通信四、预训练数据并行五、预训练模型并行六、预训练3D并行七、预训练代码示例总结 前言 在人工智能的宏伟蓝图中&#xff0c;大语言模型&#xff08;LLM&#xff09;的预训练是构筑智慧之塔的基石。预训练过…

eclipse 如何创建python文件

一、准备 1.平台要求&#xff1a; 电脑除了要安装eclipse软件和Python语言包之外&#xff0c;还需要将Python集成到eclipse软件中&#xff0c;网上有很多的方法&#xff0c;这里就不细细介绍如何集成了。 在下面界面中可以看到自己已经安装了继承插件。具体方法见步骤2&…

运维 kubernetes(k8s)基础学习

一、容器相关 1、发展历程&#xff1a;主机–虚拟机–容器 主机类似别墅的概念&#xff0c;一个地基上盖的房子只属于一个人家&#xff0c;很多房子会空出来&#xff0c;资源比较空闲浪费。 虚拟机类似楼房&#xff0c;一个地基上盖的楼房住着很多人家&#xff0c;相对主机模式…

Linux——(关于权限常见的3个问题)

文章目录 1.修改文件或者目录的拥有者和所属组1.1chown指令1.2chgrp指令 2.常见的权限三个问题2.1对应一个目录&#xff0c;如果要进入&#xff0c;需要什么权限&#xff1f;2.2为什么我们创建的文件默认权限不是7772.2.1关于Linux下的权限掩码 2.3文件能否被删除取决于什么2.3…

upload-labs通关

前记&#xff1a; 在这里面我们使用一句话木马时使用php里的一个函数phpinfo&#xff08;&#xff09;&#xff0c;该函数能显示出网页具体的php版本和有关的信息。 pass-01&#xff08;js前端验证&#xff09; 方法1&#xff1a;禁用js/删除js验证 1.禁用js 按f12&#xff…

Android Studio开发工具学习之Git远程仓库拉取与推送

Git远程仓库操作 1.1 推送项目到远端服务器1.1.1 进入Gitee或Github、创建一个新的仓库1.1.2 将Android Studio中项目推送至Gitee 1.2 从远端服务器拉取项目1.2.1 AS工程页拉取新项目1.2.2 AS启动页拉取项目 1.1 推送项目到远端服务器 1.1.1 进入Gitee或Github、创建一个新的仓…