Logstash学习资料

是什么

日志的分析,清洗

使用

bin目录是脚本目录

config目录是配置文件目录

Logstash是怎么工作的

一个开源的、服务端的数据处理pipeline(管道)。它开源接收多个源的数据,然后进行转换,最终将它们发送到指定的目的地。

Logstash实现的功能主要分为接收数据、解析过滤并转换数据、输出数据三个部分。对应的插件依次是,input、filter、output……,其中fileter是可选的,其他两个是必须的。

  • input插件
  • Output插件

安装使用

logstash 读取日志文件到kafka logstash input kafka_json

  • 启动
nohup ./logstash -f logstash.conf & # 此处的conf文件里面定义了输入输出格式插件
  • logstash插件实例
input{
      file {       # 输入file插件
      path => "/var/log/secure"
   }

    }

output{
       kafka {     # 输出kafka插件
              bootstrap_servers => "192.168.1.20:9092,192.168.1.30:9092,192.168.1.40:9092"
              topic_id => "osmessage"
            }
    }
  • Logstash事假文件的编写并从Kafka消费数据
input{
	kafka {
	bootstrap_servers => "192.168.1.20:9092,192.168.1.30:9092,192.168.1.40:9092"
	topics => ["osmessage"]
	codec => "json"
	}
}

output{
	elasticsearch {
		hosts => ["192.168.1.60:9200"]
		index => "osmessagelog-%{+YYYY-MM-dd}"
	}
}

Logstash语法应用

基本语法组成

  • Input
  • Output
  • Filter

    Input

    标准输入(stdin)
input{
	stdin{
			add_field => {"key" => "iivey"} #表示增加一行自定义输出
			tages => ["add1"]
	}
}
oupt{
	stdout{
			codec => rubydebug
	}
}
  • Logstash编码插件
    编码插件(Codec)可以在Logstash输入或者输出时处理不不同类型的数据
    Codec插件支持常见的格式有plain、json、json_lines……
  • plain
    是一个空的解析器,它可以让用户自己指定格式,也就是说输入什么格式,输出就是什么格式。
input{
	stdin{}
}
output{
	codec => "plain"
}
  • json、json_lines
input{
	stdin{}
}
output{
	codec => "json"
}
Filter

logstash 读取日志文件到kafka logstash input kafka_ruby_02

/usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns,在这个Logshtash的安装目录下可以查询Logstash自带的匹配模式
在线调试平台:grokdebug.herokuapp.com

  • 匹配模式
  • logstash 读取日志文件到kafka logstash input kafka_数据_03


  • logstash 读取日志文件到kafka logstash input kafka_json_04

  • 删除字段
input{
	stdin{}
}

filter{
	grok{
	match => ["message","%{IP:clientip}\ \[%{HTTPDDATE:timestamp}\]"]
	remove_field => ["message"] #表示删除某个字段
	}
date { #时间插件
	match => ["timestamp","dd/MMM/YYYY:HH:mm:ss Z"] #表示自己定义的时间赋给系统
	}
mutate {
	remove_field => ["timestamp"] # 上面时间被修改后,这里可以删除时间字段
	}
}

output{
	stdout{
	codec => rubydebug
	}
}
  • 时间处理(Date)
  • logstash 读取日志文件到kafka logstash input kafka_json_05

    logstash 读取日志文件到kafka logstash input kafka_json_06

  • 数据修改(Mutate)
  • logstash 读取日志文件到kafka logstash input kafka_ruby_07


  • logstash 读取日志文件到kafka logstash input kafka_ruby_08

  • GeoIP地址归类查询
  • logstash 读取日志文件到kafka logstash input kafka_json_09

  • 一个稍微有点难度的匹配
    GREEDYDATA :grok中科院匹配任何字符
input{
	stdin{}
}
filter{
	grok{
	match => {"message" => "%{TIMESTAMP_ISO8601:localtime\|\~\|%{IPORHOST:clientip}\|\~\|(%{GREEDYDATA:http_user_agent})\|\~\|(%DATA:http_referer)\|\~\|%{GREEDYDATA:mediaid}{GREEDYDATA:http_user_agent})\|\~\|(%DATA:http_referer)\|\~\|%{GREEDYDATA:mediaid}\|\~\|%{GREEDYDATA:osid}"}
	}
}

data {
	match => ["localtime","yyyy-MM-dd'T'HH:mm:ssZZ"]
	target => "@timestamp" #target表示赋值给@timestamp
}
mutate {
	remove_field => ["localtime"]
}
output{
	stdout{
		codec => "rubydebug"
	}
}
Output

logstash 读取日志文件到kafka logstash input kafka_ruby_10

  • 输出到Elasticsearch集群
output{
 	elasticsearch{
 		host => ["192.168.1.60:9200"]
 		index => "logstash-%{+YYYY.MM.dd}" #索引名称,可以使用变量格式,索引名称必须是小写字母,不能是大写
 		manage_template => false #是否开启自动管理模板的功能
 		template_name => "template_web_access_log" # 自定义模板的名称
 	}
 }

Logstash收集方法

logstash 读取日志文件到kafka logstash input kafka_ruby_11