Logstash介绍

目录

1 工作原理

1.1 输入

1.2 过滤器

1.3 输出

2 安装Logstash

3 Logstash实例

3.1 过滤器实例

3.2 日志输入实例

4 Logstash小结

5 Flume与Logstash对比


Logstash是一个开源数据收集引擎,具有实时管道功能。Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地进行存储。尽管Logstash的早期目标是搜集日志,现在它的功能已完全不只于此。任何事件类型都可以加入分析,通过输入、过滤器和输出插件进行转换。与此同时,还提供了很多原生编解码工具简化消息处理。Logstash通过海量数据处理和多种多样的数据格式支持延伸了我们对数据的洞察力。

ELK Logstash的典型使用场景,Elasticsearch作为后台数据的存储,kibana用来前端的报表展示,Logstash在其过程中担任搬运工的角色。下面我们将详细讲述Logstash相关原理和功能。

1 工作原理

Logstash使用管道方式进行日志的搜集处理和输出。Logstash管道有两个必需的元素,输入和输出,以及一个可选元素过滤器。输入插件从数据源那里消费数据,过滤器插件根据你的期望修改数据,输出插件将数据写入目的地。在logstash中,包括了三个阶段:输入input --> 处理filter(不是必须的) --> 输出output,如图3-1所示:

图3-1 Logstash工作原理

1.1 输入

数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择 ,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据,如图3-2所示:

图3-2数据输入

目前,logstash主要支持的数据输入方式为:标准输入、文件输入、TCP输入、syslog输入、http_poller抓取、kafka消息队列输入等。

1.2 过滤器

数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。Logstash 能够动态地转换和解析数据,不受格式或复杂度的影响,例如,利用利用 Grok 从非结构化数据中派生出结构、从 IP 地址破译出地理坐标,如图3-3所示:

图3-3过滤器

目前,logstash过滤器支持的功能有:date时间处理、GROK正则捕获、dissect解析、GeoIP地址查询、Json编解码、metrics数据修改、splite拆分事件、交叉日志合并等。

1.3 输出

尽管 Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例,如图3-4所示:

图3-4 输出

目前,logstash主要支持的输出方式:输出到Elasticsearch、发送email、调用系统命令执行、保存成文件、报警发送到Nagios、标准输出stdout、TCP发送数据、输出到HDFS。

2 安装Logstash

logstash依赖jdk7及以上版本,在官网下载tar.gz包,并解压,具体如图3-5所示:

图3-5 logstash安装

我们可通过最基本的Logstash管道来测试一下刚才安装的Logstash,执行命令“bin/logstash -e 'input { stdin {} } output { stdout {} }”。

服务启动以后,我们在命令行输入“hello world”,即可观察到控制台输出的结果,如图3-6所示:

图3-5 测试logstash

3 Logstash实例

3.1 过滤器实例

filters是一个行处理机制,其将提供的数据格式化成你需要的数据,我们以grok filter的过滤器为例,看看下面的一个例子:

input { stdin { } }

filter {

  grok {

    match => { "message" => "%{COMBINEDAPACHELOG}" }

  }

  date {

    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]

  }

}

output {

  elasticsearch { host => localhost }

  stdout { codec => rubydebug }

}

执行Logstash按照如下参数:bin/logstash -f logstash-filter.conf

现在粘贴下面一行信息到你的终端,Logstash就会处理这个标准的输入内容:

127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891"http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0)Gecko/20100101 Firefox/25.0"

控制台将返回如下信息:

{

        "message" => "127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] \"GET /xampp/status.php HTTP/1.1\" 200 3891 \"http://cadenza/xampp/navi.php\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"",

     "@timestamp" => "2013-12-11T08:01:45.000Z",

       "@version" => "1",

           "host" => "cadenza",

       "clientip" => "127.0.0.1",

          "ident" => "-",

           "auth" => "-",

      "timestamp" => "11/Dec/2013:00:01:45 -0800",

           "verb" => "GET",

        "request" => "/xampp/status.php",

    "httpversion" => "1.1",

       "response" => "200",

          "bytes" => "3891",

       "referrer" => "\"http://cadenza/xampp/navi.php\"",

          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\""

}

