k8s pod日志写入ELK的具体实现

news2024/12/24 20:51:04

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。

在上一部分,shigen讲到了k8spod的日志写入ELK的三种技术方案,并在最后展示了一下我实现的效果,那具体的怎么实现呢?今天这一篇文章我们具体的展示一下,先带大家回顾一下上篇文章的效果:

方案三效果

上一篇的地址shigen会在文章末尾贴出,今天的文章主要是讲解它的集体实现。

ELK的搭建

当我们搭建好了ELK集群之后,需要着重的修改一下logstash的配置文件logstash/pipeline/logstash.conf :

  input {
    tcp {
        mode => "server"
        host => "0.0.0.0"    
        port => 50000
        codec => json_lines
    }
  }
  output {
    elasticsearch {
      hosts => "elasticsearch:9200"       #es地址
      index => "springboot-logstash-%{+YYYY.MM.dd}"           #写入的索引名
      user => "elastic"                   #es用户
      password => "123456"                #es密码
    }
    #logstash控制台输入采集到的数据,用于调试
    stdout {
        codec => rubydebug
    }
  }

这是shigen本次用到的配置文件,需要注意的是:

  • 约定TCP服务的端口是50000,需要在docker-compose中挂载到主机上
  • es的地址尽量使用内网或者k8s提供的svc,节省不必要的流量消耗
  • 需要安装插件 log stash-codec-json_lines 需要的时间老长了

安装插件 logstash-codec-json_lines

配置完了启动即可。

本地的ELK集群

搭建spring boot服务

搭建spring boot服务

基本的项目结构就不说了,用到了mybatis-plus作为ORM框架。我们现在需要的就是把项目的日志输出到logstash,让它处理完放到elasticsearch

配置日志文件

本次的日志框架shigen选取的是logback,它需要把日志写入到logstach,它的途径就是logstash提供的TCP端口。

在项目的resource目录下边新建文件logback-spring.xml文件,文件内容是这样的:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <!--指定property属性变量-->
    <property name="log.path" value="./logs/logback-demo"/>
    <property name="destination" value="127.0.0.1:50000"/>
    <property name="appname" value="logdemo"/>

    <!-- 日志输出格式
     %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
     -->
    <!-- 控制台 appender-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!-- 文件 滚动日志 (all)-->
    <appender name="allLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 当前日志输出路径、文件名 -->
        <file>${log.path}/all.log</file>
        <!--日志输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!--历史日志归档策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 历史日志: 归档文件名 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM, aux}/all.%d{yyyy-MM-dd}.%i.log.gz
            </fileNamePattern>
            <!--单个文件的最大大小-->
            <maxFileSize>64MB</maxFileSize>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
    </appender>


    <!-- 文件 滚动日志 (仅error)-->
    <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 当前日志输出路径、文件名 -->
        <file>${log.path}/error.log</file>
        <!--日志输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!--历史日志归档策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 历史日志: 归档文件名 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM, aux}/error.%d{yyyy-MM-dd}.%i.log.gz
            </fileNamePattern>
            <!--单个文件的最大大小-->
            <maxFileSize>64MB</maxFileSize>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>

        <!-- 此日志文档只记录error级别的  level过滤器-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!-- 文件 异步日志(async) -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"
        immediateFlush="false" neverBlock="true">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="allLog"/>
    </appender>


    <!--输出到logstash的appender-->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>${destination}</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <!--自定义字段,区分应用名称-->
            <customFields>{"appname":"logdemo"}</customFields>
        </encoder>
    </appender>


    <!-- root 级别的配置 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ASYNC"/>
        <appender-ref ref="errorLog"/>
        <appender-ref ref="logstash"/>
    </root>

    <!--可输出mapper层sql语句等-->
    <logger name="com.gitee.shigen.logbackspringboot.mapper" level="debug"/>

    <!--输出jdbc 事务相关信息-->
    <logger name="org.springframework.jdbc" level="debug"/>

</configuration>

