layout: post
title: Elastic Stack —— Logstash
date: 2018-04-08
tags: [“ELK”,”软件服务”]


一、Logstash简介

logstash是一个ETL工具,可以完成数据的抽取和装载的操作。讲数据抽取之后将数据文档化,并将其输出到指定的目标。

二、Logstash配置

1、Logstash的安装很简单,从官网下载最新的tar包,开箱即用。

2、简单配置Logstash

Logstash主要分三个配置段:input、stdout、filter,分别代表输入、输出、条件过滤,而每个代码块是支持多种插件的。

Logstash的配置格式框架

  1. input {
  2. ...
  3. }
  4.  
  5. filter{
  6. ...
  7. }
  8.  
  9. output {
  10. ...
  11. }

Logstash的简单配置:

  1. vim /etc/logstash.conf
  2. input {
  3. stdin {} \\标准输入
  4. }
  5.  
  6. output {
  7. stdout {
  8. codec => rubydebug \\解码器,格式有"json" "rubydebug"(用作调试)
  9. }
  10. }

启动logstash

  1. ./logstash -f /etc/logstash.conf
  2.  
  3. 输入"aa"
  4.  
  5. {
  6. "@timestamp" => 2018-04-10T12:25:04.575Z,
  7. "message" => "aa",
  8. "@version" => "1",
  9. "host" => "test.middle.01"
  10. }

3、基于”file”的输入配置

  1. input {
  2. file { #使用file插件,参数详见官网
  3. path => ["/var/log/httpd/access_log"]
  4. start_position => "beginning"
  5. }
  6. }
  7.  
  8. filter { #filter用作中间层处理数据
  9. grok { #该插件用作文本做模式匹配以后,添加键
  10. match => {
  11. "message" => "%{COMBINEDAPACHELOG}"
  12. }
  13. remove_field: "message" #用于删除message
  14. }
  15. }
  16. output {
  17. stdout {
  18. codec => rubydebug
  19. }
  20. }

grok切割message的匹配模式格式参见Github

4、时间戳的配置

标准输出”@timestamp”在生产环境中有时我们并不会使用logstash的时间戳作为时间标识,我们需要替换成日志产生时的时间标识,这时我们需要使用生产的时间戳来替换logstash的时间戳

  1. filter {
  2. grok {
  3. match => {
  4. "message" => "%{HTTPD_COMBINEDLOG}"
  5. }
  6. remove_field => "message"
  7. }
  8. date {
  9. match => ["timestamp","dd/MMM/YYYY:H:m:s Z"]
  10. remove_field => "timestamp"
  11. }
  12.  
  13. }

使用date标签的match使用日志的时间替换@timestamp的的时间,移除remove_field,格式匹配见官网

5、Filter的mutate、Geoip插件

  1. filter {
  2. grok {
  3. match => {
  4. "message" => "%{HTTPD_COMBINEDLOG}"
  5. }
  6. }
  7. date {
  8. match => ["timestamp","dd/MMM/YYYY:H:m:s Z"]
  9. }
  10. mutate {
  11. rename => {
  12. "agent" => "user_agent"
  13. }
  14. }
  15. geoip {
  16. source => "clientip"
  17. target => "geoip"
  18. database => "/etc/logstash/maxmind/GeoLite2-City.mmdb"
  19. }
  20. }

使用mutate的”rename”修改字段的名称
geoip的功能:

source 从分词中去除一个字段
target 指定geoip
database 指定geoip数据库

geoip库:ES支持geoip2,地址

注意:
1、输出的日志文件名必须以”logstash-“开头,方可将geoip.location的type自动设定为”geo_point”;
2、target => “geoip”

6、Redis插件(input)

  1. input {
  2. redis {
  3. batch_count => 1
  4. data_type => "list"
  5. key => "logstash-list-%{+YYY.MM.dd}"
  6. host => ["192.168.0.2"]
  7. port => 6379
  8. threads => 5
  9. }
  10. }

注意键值的类型,参见官网

7、elasticsearch组件(output)

  1. output {
  2. elasticsearch {
  3. hosts => ["http://node1:9200/","http://node2:9200/","http://node3:9200/"]
  4. user => "ec18487808b6908009d3"
  5. password => "efcec6a1e0"
  6. index => "logstash-%{+YYYY.MM.dd}"
  7. document_type => "apache_logs"
  8. }
  9. }

8、beats的输入

  1. input {
  2. beats {
  3. port => 5044
  4. }
  5. }

三、Beats的配置

1、filebeat(下载地址

配置文件:filebeat.yml

开启tags,用于logstash辨识日志类型

开启document_type,用于logstash向elasticsearch输出时辨识索引类别

type配置log(log、stdin)

output可以使用三种:

1)elasticsearch
2)logstash
3)redis
4)其他输出类型参见filebeat.reference.yml文件

2、logstash在使用beats插件,在filter进行切割时通过以下配置来区分日志类型

if "nginx-accesslog" in [tags]

if "sys-messages" in [tags]

语法:

  1. filter {
  2.  
  3. if [type] == 'tomcat-accesslog' {
  4. grok {}
  5. }
  6.  
  7. if [type] == 'httpd-accesslog' {
  8. grok {}
  9. }
  10.  
  11. }
  12.  
  13. if EXPRESSION {
  14. ...
  15. } else if EXPRESSION {
  16. ...
  17. } else {
  18. ...
  19. }

3、output配置

使用``index => ``"logstash-%{type}-%{+YYYY.MM.dd}"来区分不同的索引

文档更新时间: 2018-12-20 15:29   作者:张尚