elk收集k8s微服务日志

一、前言

     使用filebeat自动发现收集k8s的pod日志,这里分别收集前端的nginx日志,还有后端的服务java日志,所有格式都是用json格式,建议还是需要让开发人员去输出java的日志为json,logstash分割java日志为json格式,在日志量大的情况下非常消耗资源

二、收集日志配置

    主要是配置filebeat和logstash进行日志的收集和分割,我这里的后端服务java日志不是json格式,所以需要自己去分割为json日志,有条件的也可以让开发直接输出json格式的日志,前端的只要收集nginx的access日志即可,nginx的可以直接配置为json格式输出

    filebeat配置

   vi filebeat-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: filebeat-confignamespace: elkdata:filebeat.yml: |filebeat.autodiscover:       #使用filebeat自动发现模块providers:- type: kubernetes        #配置为k8s类型 templates:- condition:         #通过标签、命名空间筛选需要的pod日志,这里是匹配后端服务的日志and:- or:- equals:kubernetes.labels:app: foundation- equals:kubernetes.labels:app: api-gateway- equals:kubernetes.labels:app: field- equals:kubernetes.labels:app: report- equals:kubernetes.namespace: java-serviceconfig:            #配置收集的pod日志路径,这里配置日志路径时要使用变量的方式定义日志路径,至于为什么使用这些变量,可以自行去看一下该日志目录下的路径名称- type: container    #配置为container模式symlinks: true      #使用了软链接的话需要加上该配置paths:- /var/log/containers/${data.kubernetes.pod.name}_${data.kubernetes.namespace}_${data.kubernetes.container.name}-*.logmultiline.pattern: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'  #使用multiline匹配以时间开头的行multiline.negate: true     #反转匹配的内容,即匹配不是以时间开头的行multiline.match: after     #将匹配到不是以时间开头的行就合并到上一个事件中- condition:      #通过标签、命名空间筛选需要的pod日志,这里是匹配前端服务的日志,这里是因为前端的日志格式和后端的日志格式不一样,所以分开收集and:- or:- equals:kubernetes.labels:app: nodejs- equals:kubernetes.namespace: nodejsconfig:- type: containersymlinks: truepaths:- /var/log/containers/${data.kubernetes.pod.name}_${data.kubernetes.namespace}_${data.kubernetes.container.name}-*.logprocessors:         #配置filebeat识别收集的日志格式为json,这里前端的日志已经配置为了json格式,所以在filebeat收集的时候需要将日志识别为json格式的日志,不配置的话收集出来的是一整串日志,和普通日志一样- decode_json_fields:fields: ["message"]target: ""overwrite_keys: trueadd_error_key: trueoutput.logstash:          #将收集的日志输出到logstashhosts: ['logstash.elk:5044']

   logstash配置