注意到我们的其实是有四个目的地的,包括:控制台、文件、logstash以及我们的滚动策略和文件大小超过一定的指标之后的策略。

现在我们只需要启动服务,在kibana那边持续的观察:

和我们常见的都一样,输出了mybatis-plus查询的sql语句。我们再来看下kibana的界面,刚才我们的日志也展示出来了。而且字段很全,自动的帮我们处理了。

kibana日志展示

后记

也许我们还会存在这样的疑问:这是一个实例的,如果是多实例的,或者一个服务有多个副本怎么办呢?这个shigen考虑到了,我么可以自定义字段,在我的配置文件中有这个字段:

<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
    <!--自定义字段,区分应用名称-->
    <customFields>{"appname":"logdemo"}</customFields>
</encoder>

就可以标识出来,在es中也可以一个查询条件,查找相对应地服务日志。

现在还是本地启动,shigen也会持续输出在k8s上的服务日志,欢迎持续关注。


以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注支持一下哈,您的鼓励和支持将是shigen坚持日更的动力。同时,shigen在多个平台都有文章的同步,也可以同步的浏览和订阅:

平台账号链接
CSDNshigen01shigen的CSDN主页
知乎gen-2019shigen的知乎主页
掘金shigen01shigen的掘金主页
腾讯云开发者社区shigenshigen的腾讯云开发者社区主页
微信公众平台shigen公众号名:shigen

shigen一起,每天不一样!

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

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

相关文章

【vtkWidgetRepresentation】第九期 vtkAffineRepresentation2D仿射变换

很高兴在雪易的CSDN遇见你 【vtkWidgetRepresentation】第九期 vtk中的仿射变换 前言 本文分享VTK中的仿射变换&#xff0c;实际结果如下图所示&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进…

数电实验-----74LS192芯片实现任意进制计数器的功能(Quartus II )

目录 一、74LS192芯片介绍 管脚图 ​编辑逻辑图与功能表 工作原理 二、任意进制计数器的实现 1.复位清零法 2.外部反馈置数法 一、74LS192芯片介绍 74LS192是一种二进制同步上升计数器芯片&#xff0c;可以用于数字计数和时序控制等应用。它是TTL逻辑家族中的一员&#x…

文心一言 VS 讯飞星火 VS chatgpt (154)-- 算法导论12.3 1题

一、用go语言&#xff0c;给出 TREE-INSERT 过程的一个递归版本。 文心一言&#xff0c;代码不能运行&#xff1a; 下面是用 Go 语言实现一个递归版本的 TREE-INSERT 过程的代码&#xff1a; package main import "fmt" type TreeNode struct { Val int Lef…

tiktok/抖音x-bogus参数分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

web服务器之——www服务器的基本配置

