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

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

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

k8s pod日志写入ELK的具体实现_第1张图片

上一篇的地址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 需要的时间老长了

k8s pod日志写入ELK的具体实现_第2张图片

配置完了启动即可。

本地的ELK集群

搭建spring boot服务

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

配置日志文件

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

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



<configuration>
    
    <property name="log.path" value="./logs/logback-demo"/>
    <property name="destination" value="127.0.0.1:50000"/>
    <property name="appname" value="logdemo"/>

    
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        encoder>
    appender>


    
    <appender name="allLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <file>${log.path}/all.logfile>
        
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        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>64MBmaxFileSize>
            
            <maxHistory>15maxHistory>
        rollingPolicy>
    appender>


    
    <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <file>${log.path}/error.logfile>
        
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <charset>UTF-8charset>
        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>64MBmaxFileSize>
            
            <maxHistory>15maxHistory>
        rollingPolicy>

        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>errorlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>


    
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"
        immediateFlush="false" neverBlock="true">
        
        <discardingThreshold>0discardingThreshold>
        
        <queueSize>1024queueSize>
        <neverBlock>trueneverBlock>
        
        <appender-ref ref="allLog"/>
    appender>


    
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        
        <destination>${destination}destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            
            <customFields>{"appname":"logdemo"}customFields>
        encoder>
    appender>


    
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ASYNC"/>
        <appender-ref ref="errorLog"/>
        <appender-ref ref="logstash"/>
    root>

    
    <logger name="com.gitee.shigen.logbackspringboot.mapper" level="debug"/>

    
    <logger name="org.springframework.jdbc" level="debug"/>

configuration>

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

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

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

k8s pod日志写入ELK的具体实现_第3张图片

后记

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

<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
    
    <customFields>{"appname":"logdemo"}customFields>
encoder>

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

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


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

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

shigen一起,每天不一样!

你可能感兴趣的:(kubernetes,elk,容器)