您现在的位置是:首页 > 正文

SpringBoot集成logstash

2024-02-01 01:30:05阅读 2

前言

原网址:https://www.jianshu.com/p/b6977babcc7e

大家应该都听说过ELK,一般ELK都是用来做分布式系统的集中日志管理,ELK的优点这里就不介绍了,好处太多,今天主要介绍下其中的Logstash。数据传给logstash,它将数据进行过滤和格式化(转成JSON格式),然后传给数据存储或者消息队列Broker,用于后续加工处理。

最近要做app埋点监控,app将埋点日志发送到埋点日志网关,在埋点日志网关通过部署logstash,将日志发送到logstash,再由logstash发送到kafka,最后由kafka入mongodb,由大数据系统定时跑批,将埋点统计结果加工出来提供给前端查询。这里就记录下对于springboot的项目如何和logstash集成,完成日志数据通过logstash对外输出。

logstash官网 https://www.elastic.co/products/logstash

logstash安装&配置

logstash的安装流程这里就不介绍了,大家可以看下官网的guide

下面主要来说下logstash的配置,logstash一般常用的有两种模式,一种是应用服务器写本地日志,在logstash中配置读取本地日志文件,对指定的日志文件进行数据抽取,这种模式一般适用于一般的应用或者系统日志采集到中央日志系统;还有一种模式是将应用系统需要大数据系统分析的数据直接将信息流直接发送给logstash进行JSON格式化,不需要在应用系统本地先落地文件,这种模式一般适用于大数据系统从应用系统采集数据,看起来有点像kafka这类消息队列的功能,从消息流传递角度看,确实比较类似,但是logstash最大的特点还在于可以对收到的数据进行各种形式的流式加工,加工成上游大数据系统需要的数据,这样可以方便大数据系统进行二次加工,有点类似流水线的意思。

下面我们看下logstash的config文件,从config文件中可以看出logstash的主要处理流程,配置主要分为3部分:input、filter、output。这三部份的配置,从名字也很好理解含义:

input就是输入,从这个例子中可以看出配置的tcp网络信息流的模式,这样应用系统本地数据就不落地了,可以减少系统本地的磁盘空间占用,也减少了系统的磁盘IO压力;当然input除了tcp模式还有file模式,也很简单,配置的内容当然就是文件的路径信息,编码模式之类的都是一样的。

filter就是过滤,对于从input输入的数据,在filter层可以通过配置ruby脚本很轻易的将输入数据加工成输出需要的数据格式,增加字段、删减字段之类都是很简单的应用。

output当然就是输出,从官网的介绍就很容易了解到logstash不管是输入还是输出都支持很多种格式,有点类似linux里的pipline的意思,不管输入是什么都可以输出到下一个管道,例子中的output是输出到kafka集群,当然也可以输出的ES,或者数据库。

## logtash.conf
input {
  tcp {
    host => "10.xxx.xx.xx"
    port => 9250
    mode => "server"
    tags => ["tags"]
    codec => plain{charset=>"UTF-8"}
    }
}
filter {
    ruby{
     code => "event['readunixtime']= event.timestamp.time.getlocal.to_f.to_s"
     add_field =>{
        "app_name"=>"xxx_sdk_apm"
        "app_stage"=>"dev"
        "readtimestamp"=>"%{@timestamp}"
        }
     }
}
# output { stdout { codec => rubydebug } }
output {
    kafka{
# 大数据kafka集群地址
    bootstrap_servers=> "10.132.XX.XX:9092,10.132.XX.XX:9092,10.132.XX.XX:9092,10.132.37.XX:9092"
# 分配给应用的topic
    topic_id=> "xx_xx_apm"
# 异步传输,不保证消息一定传输,速度最快
    acks=>"0"
# 单位是字节,16k
    batch_size=>16384
    codec=>json
  }
}

logback配置

上面介绍了logstash的配置,下面就到了本文的重头戏,那就是在springboot中集成logstash,当然logstash为我们提供了常见的日志框架的encoder,可以方便我们将各种日志框架的日志输出到logstash中作为input。下面介绍下我这次做的本地不落日志,直接将logback的日志输出的logstash中,

发送logstash input本地不留存日志。

首先引入pom依赖

<dependency>
   <groupId>net.logstash.logback</groupId>
   <artifactId>logstash-logback-encoder</artifactId>
   <version>5.1</version>