vi logstash-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: logstash-configmapnamespace: elklabels:app: logstash
data:logstash.conf: |input {beats {port => 5044#   codec => "json"}}filter {grok {        #这里使用grok将java日志分割为json格式match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:level}\s+%{NUMBER:thread}\s+---\s+\[%{DATA:thread_name}\]\s+%{JAVACLASS:java_class}\s+:\s+%{GREEDYDATA:log_message}"}}}output {# stdout{                 #该项为测试模式,将收集的日志内容输出到logstash的日志中#   codec => rubydebug# }elasticsearch {hosts => "elasticsearch:9200"    #这里的索引名称使用日志中包含的变量自动命名index => "%{[kubernetes][container][name]}-%{+YYYY.MM.dd}"}}

这里对java日志进行一下说明,java日志都是特定的日期格式开头,基本上都是单行的,除了报错日志,报错日志会换行,因为报错栈非常多,filebeat收集日志是一行一行收集的,在收集java报错日志的时候就会出现问题,错误日志的报错栈也被分开很多行去收集了,这是有问题的,所以会在filebeat收集java日志的时候加入multiline,进行事务的一个合并,下面来看一下java的日志

正常日志

可以看到都是以特定的时间格式开头

错误日志

其实错误日志的结构和正常日志是一样的,只是后面的报错栈被分行了,所以在filebeat使用multiline将这些不是以时间开头的行合并到上一个事件中即可

 可以使用kibana试验一下对java日志的分割是否能生效

%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:level}\s+%{NUMBER:thread}\s+---\s+\[%{DATA:thread_name}\]\s+%{JAVACLASS:java_class}\s+:\s+%{GREEDYDATA:log_message}

前端日志对于nginx的配置也做一下说明,需要在nginx配置文件中提前定义nginx的日志格式

vi nginx-public.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: public-confignamespace: nodejs
data:nginx.conf: |user  nginx;worker_processes  auto;error_log  /var/log/nginx/error.log notice;pid        /var/run/nginx.pid;events {worker_connections  1024;}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';log_format access '{"timestamp":"$time_iso8601",'      #定义json格式的日志'"remote_addr":"$remote_addr",''"remote_user":"$remote_user",''"body_bytes_sent":$body_bytes_sent,''"request_time":$request_time,''"status": "$status",''"host":"$host",''"request":"$request",''"request_method":"$request_method",''"uri":"$uri",''"http_referer":"$http_referer",''"http_x_forwarded_for":"$http_x_forwarded_for",''"http_user_agent":"$http_user_agent"''}';        access_log  /var/log/nginx/access.log  access;  #使用json格式的日志作为日志的输出sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;}

 对于filebeat自动发现收集k8s日志的配置也可以参考elk官网,里面还有非常多的一些k8s参数可以定义 使用

参考:Autodiscover | Filebeat Reference [8.12] | Elastic

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

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

相关文章

C#、ASP、ASP.NET、.NET、ASP.NET CORE区别、ASP.NET Core其概念和特点、ASP.NET Core个人心得体会

C#是一种面向对象的编程语言,主要用于开发跨平台的应用程序。它是.NET框架的一部分,并且可以在.NET平台上运行。 ASP(Active Server Pages)是一种用于构建动态Web页面的技术,使用VBScript或JScript作为服务器端脚本语…

vue3 计算属性(computed)和监听属性(watch)的异同

计算属性(computed) //使用计算属性 {{fullName}} //使用方法 {{fullName() }}const firstNameref("杰克") const lastNameref("麻子") //计算属性 const fullNamecomputed(()>firstName.value"-"lastName.value) //方法 const fullName()&g…

DockerFile遇到的坑

CMD 命令的坑 dockerfile 中的 CMD 命令在docker run -it 不会执行 CMD 命令。 FROM golang WORKDIR / COPY . ./All-in-one CMD ["/bin/sh","-c","touch /kkk.txt && ls -la"] RUN echo alias ll"ls -la" > ~/.bashrc(不…

C语言数组—二维数组

二维数组的创建 //数组创建 int arr[3][4]; //三行四列,存放整型变量 double arr[2][4];二维数组的初始化 我们如果这样初始化,效果是什么样的呢 int arr[3][4] { 1,2,3,4,5,6,7,8,9,10,11,12 };那如果我们不写满十二个呢 int arr[3][4] { 1,2,3,4…

一文快速掌握docker的理念和基本使用

写在文章开头 写于一个周末,在复盘梳理文章时候发现这一篇关于早期了解docker时记录的文档,仔细阅读了一下,为了保证文章更加清晰以便读者使用。故再次重新一次梳理一次,通过这篇文章,你将会对docker的基本理念和基础…

day27|leetcode|C++| 39. 组合总和 | 40. 组合总和 II |131. 分割回文串

Leetcode 39. 组合总和 链接&#xff1a;39. 组合总和 class Solution { private:vector<vector<int>> result; // 用于存放符合条件的结果集合vector<int> path; // 用于存放当前的路径// 回溯函数&#xff0c;用于搜索符合条件的组合// candidates: 候选…

Stable Diffusion WebUI 生成参数:采样器(Sampling method)和采样步数(Sampling steps)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文将深入探讨Stable Diffusion WebUI生成参数中的采样器和采样步数&#xff0c;旨在为读者呈现一个全面而细致的解析。我们将从采样器和采样步数的概念出发&…

云原生周刊:Istio 加入 Phippy 家族 | 2024.3.18

开源项目推荐 ko "ko" 是一个用于构建和部署 Go 应用程序的简单、快速的容器镜像构建工具。它适用于那些镜像中只包含单个 Go 应用程序且没有或很少依赖于操作系统基础镜像的情况&#xff08;例如没有 cgo&#xff0c;没有操作系统软件包依赖&#xff09;。"k…

内网安全之-NTLM协议详解

NTLM&#xff08;New Technology LAN Manager&#xff09;身份验证协议是微软用于Windows身份验证的主要协议之一。早起SMB协议以明文口令的形式在网络上传输&#xff0c;因此产生了安全性问题。后来出现了LM&#xff08;LAN Manager&#xff09;身份验证协议&#xff0c;它非常…

数据可视化实战(二)

将每个城市在每个月份平均PM2.5绘制成折线图 import pandas as pd import matplotlib.pyplot as plt df pd.read_excel(./PM2.5.xlsx)display(df.head(10)) df.shape # (161630, 15)城市年份月份日期小时季节PM2.5露点湿度压强温度风向累计风速降水量累计降水量0北京2010112…

XML语言的学习记录3-解析

学习笔记&#xff1a; 一、 解析XML文档&#xff1a; 1.使用 XMLHttpRequest 对象&#xff0c;将xml文档放入XML DOM对象中&#xff1a; xmlhttpnew XMLHttpRequest(); xmlhttp.open("GET","books.xml",false); xmlhttp.send(); xmlDocxmlhttp.response…

qt+ffmpeg 实现音视频播放(二)之音频播放

一、音频播放流程 1、打开音频文件 通过 avformat_open_input() 打开媒体文件并分配和初始化 AVFormatContext 结构体。 函数原型如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说…

visual studio 安装 IronPython

从Nuget管理工具安装IronPython。 用Visual Studio Installer安装“Python开发”工作负荷。 在解决方案窗口&#xff0c;右键项目根目录&#xff1a;添加->新建文件夹&#xff08;PythonScripts&#xff09;。 右键PythonScripts&#xff1a;添加->新建项&#xff08;mai…

Docker的简介及安装

Docker 是什么 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。诞生于2013年&#xff0c;最 初的发起者是dotCloud公司&#xff0c;后来改名为Docker Inc&#xff0c;专注于Docker 相关技术和产品的开发。Docker 项目目前已经加入了Linux基金会…

Dubbo是什么?请简要描述其主要功能。Dubbo的架构是怎样的?请解释其核心组件及其作用。

Dubbo是什么&#xff1f;请简要描述其主要功能。 Dubbo是一个高性能、轻量级的Java RPC框架&#xff0c;主要用于构建分布式服务系统。它致力于提供高性能和透明化的远程服务调用方案&#xff0c;以及SOA服务治理方案。Dubbo的主要功能包括&#xff1a; 远程调用&#xff1a;D…

【办公类-22-11】周计划系列(5-3)“周计划-03 周计划内容循环修改“ (2024年调整版本)

背景需求&#xff1a; 前文从原来的“新模版”文件夹里提取了周计划主要内容和教案内容。 【办公类-22-10】周计划系列&#xff08;5-2&#xff09;“周计划-02源文件docx读取5天“ &#xff08;2024年调整版本&#xff09;-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞29次&…

基于消失点的相机自标定

基于消失点的相机自标定 附赠最强自动驾驶学习资料&#xff1a;直达链接 相机是通过透视投影变换来将3D场景转换为2D图像。在射影变换中&#xff0c;平行线相交于一点称之为消失点。本文详细介绍了两种利用消失点特性的标定方法。目的是为根据实际应用和初始条件选择合适的标…

边缘计算+WEB端应用融合:AI行为识别智能监控系统搭建指南 -- 云端系统数据库设计(五)

专栏目录 边缘计算WEB端应用融合&#xff1a;AI行为识别智能监控系统搭建指南 – 整体介绍&#xff08;一&#xff09; 边缘计算WEB端应用融合&#xff1a;AI行为识别智能监控系统搭建指南 – 边缘设备图像识别及部署&#xff08;二&#xff09; 边缘计算WEB端应用融合&#xf…

【开发】Redis 的理解与数据存储格式

目录 相关传送门 1. NOSQL和关系型数据库比较 2. 主流的NOSQL产品 3. Redis的理解 4. redis数据存储格式 4.1 String 4.2 Hash 4.3 List 4.4 Set 4.5. sorted_set 注&#xff1a;手机端浏览本文章可能会出现 “目录”无法有效展示的情况&#xff0c;请谅解&#xf…

Hive:数据仓库利器

1. 简介 Hive是一个基于Hadoop的开源数据仓库工具&#xff0c;可以用来存储、查询和分析大规模数据。Hive使用SQL-like的HiveQL语言来查询数据&#xff0c;并将其结果存储在Hadoop的文件系统中。 2. 基本概念 介绍 Hive 的核心概念&#xff0c;例如表、分区、桶、HQL 等。 …