elk收集k8s微服务日志

news2024/11/15 17:57:00

一、前言

     使用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-config
  namespace: elk

data:
  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-service
                     
             config:            #配置收集的pod日志路径,这里配置日志路径时要使用变量的方式定义日志路径,至于为什么使用这些变量,可以自行去看一下该日志目录下的路径名称
                - type: container    #配置为container模式
                  symlinks: true      #使用了软链接的话需要加上该配置
                  paths:
                   - /var/log/containers/${data.kubernetes.pod.name}_${data.kubernetes.namespace}_${data.kubernetes.container.name}-*.log
                  multiline.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: nodejs
             config:
                - type: container
                  symlinks: true
                  paths:
                   - /var/log/containers/${data.kubernetes.pod.name}_${data.kubernetes.namespace}_${data.kubernetes.container.name}-*.log
                  processors:         #配置filebeat识别收集的日志格式为json,这里前端的日志已经配置为了json格式,所以在filebeat收集的时候需要将日志识别为json格式的日志,不配置的话收集出来的是一整串日志,和普通日志一样
                    - decode_json_fields:
                        fields: ["message"]
                        target: ""
                        overwrite_keys: true
                        add_error_key: true

    output.logstash:          #将收集的日志输出到logstash
      hosts: ['logstash.elk:5044']

   logstash配置

vi logstash-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: logstash-configmap
  namespace: elk
  labels:
    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-config
  namespace: 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.coloradmin.cn/o/1527449.html

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

相关文章

Transformer的前世今生 day01(预训练、统计语言模型)

预训练 在相似任务中,由于神经网络模型的浅层是通用的,如下图: 所以当我们的数据集不够大,不能产生性能良好的模型时,可以尝试让模型B在用模型A的浅层基础上,深层的部分自己生成参数,减小数据集…

京津冀自动驾驶产业盛会“2024北京国际自动驾驶技术展览会”

随着科技的飞速发展,自动驾驶技术成为了汽车产业变革的热点和前沿。智能化、网联化已经成为推动汽车产业创新发展的重要力量,而自动驾驶技术则是其中的关键一环。它不仅能够提高道路安全性、缓解交通拥堵,还能为乘客带来更加舒适、便捷的出行…

注册个人小程序

访问地址 https://mp.weixin.qq.com/ 立即注册 选择小程序 注册 填写信息 登录邮箱 访问邮箱的链接激活账号 选择个人,填写信息 注册完成,即可登录进入填写信息

苍穹外卖-day15:套餐管理