该实例中,Logstash使用了grok过滤器,能够将一行的日志数据(Apache的"combined log"格式)分割设置为不同的数据字段。这一点对于日后解析和查询我们自己的日志数据非常有用,比如:HTTP的返回状态码,IP地址相关等等,非常的容易。另外一个过滤器是date filter,这个过滤器来负责解析出来日志中的时间戳并将值赋给timestame字段(不管这个数据是什么时候收集到logstash的)。你也许注意到在这个例子中@timestamp字段是设置成December 11, 2013, 说明logstash在日志产生之后一段时间进行处理的。

3.2 日志输入实例

日志输入是非常实用的输入方式,本例讲解如何进行日志输入。我们将从本地读取日志文件,并且通过条件设置处理满足我们需要的event。首先,我们创建一个文件名是logstash-apache.conf的配置文件,内容如下(你可以根据实际情况修改你的文件名和路径):

input {

  file {

    path => "/tmp/access_log"

    start_position => beginning

  }

}

filter {

  if [path] =~ "access" {

    mutate { replace => { "type" => "apache_access" } }

    grok {

      match => { "message" => "%{COMBINEDAPACHELOG}" }

    }

  }

  date {

    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]

  }

}

output {

  elasticsearch {

    host => localhost

  }

  stdout { codec => rubydebug }

}

我们按照上面的配置创建一个文件(在例子中是"/tmp/access.log"),可以将下面日志信息作为文件内容:

71.141.244.242 - kurt [18/May/2011:01:48:10 -0700] "GET /admin HTTP/1.1" 301 566 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"

134.39.72.245 - - [18/May/2011:12:40:18 -0700] "GET /favicon.ico HTTP/1.1" 200 1189 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E)"

 

98.83.179.51 - - [18/May/2011:19:35:08 -0700] "GET /css/main.css HTTP/1.1" 200 1837 "http://www.safesand.com/information.htm" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"

现在使用-f参数来执行一下上面的例子:bin/logstash -f logstash-apache.conf

通过查询ES数据,可以看到apache的日志数据已经导入到ES中了。这里logstash会按照配置读取、处理指定的文件,任何后添加到文件的内容也会被捕获处理最后保存到ES中。此外,数据中type的字段值会被替换成"apache_access"(这个功能在配置中已经指定)

本例只是让Logstash监控了apache access_log,但是在实际中往往并不够用可能还需要监控error_log,只要在上面的配置中改变一行既可以实现,如下:

input {

  file {

    path => "/tmp/*_log"

...

4 Logstash小结

Logstash的配置就非常简洁清晰,三个部分的属性都定义好了,程序员自己去选择就行,就算没有,也可以自行开发插件,非常方便。目前大部分的情况下,Logstash使用更加广泛,Logstash可以和ELK其他组件配合使用,开发、应用都会简单很多,技术成熟,使用场景广泛。

5 Flume与Logstash对比

虽然Flume与Logstash都是常用的日志、数据采集组件,但它们之间还是有些区别的:两者最初的设计目的就不太一样。Flume本身最初设计的目的是为了把数据传入HDFS中(并不是为了采集日志而设计,这和Logstash有根本的区别),所以理所应当侧重于数据的传输,程序员要非常清楚整个数据的路由,并且比Logstash还多了一个可靠性策略,上文中的channel就是用于持久化目的,数据除非确认传输到下一位置了,否则不会删除,这一步是通过事务来控制的,这样的设计使得可靠性非常好。相反,Logstash则明显侧重对数据的预处理,因为日志的字段需要大量的预处理,为解析做铺垫。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值