日志收集神器 Logstash,闪亮登场~

优采云 发布时间: 2022-09-17 22:58

  日志收集神器 Logstash,闪亮登场~

  配置Filebeat来发送日志行到Logstash

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

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

  第1步:配置filebeat.yml

  filebeat.inputs:<br />- type: log<br />  paths:<br />    - /usr/local/programs/logstash/logstash-tutorial.log<br /><br />output.logstash:<br />  hosts: ["localhost:5044"]<br />

  第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<br />

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

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

  (画外音:--config.reload.automatic选项的意思是启用自动配置加载,以至于每次你修改完配置文件以后无需停止然后重启Logstash)

  第4步:启动filebeat

  ./filebeat -e -c filebeat.yml -d "publish"<br />

  如果一切正常,你将会在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<br />

  然后重启Filebeat

  

  ./filebeat -e -c filebeat.yml -d "publish"<br />

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

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

  然后,同样地,重启Filebeat

  Ctrl+C<br /><br />rm data/registry<br /><br />./filebeat -e -c filebeat.yml -d "publish"<br />

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

  索引你的数据到Elasticsearch

  在之前的配置中,我们配置了Logstash输出到控制台,现在我们让它输出到Elasticsearch集群。另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java 系列面试题和答案。

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

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

  在这段配置中,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-*]<br />[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_]<br />[2018-08-11T17:46:13,549][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] create_mapping [doc]<br />[2018-08-11T17:46:13,722][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] update_mapping [doc]<br />

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

  请求:

  curl 'localhost:9200/_cat/indices?v'<br />

  响应:

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

  可以看到有一个名字叫"logstash-2018.08.11"的索引,其它的索引都是之前建的不用管

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

  请求:

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

  

  响应大概是这样的:

  (画外音:由于输出太长了,这里截取部分)

  再来一个

  请求:

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

  响应:

  {<br />  "took" : 37,<br />  "timed_out" : false,<br />  "_shards" : {<br />    "total" : 5,<br />    "successful" : 5,<br />    "skipped" : 0,<br />    "failed" : 0<br />  },<br />  "hits" : {<br />    "total" : 2,<br />    "max_score" : 2.6855774,<br />    "hits" : [<br />      {<br />        "_index" : "logstash-2018.08.11",<br />        "_type" : "doc",<br />        "_id" : "DvJhKGUBOuOlYJNtDPw7",<br />        "_score" : 2.6855774,<br />        "_source" : {<br />          "host" : {<br />            "name" : "localhost.localdomain"<br />          },<br />          "httpversion" : "1.1",<br />          "ident" : "-",<br />          "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/)\"",<br />          "auth" : "-",<br />          "timestamp" : "04/Jan/2015:05:29:13 +0000",<br />          "input" : {<br />            "type" : "log"<br />          },<br />          "geoip" : {<br />            "postal_code" : "14202",<br />            "region_name" : "New York",<br />            "timezone" : "America/New_York",<br />            "continent_code" : "NA",<br />            "city_name" : "Buffalo",<br />            "country_code3" : "US",<br />            "country_name" : "United States",<br />            "ip" : "198.46.149.143",<br />            "dma_code" : 514,<br />            "country_code2" : "US",<br />            "region_code" : "NY",<br />            "latitude" : 42.8864,<br />            "longitude" : -78.8781,<br />            "location" : {<br />              "lon" : -78.8781,<br />              "lat" : 42.8864<br />            }<br />          },<br />          "@timestamp" : "2018-08-11T09:46:10.254Z",<br />          "offset" : 22795,<br />          "tags" : [<br />            "beats_input_codec_plain_applied"<br />          ],<br />          "beat" : {<br />            "version" : "6.3.2",<br />            "hostname" : "localhost.localdomain",<br />            "name" : "localhost.localdomain"<br />          },<br />          "clientip" : "198.46.149.143",<br />          "@version" : "1",<br />          "verb" : "GET",<br />          "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",<br />          "prospector" : {<br />            "type" : "log"<br />          },<br />          "referrer" : "\"-\"",<br />          "response" : "200",<br />          "bytes" : "10756",<br />          "source" : "/usr/local/programs/logstash/logstash-tutorial.log",<br />          "agent" : "\"Tiny Tiny RSS/1.11 (http://tt-rss.org/)\""<br />        }<br />      },<br />。。。<br />

  命令行启动Logstash

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

  bin/logstash [options]<br />

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

  bin/logstash -f mypipeline.conf<br />

  在命令行中设置的任何标志都会覆盖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秒。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线