</dependency>

在logback的xml配置文件中只需要配置下appender就可以了,例子中使用的是LogstashTcpSocketAppender,当然还提供其他的appender,具体用法可以查看https://github.com/logstash/logstash-logback-encoder,如图:

Screenshot 2018-07-24 15.40.35

 

logback中的配置也很简单,只需要配置logstash的ip地址和端口和encoder的编码类就可以了。

<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>10.132.xx.xx:9250</destination>
    <queueSize>1048576</queueSize>
    <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
   
<logger name="APMInfoDev" level="INFO" additivity="false">
   <appender-ref ref="LOGSTASH"/>
</logger> 

因为是单独定义了logger不是root logger,所以在使用的时候需要通过LoggerFactory指定logger name去获取logger:

Logger apmInfoLogger = LoggerFactory.getLogger("APMInfoDev");

apmInfoLogger.info("XXXXXX");

好了下面就可以去logstash输出的存储或者队列中查看输出的日志信息了



作者:monkey01
链接:https://www.jianshu.com/p/b6977babcc7e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

网站文章

  • List-迭代器与反向迭代器

    List-迭代器与反向迭代器

    list的简单使用以及模拟实现(模板参数,反向迭代器)

    2024-02-01 01:29:59
  • initgraph函数(讲解) 热门推荐

    函数名: initgraph()   功 能: 初始化图形系统   函数原型: void far initgraph(int far *graphdriver, int far *graphmode,   char far *pathtodriver);graphdriver是上涨指向图形驱动序号变量的指针;graphmode是在graphdriver选定后,指向图形显示模式序号变

    2024-02-01 01:29:30
  • C语言案例-输出 Fibonacci 数列(斐波那契数列)的前 40 项

    【代码】C语言案例-输出 Fibonacci 数列(斐波那契数列)的前 40 项。

    2024-02-01 01:29:21
  • iOS 8 人机交互指南极客翻译版(一)

    iOS 8 人机交互指南极客翻译版(一)

    为设计而生iOS 设计包含了以下几个关键点遵从:UI 能够帮助用户理解内容并与之互动,但却不会分散用户对内容的注意力清晰:每种大小的文字都必须是易读的,界面中的图标醒目且无多余的修饰,在功能上有突出的重点,很好地突显了设计理念。深度:视觉层次和生动的交互操作赋予了 UI 生命力,不仅能够帮助用户更好的理解 UI,还能让用户在使用过程中感到惊喜无论你正在重新...

    2024-02-01 01:29:15
  • 苹果手机怎么编辑word文档_办公软件入门到精通:文档WORD文本编辑

    苹果手机怎么编辑word文档_办公软件入门到精通:文档WORD文本编辑

    大家好:我是小愿望,很高兴你能看到这篇文章,也感谢能在这个平台能跟大家分享,在以后的日子里会陆续发文一些办公软件的操作知识,希望大家喜欢。上一篇跟大家分享了WORD文档的文本输入内容,本期我们继续往下...

    2024-02-01 01:28:46
  • 【华为OD机试真题 Python语言】179、探索地块建立 | 机试真题+思路参考+代码解析

    给一块 n * m 的地块,相当于n * m的二维数组,每个元素的值表示这个小地块的发电量; &gt; 求在这块地上建立正方形的边长为c的发电站,发电量满足目标电量k的地块数量

    2024-02-01 01:28:38
  • docker高级(mysql主从复制)

    docker高级(mysql主从复制)

    在主库创建表,查看从库数据情况!

    2024-02-01 01:28:31
  • STM32生成bin文件

    STM32生成bin文件

    方案一:第一步:打开Options for Target ‘target 1’对话框,选择User标签页;第二步:找到fromelf.exe的路径(keil5在ARMCC里)第三步:重点(基路径是工程...

    2024-02-01 01:28:25
  • php 连接数据库方法

    MYSQL  <?php    header("Content-Type:text/html;charset=utf-8");    $link = mysql_connect('localhost:3306','root','123456');    if($link){      echo '数据库连接正确';    }else{      echo '数据库...

    2024-02-01 01:27:58
  • 7天拿到阿里Java岗位offer,面试总结

    7天拿到阿里Java岗位offer,面试总结

    什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。 普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个的顺...

    2024-02-01 01:27:51