2518c2d493f03b41020a9afdf2b9ed53
数据采集组件之 logstash

前言

在大数据机器学习风控项目中我们介绍了整个项目的流程,其中的数据采集流程是这样的,通过logstash监控日志文件目录,当有日志记录增加的时候,会触发事件,把日志记录写入到 kafka 中。

logstash--->kafka
</br>今天我们就来介绍这其中设计到的 logstash 组件

logstash 概述

logstash是一款轻量级的日志搜索处理框架,可以方便的把分散的,多样化的日志搜集起来,并进行自定义的处理,然后输出到指定的位置,比如我们项目中使用到的kafka消息队列

logstash 工作原理

  • logstash使用管道方式进行日志的搜集处理和输出,有点类似linux的命令(比如linux命令 ps-ef|grep 'logstash',就是ps -ef执行完了,输出结果传给grep 'logstash')
  • 在通常的logstash任务中,包含三个阶段:输入input-->过滤处理filter-->输出output
  • 流程图如下:
  • 每个阶段都由很多的插件配合工作,比如file输入插件是logstash从文件读入数据,比如kafka输出插件,是输出数据到kafka等 ## logstash下载安装
  • logstash是开箱即用的软件,可以从官网地址 https://www.elastic.co/downloads/logstash 下载对应的系统版本,解压后就可以使用了 ## logstash读取日志数据到kafka的demo 测试之前先要准备一个logstash的配置文件test.conf,我们给出的如下配置文件是从日志文件test.log读取数据到kafka的testTopic主题中</br>
input {
    file {
      path=> [ "/home/logs/test/test.log" ]
      discover_interval => 3
      ignore_older => 86400
      start_position => "beginning"
    }
}
output {
    kafka {
        topic_id => "testTopic"
        codec => plain {
            format => "%{message}"
            charset => "UTF-8"
        }
        bootstrap_servers => "192.168.2.101:9092,192.168.2.102:9092"
    }
    stdout{codec=>rubydebug}
}
  • 前面介绍过logstash基本上由三部分组成,input、output以及用户需要才添加的filter,因此标准的配置文件格式如下:
     input {...} 
     filter {...} 
     output {...}
  • demo中我们不需要filter,所以只使用了input中的file从日志文件中读取数据,使用了output中的kafka插件写入数据到kafka的topic(testTopic)中
  • path:是必须的选项,每一个file配置,都至少有一个path
  • discover_interval:每隔多久去检查一次被监听的path,我们配置的是3秒,如果想要快速监听,那么可以考虑缩短检测的时间
  • ignore_older:在每次检查文件列表时,若文件的最后修改时间超过该值,则忽略该文件。默认为:86400s,即一天。
  • logstash-kafka 插件输入和输出默认codec为json 格式。在输入和输出的时候注意下编码格式。消息传递过程中 logstash 默认会为消息编码内加入相应的时间戳和 hostname 等信息。如果不想要以上信息(一般做消息转发的情况下),可以使用我们demo中的配置
        codec => plain {
            format => "%{message}"
        }

- 执行此logstash的日志采集命令如下:</br>

/logstash-2.4.1/bin/logstash agent -f  /dataSync/test.conf

就是这么简单的一个配置文件加一个执行命令就可以同步日志文件数据到我们的kafka中了,也就完成了我们大数据机器学习风控项目的第一步--日志搜集同步到kafka中</br>

备注(只简单使用的人可以不看):

在logstash的input部分中,也可以指定多个访问方式,例如我想要在input部分指定两个日志来源文件,则可以这样写:

input { 
 file { path =>"/var/log/messages/test.log" type =>"syslog"} 
 file { path =>"/var/log/apache/access.log" type =>"apache"} 
}

input中的file插件的两个需要注意的配置

  • sincedb_path:这个选项配置了默认的读取文件信息记录在哪个文件中,默认是按照文件的inode等信息自动生成。其中记录了inode、主设备号、次设备号以及读取的位置,方便下次读取。因此,如果一个文件仅仅是重命名,那么它的inode以及其他信息就不会改变,因此也不会重新读取文件的信息。类似的,如果复制了一个文件,就相当于创建了一个新的inode,就会读取复制的文件的信息
  • start_position:监听的位置,默认是end,即一个文件如果没有记录它的读取信息(在sincedb_path指定的文件中没有记录),则从文件的末尾开始读取,也就是说,仅仅读取新添加的内容。对于一些更新的日志类型的监听,通常直接使用end就可以了;相反,beginning就会从一个文件的头开始读取。但是如果记录过文件的读取信息,这个配置也就失去作用了,简单说:当监控到一个文件后,会从start_position指定的位置开始读取,同时把读取到文件的哪个位置记录在sincedb_path指定的文件中,下次直接从上次读取的位置进行读取 ### 本文只是简单的介绍了一下logstash,抛砖引玉,欢迎指正 邮箱如下:** 13685858411@139.com 15988101848@139.com

谢谢大家阅读
上一篇:大数据机器学习风控项目
下一篇 :消息系统组件--kafka

© 著作权归作者所有
这个作品真棒,我要支持一下!
机器学习、深度学习、大数据、数据科学爱好者集结地,分享 在各自领域里的工程实践经验和应用 让我们每天进步一点点...
0条评论
top Created with Sketch.