关于java:日志收集神器-Logstash闪亮登场~

作者:废物大师兄\
起源:www.cnblogs.com/cjsblog/p/9445792.html

Logstash介绍


Logstash是一个开源数据收集引擎,具备实时管道性能。

Logstash能够动静地将来自不同数据源的数据对立起来,并将数据标准化到你所抉择的目的地。

集中、转换和存储你的数据


Logstash是一个开源的服务器端数据处理管道,能够同时从多个数据源获取数据,并对其进行转换,而后将其发送到你最喜爱的“存储”。(当然,咱们最喜爱的是Elasticsearch)

输出:采集各种款式、大小和起源的数据

数据往往以各种各样的模式,或扩散或集中地存在于很多零碎中。Logstash 反对各种输出抉择 ,能够在同一时间从泛滥罕用起源捕获事件。可能以间断的流式传输方式,轻松地从您的日志、指标、Web 利用、数据存储以及各种 AWS 服务采集数据。

过滤器:实时解析和转换数据

数据从源传输到存储库的过程中,Logstash 过滤器可能解析各个事件,辨认已命名的字段以构建构造,并将它们转换成通用格局,以便更轻松、更疾速地剖析和实现商业价值。

Logstash 可能动静地转换和解析数据,不受格局或复杂度的影响:

  • 利用 Grok 从非结构化数据中派生出构造
  • 从 IP 地址破译出地理坐标
  • 将 PII 数据匿名化,齐全排除敏感字段
  • 整体解决不受数据源、格局或架构的影响

输入:抉择你的存储,导出你的数据

只管 Elasticsearch 是咱们的首选输入方向,可能为咱们的搜寻和剖析带来有限可能,但它并非惟一抉择。

Logstash 提供泛滥输入抉择,您能够将数据发送到您要指定的中央,并且可能灵便地解锁泛滥上游用例。

装置Logstash


首先,让咱们通过最根本的Logstash管道来测试一下方才装置的Logstash

Logstash管道有两个必须的元素,输出和输入,以及一个可选元素过滤器。输出插件从数据源那里生产数据,过滤器插件依据你的冀望批改数据,输入插件将数据写入目的地。

接下来,容许Logstash最根本的管道,例如:

bin/logstash -e 'input { stdin {} } output { stdout {} }'

(画外音:选项 -e 的意思是容许你从命令行指定配置)

启动当前,上面咱们在命令行下输出”hello world”

用Logstash解析日志


在上一大节中,你曾经创立了一个根本的Logstash管道来测试你的Logstash设置。在事实世界中,一个Logstash治理会略微简单一些:它通常有一个或多个input, filteroutput 插件。

在这一大节中,你将创立一个Logstash管道,并且应用Filebeat将Apache Web日志作为input,解析这些日志,而后将解析的数据写到一个Elasticsearch集群中。你将在配置文件中定义管道,而不是在命令行中定义管道配置。

配置Filebeat来发送日志行到Logstash

在你创立Logstash管道之前,你须要先配置Filebeat来发送日志行到Logstash。Filebeat客户端是一个轻量级的、资源敌对的工具,它从服务器上的文件中收集日志,并将这些日志转发到你的Logstash实例以进行解决。Filebeat设计就是为了可靠性和低提早。Filebeat在主机上占用的资源很少,而且Beats input插件将对Logstash实例的资源需要降到最低。

(画外音:留神,在一个典型的用例中,Filebeat和Logstash实例是离开的,它们别离运行在不同的机器上。在本教程中,Logstash和Filebeat在同一台机器上运行。)

第1步:配置filebeat.yml

filebeat.inputs:
- type: log
  paths:
    - /usr/local/programs/logstash/logstash-tutorial.log

output.logstash:
  hosts: ["localhost:5044"]

第2步:在logstash装置目录下新建一个文件first-pipeline.conf

(画外音:方才说过了通常Logstash治理有三局部(输出、过滤器、输入),这里input上面beats { port => “5044” }的意思是用Beats输出插件,而stdout { codec => rubydebug }的意思是输入到控制台)

第3步:查看配置并启动Logstash

bin/logstash -f first-pipeline.conf --config.test_and_exit

(画外音:–config.test_and_exit选项的意思是解析配置文件并报告任何谬误)

bin/logstash -f first-pipeline.conf --config.reload.automatic

(画外音:–config.reload.automatic选项的意思是启用主动配置加载,以至于每次你批改完配置文件当前无需进行而后重启Logstash)

第4步:启动filebeat

./filebeat -e -c filebeat.yml -d "publish"

如果一切正常,你将会在Logstash管制台下看到相似这样的输入:

用Grok过滤器插件解析日志

当初你有了一个工作管道,能够从Filebeat读取日志行。然而你可能曾经留神到日志音讯的格局并不现实。你想要解析日志音讯,以便从日志中创立特定的、命名的字段。为此,您将应用grok filter插件。

grok 过滤器插件是Logstash中默认可用的几个插件之一。

grok 过滤器插件容许你将非结构化日志数据解析为结构化和可查问的数据。

