Logstash--数据处理引擎

简介:Logstash是一款轻量级的日志搜集处理框架,它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,并按照开发者制定的规范传输到指定的位置。

官网介绍,图文并茂

下载、安装

小贴士:Logstash 依赖 JDK1.8 ,因此在安装之前请确保机器已经安装和配置好 JDK1.8。

这款工具是开箱即用的软件,下载地址戳这里,下载自己对应的系统版本即可。
下载后直接解压,就可以了。

基本概念

Logstash 通过管道进行运作,管道有两个必需的元素,输入和输出,还有可选的元素,过滤器、编解码器。架构图如下:
logstash架构图

  • 原始数据在input被转换为Event,在output event被转换为目标格式数据。
  • 在配置文件中可以对Event中的属性进行增删改查。

小贴士:Batcher负责批量的从queue中取数据

下面通过导图,对logstash的组成结构进行全局了解。
logstash组成结构
在这里插入图片描述

  • pipeline:一条数据处理流程的逻辑抽象,类似于一条管道,数据从一端流入,经过处理后,从另一端流出;一个pipeline包括输入、过滤、输出3个部分,其中输入和输出部分是必选组件,过滤是可选组件;
  • instance:一个logstash实例,可以包含多条数据处理流程,即多个pipeline;
    inputs:数据输入组件,用于对接各种数据源,接入数据,支持解码器,允许对数据进行编码解码操作;必选组件;
  • filters和codecs:负责解析数据,对输入数据进行加工处理过滤、分析、丰富、统一格式等操作。
  • outputs:数据输出组件,用于对接下游组件,发送处理后的数据,支持解码器,允许对数据进行编码解码操作;必选组件;
  • event:pipeline中的数据都是基于事件的,一个event可以看作是数据流中的一条数据或者一条消息;

简单使用示例

通过命令行,进入到logstash/bin目录,执行下面的命令:

bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'

然后你会发现终端在等待你的输入。没问题,敲入 Hello World,回车:

{
       "message" => "Hello World",
      "@version" => "1",
    "@timestamp" => "2017-08-07T10:30:59.937Z",
          "host" => "raochenlindeMacBook-Air.local",
}

解释:数据在线程之间以"事件"的形式流传。不叫行,因为 logstash 可以处理多行事件。
Logstash 会给事件添加一些额外信息。最重要的就是 @timestamp,用来标记事件的发生时间。因为这个字段涉及到 Logstash 的内部流转。

你可以随意给事件添加字段或者从事件里删除字段。

  • host 标记事件发生在哪里。
  • type 标记事件的唯一类型。
  • tags 标记事件的某方面属性。这是一个数组,一个事件可以有多个标签。

小贴士:每个 logstash 过滤插件,都会有四个方法叫 add_tag, remove_tag, add_field 和 remove_field。它们在插件过滤匹配成功时生效。

常用命令行参数

logstash 后可以加:
  -f:指定配置文件或目录,根据配置文件配置logstash。
  -e:字符串,配置,默认“”stdin输入、stdout输出(在控制台输入、输出),可通过命令行接受设置。
  -l:输出地址,默认控制台输出。
  -t:测试 Logstash 读取到的配置文件语法是否能正常解析。

配置文件

在生产环境中,Logstash 的管道要复杂很多,可能需要配置多个输入、过滤器和输出插件。
因此,需要一个配置文件管理输入、过滤器和输出相关的配置。配置文件内容格式如下:

# 输入
input {
  ...
}

# 过滤器
filter {
  ...
}

# 输出
output {
  ...
}

这篇博客,之前应该看过,也挺不错的 ,可以借鉴下
结合着大佬的博客,总结了一个配置文件出来

input {
    # 从文件读取日志信息
    file {
        path => "/var/log/httpd/access_log"   # 要导入的文件的位置,可以使用*,例如/var/log/nginx/*.log
        Excude =>”*.gz”                       # 要排除的文件
        start_position => "beginning"         # 从文件开始的位置开始读,默认是end
        ignore_older => 0                # 多久之内没修改过的文件不读取,0为无限制,单位为秒
        sincedb_path => "/dev/null"      # 记录文件上次读取位置;输出到null表示每次都从文件首行开始解析
        add_field=>{"test"="test"}       # 增加一个字段
        type => "apache-log"             # type字段,可表明导入的日志类型

        # 使用 multiline 插件,传说中的多行合并
        codec => multiline {
            # 通过正则表达式匹配,具体配置根据自身实际情况而定
            pattern => "^\d"
            negate => true
            what => "previous"
        }
    }
    file {  
        type => "tms_inbound.log"  
        path => "/JavaWeb/tms2.wltest.com/logs/tms_inbound.es.*.log"  
        codec => json {  
             charset => "UTF-8"  
        }  
    }  
    
#可配置多种处理规则,他是有顺序,所以通用的配置写下面
filter {
    #首先要说明的是,所有文本数据都是在Logstash的message字段中的,我们要在过滤器里操作的数据就是message。
    #只说一个match属性,他的作用是从message 字段中把时间给抠出来,并且赋值给另个一个字段logdate。
    #第二点需要明白的是grok插件是一个十分耗费资源的插件。
    #第三点需要明白的是,grok有超级多的预装正则表达式,这里是没办法完全搞定的,也许你可以从这个大神的文章中找到你需要的表达式
    #http://blog.csdn.net/liukuan73/article/details/52318243
    #但是,我还是不建议使用它,因为他完全可以用别的插件代替,当然,对于时间这个属性来说,grok是非常便利的。
    grok {
       match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
     }
    date {  
      match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]  
    }  
}

output {
   # 输出到 elasticsearch
   elasticsearch{  
       hosts=>["10.0.0.11:9200"]        # elasticsearch 地址 端口
       action=>"index"                    # 索引
       index=>"indextemplate-logstash"    # 索引名称
       #document_type=>"%{@type}"  
       document_id=>"ignore"  
      
       template=>"/opt/logstash-conf/es-template.json"    # 模板文件的路径 
       template_name=>"es-template.json"                  # 在es内部模板的名字
       template_overwrite=>true                           # 
       protocol => "http"         #目前支持三种协议    node、http 和tranaport  
   }
}

读取多个配置文件

bin/logstash -f /path_to_config_directory  即-f后面加上配置文件目录

语法配置

Logstash 设计了自己的 dsl, 包括有区域,注释,数据类型(布尔值,字符串,数值,数组,哈希),条件判断,字段引用等。

字段引用(field reference)

如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字写在中括号 [] 里就行了,这就叫字段引用。

小贴士:logstash 的数组也支持倒序下标,即 [geoip][location][-1] 可以获取数组最后一个元素的值。

Logstash 还支持变量内插,在字符串里使用字段引用的方法是这样:

"the longitude is %{[geoip][location][0]}"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值