目录 一、www简介 1、什么是www 2、www所用的协议 3、WEB服务器 4、主要数据 5、浏览器 二、 网址及HTTP简介 1、HTTP协议请求的工作流程 三、www服务器的类型(静态网站&#xff08;HTML&#xff09;&#xff0c; 动态网站(jsp python,php,perl)) 1、 仅提供…

windows10安装MongoDB的入门简易教程【学习自用】

一、下载安装包 下载地址 https://www.mongodb.com/try/download/community 因为我是在windows上安装&#xff0c;所以下载windows版本的压缩包格式 二、下载后解压到要安装的目录里去 我这里在D盘装&#xff0c;所以就解压到D盘中我自己建的的mongoDB文件夹中。 三、在解…

初识人工智能,一文读懂贝叶斯优化的知识文集(6)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

构建智能外卖跑腿小程序:技术实践与代码示例

在快节奏的现代生活中&#xff0c;外卖跑腿服务已成为人们日常生活中不可或缺的一部分。为了提供更智能、高效的外卖跑腿体验&#xff0c;本文将深入探讨构建一款智能外卖跑腿小程序所需的关键技术&#xff0c;并提供相应的代码示例。 1. 地理位置服务的整合 外卖跑腿小程序…

宇视科技视频监控 main-cgi 文件信息泄露漏洞复现

0x01 产品简介 宇视(Uniview)高清网络摄像机是一种高性能的网络摄像机,它可以通过网络进行视频传输和监控。该摄像机采用先进的视频技术,具有高清晰度、低照度、宽动态等特点,能够提供高质量的视频图像。 0x02 漏洞概述 宇视(Uniview)高清网络摄像机存在信息泄露漏洞…

Android CoordinatorLayout

一、CoordinatorLayout CoordinatorLayout(协调者布局) 用于协调管理其子视图之间的交互行为。它旨在处理复杂的用户界面行为&#xff0c;允许子视图之间响应用户输入、动画和滚动等交互操作。 CoordinatorLayout 通过 Coordinator &#xff08;协调者&#xff09;来管理子视图…

APD--传感器

#1 Current temperature coeffiency Hamamastu Si APD S8664, with same bias, **low temperature**, **higher gain**, it means that **higher current output**. #2, PD

Word插件-好用的插件-批量插入图片-大珩助手

现有100张图片&#xff0c;需要批量插入word中&#xff0c;并在word中以每页6张图片的形式呈现&#xff0c;请问怎样做&#xff1f; 使用word大珩助手&#xff0c;多媒体-插入图片&#xff0c;根据图片的长宽&#xff0c;选择连续图片、一行2个图或一行3个图&#xff0c;可一次…

Web安全-SQL注入常用函数(二)

★★实战前置声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、MySQL数据库构成 初始化安装MySQL数据库后(…

web服务器之——搭建基于http协议的静态网站

目录 准备工作&#xff1a;web服务器搭建 第一步&#xff1a;挂载 第二步&#xff1a;编辑配置文件 第三步&#xff1a;安装软件包 第四步&#xff1a;启动httpd 查看配置文件&#xff1a; 第五步&#xff1a;设置防火墙状态&#xff1a; 重启服务: 查看状态&#xff…

大致人类应该是短时记忆和利用短时记忆控制利用周围环境达到长期记忆的吧

这里写目录标题 图代码代码解析图 代码 import timedef route_llm(route_text):passdef write_to_dask(one_sum, one_text, one_path

【Mathtype】MathType符号面板没了或者变成可拖动如何解决

1. MathType符号面板没了 如下图MathType符号面板没了&#xff0c;应该咋办&#xff1f; 向下面一样&#xff0c;在视图中选择工具栏即可 2. Mathtype符号面板可拖动如何还原 如下图所示&#xff0c;Mathtype变成了如下可以拖动的 直接选中工具栏的左上角&#xff0c;拖到…

51单片机应用从零开始(十一)·数组函数、指针函数

51单片机应用从零开始&#xff08;九&#xff09;数组-CSDN博客 51单片机应用从零开始&#xff08;十&#xff09;指针-CSDN博客 目录 1. 用数组作函数参数控制流水花样 2. 用指针作函数参数控制 P0 口 8 位 LED 流水点亮 1. 用数组作函数参数控制流水花样 要在51单片机中…

探索 HTML 语义化:让你的网页更有意义(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

YOLOv8改进 | 主干篇 | SwinTransformer替换Backbone(附代码 + 详细修改步骤 +原理介绍)

一、本文介绍 本文给大家带来的改进机制是利用Swin Transformer替换YOLOv8中的骨干网络其是一个开创性的视觉变换器模型&#xff0c;它通过使用位移窗口来构建分层的特征图&#xff0c;有效地适应了计算机视觉任务。与传统的变换器模型不同&#xff0c;Swin Transformer的自注…

react中img引入本地图片的方式

在html文件中&#xff0c;可以直接<img src./roadBook.png /> 但是在jsx文件中&#xff0c;不支持这种写法 必须这样写 在css样式中 App.css .img{background: url(./img/roadBook.png) }App.js import ./App.css;<div classNameimg></div> 1.基于es6Mod…