因为 grok 过滤器插件在传入的日志数据中查找模式

为了解析数据,你能够用 %{COMBINEDAPACHELOG} grok pattern ,这种模式(或者说格局)的schema如下:

接下来,编辑first-pipeline.conf文件,退出grok filter,在你批改完当前这个文件看起来应该是这样的:

在你保留完当前,因为你曾经启动了主动加载配置,所以你不须要重启Logstash来利用你的批改。然而,你的确须要强制Filebeat从头读取日志文件。为了这样做,你须要在终端先按下Ctrl+C停掉Filebeat,而后删除Filebeat注册文件。例如:

rm data/registr

而后重启Filebeat

./filebeat -e -c filebeat.yml -d "publish"

此时,再看Logstash控制台,输入可能是这样的:

用 Geoip 过滤器插件加强你的数据

而后,同样地,重启Filebeat

Ctrl+C

rm data/registry

./filebeat -e -c filebeat.yml -d "publish"

再次查看Logstash控制台,咱们会发现多了地理位置信息:

索引你的数据到Elasticsearch

在之前的配置中,咱们配置了Logstash输入到控制台,当初咱们让它输入到Elasticsearch集群。

编辑first-pipeline.conf文件,替换output区域为:

output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}

在这段配置中,Logstash用http协定连贯到Elasticsearch,而且假如Logstash和Elasticsearch容许在同一台机器上。你也能够指定一个近程的Elasticsearch实例,比方host=>[“es-machine:9092”]

当初,first-pipeline.conf文件是这样的:

同样,保留扭转当前,重启Filebeat

(画外音:首先,Ctrl+C终止Filebeat;接着rm data/registry删除注册文件;最初,./filebeat -e -c filebeat.yml -d “publish” 启动Filebeat)

好了,接下来启动Elasticsearch

(画外音:查看Elasticsearch索引,如果没有看到logstash的索引,那么重启Filebeat和Logstash,重启之后应该就能够看到了)

如果一切正常的话,能够在Elasticsearch的控制台日志中看到这样的输入:

[2018-08-11T17:35:27,871][INFO ][o.e.c.m.MetaDataIndexTemplateService] [Px524Ts] adding template [logstash] for index patterns [logstash-*]
[2018-08-11T17:46:13,311][INFO ][o.e.c.m.MetaDataCreateIndexService] [Px524Ts] [logstash-2018.08.11] creating index, cause [auto(bulk api)], templates [logstash], shards [5]/[1], mappings [_default_]
[2018-08-11T17:46:13,549][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] create_mapping [doc]
[2018-08-11T17:46:13,722][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] update_mapping [doc]

这个时候,咱们再查看Elasticsearch的索引

申请:

curl 'localhost:9200/_cat/indices?v'

响应:

health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   bank                      59jD3B4FR8iifWWjrdMzUg   5   1       1000            0    475.1kb        475.1kb
green  open   .kibana                   DzGTSDo9SHSHcNH6rxYHHA   1   0        153           23    216.8kb        216.8kb
yellow open   filebeat-6.3.2-2018.08.08 otgYPvsgR3Ot-2GDcw_Upg   3   1        255            0     63.7kb         63.7kb
yellow open   customer                  DoM-O7QmRk-6f3Iuls7X6Q   5   1          1            0      4.5kb          4.5kb
yellow open   logstash-2018.08.11       pzcVdNxSSjGzaaM9Ib_G_w   5   1        100            0    251.8kb        251.8kb

能够看到有一个名字叫”logstash-2018.08.11″的索引,其它的索引都是之前建的不必管

接下来,查看这个索引下的文档

申请:

curl -X GET 'localhost:9200/logstash-2018.08.11/_search?pretty&q=response=200'

响应大略是这样的:

(画外音:因为输入太长了,这里截取局部)

{
    "_index" : "logstash-2018.08.11",
    "_type" : "doc",
    "_id" : "D_JhKGUBOuOlYJNtDfwl",
    "_score" : 0.070617564,
    "_source" : {
      "host" : {
        "name" : "localhost.localdomain"
      },
      "httpversion" : "1.1",
      "ident" : "-",
      "message" : "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
      "auth" : "-",
      "timestamp" : "04/Jan/2015:05:13:42 +0000",
      "input" : {
        "type" : "log"
      },
      "geoip" : {
        "postal_code" : "101194",
        "region_name" : "Moscow",
        "timezone" : "Europe/Moscow",
        "continent_code" : "EU",
        "city_name" : "Moscow",
        "country_code3" : "RU",
        "country_name" : "Russia",
        "ip" : "83.149.9.216",
        "country_code2" : "RU",
        "region_code" : "MOW",
        "latitude" : 55.7485,
        "longitude" : 37.6184,
        "location" : {
          "lon" : 37.6184,
          "lat" : 55.7485
        }
      },
      "@timestamp" : "2018-08-11T09:46:10.209Z",
      "offset" : 0,
      "tags" : [
        "beats_input_codec_plain_applied"
      ],
      "beat" : {
        "version" : "6.3.2",
        "hostname" : "localhost.localdomain",
        "name" : "localhost.localdomain"
      },
      "clientip" : "83.149.9.216",
      "@version" : "1",
      "verb" : "GET",
      "request" : "/presentations/logstash-monitorama-2013/images/kibana-search.png",
      "prospector" : {
        "type" : "log"
      },
      "referrer" : "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
      "response" : "200",
      "bytes" : "203023",
      "source" : "/usr/local/programs/logstash/logstash-tutorial.log",
      "agent" : "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\""
    }
  }