套餐管理 课程内容 套餐分页查询启售停售套餐删除套餐新增套餐 1. 套餐分页查询 1.1 需求分析和接口设计 根据产品原型来了解需求,套餐分页查询的产品原型如下: 业务规则: 根据页码展示套餐信息(套餐名称、套餐图片、套餐分类、价格、售…

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

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

数据分析-Pandas的Andrews曲线可视化解读

数据分析-Pandas的Andrews曲线可视化解读 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据…

C#,图论与图算法,无向图(Graph)回环(Cycle)的不相交集(disjoint)或并集查找(union find)判别算法与源代码

1 回环(Cycle)的不相交集(disjoint)或并集 不相交集数据结构是一种数据结构,它跟踪划分为多个不相交(非重叠)子集的一组元素。联合查找算法是对此类数据结构执行两个有用操作的算法: 查找:确定特定元素所在的子集。这可用于确定两个元素是否在同一子集中。 并集:将…

Django中使用celery实现异步任务、延时任务、周期定时任务

配置celery 1. 安装以下环境 pip install celery pip install redis pip install eventlet # celery 4.0版本以后不支持在windows运行,还需额外安装eventlet库本文环境为:python3.9.4Django4.2.11celery5.3.6redis5.0.3 2. 配置setting.py文件 在sett…

汽车制造产生的污废水如何处理排放

汽车制造业是一个重要的工业领域,然而,伴随着汽车制造过程中的各种化学反应和材料加工,大量污废水也随之产生。为了保护环境和社会的可持续发展,汽车制造产生的污废水需要得到妥善处理和排放。 首先,针对汽车制造中涉及…

前端vue实现甘特图

1 什么是甘特图 甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利L甘特先生的名字命名,是项目管理、生产排程、节点管理中非常常见的一个功能。 甘特图内在思想简单,即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的…

01.Linked-List-Basic

1. 链表简介 1.1 链表定义 链表(Linked List):一种线性表数据结构。它使用一组任意的存储单元(可以是连续的,也可以是不连续的),来存储一组具有相同类型的数据。 简单来说,「链表」…

web渗透测试漏洞复现:Elasticsearch未授权漏洞复现

web渗透测试漏洞复现 Elasticsearch未授权漏洞复现Elasticsearch简介Elasticsearch复现Elasticsearch漏洞修复和加固措施 Elasticsearch未授权漏洞复现 Elasticsearch简介 Elasticsearch 是一款 Java 编写的企业级搜索服务,它以分布式多用户能力和全文搜索引擎为特…

功能齐全的免费 IDE Visual Studio 2022 社区版

面向学生、开放源代码和单个开发人员的功能齐全的免费 IDE 下载地址 Visual Studio 2022 社区版 - 下载最新的免费版本 Visual Studio 2022 Community Edition – Download Latest Free Version 准备安装 选择需要安装的程序 安装进行中 使用C学习程序设计相关知识并培养编程…

AI基础知识(3)--神经网络,支持向量机,贝叶斯分类器

1.什么是误差逆传播算法(error BackPropagation,简称BP)? 是一种神经网络学习算法。BP是一个迭代学习算法,在迭代的每一轮使用广义的感知机学习规则对参数进行更新估计。基于梯度下降(gradient descent&am…

安卓RecyclerView简单用法

废话不多说上代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schem…

LeetCode---388周赛

题目列表 3074. 重新分装苹果 3075. 幸福值最大化的选择方案 3076. 数组中的最短非公共子字符串 3077. K 个不相交子数组的最大能量值 一、重新分装苹果 注意题目中说同一个包裹中的苹果可以分装&#xff0c;那么我们只要关心苹果的总量即可&#xff0c;在根据贪心&#x…

华为汽车业务迎关键节点,长安深蓝加入HI模式,车BU预计今年扭亏

‍编辑 |HiEV 一年之前&#xff0c;同样是在电动汽车百人会的论坛上&#xff0c;余承东在外界对于华为和AITO的质疑声中&#xff0c;第一次公开阐释了华为选择走智选车模式的逻辑。 一年之后&#xff0c;伴随问界M7改款、问界M9上市&#xff0c;华为智选车模式的面貌已经发生了…

让图片适应标签的CSS object-fit属性

在实际的项目运行过程中&#xff0c;可能出现运营人员上传的文件与预期的图片尺寸不同的情况&#xff0c;为了解决这一问题可以使用 object-fit 属性&#xff0c;对嵌入的图像&#xff08;以及其他替代元素&#xff0c;如视频&#xff09;做相应的变化&#xff0c;更加精确地控…

数据结构 二叉树 力扣例题AC——代码以及思路记录

LCR 175. 计算二叉树的深 某公司架构以二叉树形式记录&#xff0c;请返回该公司的层级数。 AC int calculateDepth(struct TreeNode* root) {if (root NULL){return 0;}else{return 1 fmax(calculateDepth(root->left), calculateDepth(root->right));} } 代码思路 …

WPF连接MySqldemo

界面总要管理数据嘛,于是便学习了一下WPF与MySql的基本连接. 运行结果: 环境配置 需要下载安装Mysql,网上教程很多,不详说,创建的工程需要下载或者引入相关的包(MySql.Data) 连接的部分直接看具体的代码即可 xaml代码(只放置了一个按钮和文本框) <Grid><Button x:Name…