再来一个

申请:

curl -XGET 'localhost:9200/logstash-2018.08.11/_search?pretty&q=geoip.city_name=Buffalo'

响应:

{
  "took" : 37,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 2.6855774,
    "hits" : [
      {
        "_index" : "logstash-2018.08.11",
        "_type" : "doc",
        "_id" : "DvJhKGUBOuOlYJNtDPw7",
        "_score" : 2.6855774,
        "_source" : {
          "host" : {
            "name" : "localhost.localdomain"
          },
          "httpversion" : "1.1",
          "ident" : "-",
          "message" : "198.46.149.143 - - [04/Jan/2015:05:29:13 +0000] \"GET /blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29 HTTP/1.1\" 200 10756 \"-\" \"Tiny Tiny RSS/1.11 (http://tt-rss.org/)\"",
          "auth" : "-",
          "timestamp" : "04/Jan/2015:05:29:13 +0000",
          "input" : {
            "type" : "log"
          },
          "geoip" : {
            "postal_code" : "14202",
            "region_name" : "New York",
            "timezone" : "America/New_York",
            "continent_code" : "NA",
            "city_name" : "Buffalo",
            "country_code3" : "US",
            "country_name" : "United States",
            "ip" : "198.46.149.143",
            "dma_code" : 514,
            "country_code2" : "US",
            "region_code" : "NY",
            "latitude" : 42.8864,
            "longitude" : -78.8781,
            "location" : {
              "lon" : -78.8781,
              "lat" : 42.8864
            }
          },
          "@timestamp" : "2018-08-11T09:46:10.254Z",
          "offset" : 22795,
          "tags" : [
            "beats_input_codec_plain_applied"
          ],
          "beat" : {
            "version" : "6.3.2",
            "hostname" : "localhost.localdomain",
            "name" : "localhost.localdomain"
          },
          "clientip" : "198.46.149.143",
          "@version" : "1",
          "verb" : "GET",
          "request" : "/blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29",
          "prospector" : {
            "type" : "log"
          },
          "referrer" : "\"-\"",
          "response" : "200",
          "bytes" : "10756",
          "source" : "/usr/local/programs/logstash/logstash-tutorial.log",
          "agent" : "\"Tiny Tiny RSS/1.11 (http://tt-rss.org/)\""
        }
      },
。。。

命令行启动Logstash


为了从命令行启动Logstash,用上面的命令:

bin/logstash [options]

上面的例子展现了启动Logstash,并制订配置定义在mypipeline.conf文件中:

bin/logstash -f mypipeline.conf

在命令行中设置的任何标记都会笼罩logstash.yml中的相应设置。然而文件自身的内容没有扭转。

Command-Line Flags

–node.name NAME

  指定Logstash实例的名字。如果没有指定的话,默认是以后主机名。

-f, –path.config CONFIG_PATH

  从指定的文件或者目录加载Logstash配置。如果给定的是一个目录,则该目录中的所有文件将以字典程序连贯,而后作为一个配置文件进行解析。

-e, –config.string CONFIG_STRING

用给定的字符串作为配置数据,语法和配置文件中是一样的。

–modules

运行的模块名字

-l, –path.logs PATH

Logstash外部日志输入目录

–log.level LEVEL

日志级别

-t, –config.test_and_exit

查看配置语法是否正确并退出

-r, –config.reload.automatic

监督配置文件的扭转,并且当配置文件被批改当前主动从新加载配置文件。

-config.reload.interval RELOAD_INTERVAL

为了查看配置文件是否扭转,而拉去配置文件的频率。默认3秒。

–http.host HTTP_HOST

Web API绑定的主机。REST端点绑定的地址。默认是”127.0.0.1″

–http.port HTTP_PORT

Web API http端口。REST端点绑定的端口。默认是9600-9700之间。

–log.format FORMAT

指定Logstash写它本身的应用JSON格局还是文本格式。默认是”plain”。

–path.settings SETTINGS_DIR

设置蕴含logstash.yml配置文件的目录,比方log4j日志配置。也能够设置LS_SETTINGS_DIR环境变量。默认的配置目录是在Logstash home目录下。

-h, –help

打印帮忙

好了,对于Logstash介绍临时先写这么多吧! 感激用心的本人!!!

近期热文举荐:

1.Java 15 正式公布, 14 个新个性,刷新你的认知!!

2.终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3.我用 Java 8 写了一段逻辑,共事直呼看不懂,你试试看。。

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理