上一节我们讲完了Elasticsearch得全部,下面我接着介绍我们得二兄弟(Logstash),废话不多说,我们开始!
Logstash安装过程:
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
安装步骤1 |
执行命令 tar –zxvf logstash2.4.0.tar.gz 解压 |
安装步骤2 |
创建配置文件夹 执行命令mkdir /usr/local/logstash/etc |
安装步骤3 |
3) 创建配置文件 vim logstash_test.conf 切记logstash的配置文件尾都尾.conf |
接下来我们启动logstash:
执行命令:bin/logstash -e 'input { stdin { } } output { stdout {codec=>rubydebug} }'
返回信息如下
这样我们的logstash就装完了,接下来讲几条命令
Ⅰ.执行指定配置文件命令:bin/logstash –f etc/logstash_test.conf
Ⅱ.测试配置文件是否正确:bin/logstash –t etc/logstash_test.conf
当然还有很多命令就不一 一讲了,
Logstash工作原理:
Logstash使用管道方式进行日子搜集处理和处理,有点像我们*nix系统的管道命令 aa|bb|cc,先执行aa然后bb再cc。
在logstash中,包括三个阶段
输入input --> 处理filter(不一定有) --> 输出output
这种插件式的组织方式,让logstash变得易于扩展和定制,接下来我们说说logstash的配置文件里的参数吧。(以下有一部分摘抄于网络)
这里我们分为input配置项filter配置项output配置项
Input配置项
Collectd collectd 是一个守护(daemon)进程,用来收集系统性能和提供各种存储方式来存储不同值的机制。
Eg: input {
collectd {
port => 36788 #与发送端对应的端口号
type => collectd
}
}
File File就是文件的意思,读取我们的log文件等等。
Eg:input {
file {
path => ["/usr/local/var/*.log", "/usr/local/var/message"]
type => "system"
start_position => "beginning"
}
}
Stdin 应该是 logstash 里最简单和基础的插件了,控制台输入。
Eg:input {
stdin {
add_field => {"key" => "value"}
codec => "plain"
tags => ["delete"]
type => "std"
}
}
Syslog syslog 可能是运维领域最流行的数据传输协议了。
Eg:input {
syslog {
port => "143"
}
}
tcp Tcp 这个就不解释了,直接上例子
input {
tcp {
port => 8803
mode => "server"
ssl_enable => false
}
}
filter配置项
data Eg: filter {
grok {
match => ["message", "%{HTTPDATE:logdate}"]
}
date {
match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
支持五种格式:ISO8601\UNIX\UNIX_MS\TAI64N
Grok Eg: filter {
grok {
match => {
"message" => "\s+(?<request_time>\d+(?:\.\d+)?)\s+"
}
}
}
Grok 是 Logstash 最重要的插件。你可以在 grok 里预定义好命名正则表达式,在稍后(grok参数或者其他正则表达式里)引用它。
Geoip Eg:filter {
geoip {
source => "message"
}
}
GeoIP 是最常见的免费 IP 地址归类查询库
Json Eg: filter {
json {
source => "message"
target => "jsoncontent"
}
}
JSON 解码插件
Kv eg: kv {
prefix => "url_"
source => "url_args"
field_split => "&"
remove_field => [ "url_args", "uri", "request" ]
}
filters/kv 插件,帮助处理不同样式的 key-value 日志
Metrics Eg: filter {
metrics {
meter => "error_%{status}"
add_tag => "metric"
ignore_older_than => 10
}
if "metric" in [tags] {
ruby {
code => "event.cancel if (event.get('[error_504][rate_1m]') * 60 > 100)"
}
}
}
filters/metrics插件是使用 Ruby 的Metriks 模块来实现在内存里实时的计数和采样分析
Mutate Eg:filter {
mutate {
convert => ["request_time", "float"]
}
}
filters/mutate 插件是 Logstash 另一个重要插件。它提供了丰富的基础类型数据处理能力。包括类型转换,字符串处理和字段处理等。
Ruby Eg:filter {
ruby {
init => "@kname = ['client','servername','url','status','time','size','upstream','upstreamstatus','upstreamtime','referer','xff','useragent']"
code => "
new_event = LogStash::Event.new(Hash[@kname.zip(event.get('message').split('|'))])
new_event.remove('@timestamp')
event.append(new_event)"
}
}
如果你稍微懂那么一点点 Ruby 语法的话,filters/ruby 插件将会是一个非常有用的工具。
Split Eg: filter {
split {
field => "message"
terminator => "#"
}
}
我们通过 multiline 插件将多行数据合并进一个事件里,那么反过来,也可以把一行数据,拆分成多个事件。这就是 split 插件
output配置项
elasticsearch Logstash 可以使用不同的协议实现完成将数据写入 Elasticsearch 的工作。
Eg: output {
elasticsearch {
hosts => ["192.168.0.2:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
document_type => "%{type}"
workers => 1
flush_size => 20000
idle_flush_time => 10
template_overwrite => true
}
}
Email 见名知意发送邮件
Eg:output {
email {
to => "admin@website.com,root@website.com"
cc => "other@website.com"
via => "smtp"
subject => "Warning: %{title}"
options => {
smtpIporHost => "localhost",
port => 25,
domain => 'localhost.localdomain',
userName => nil,
password => nil,
authenticationType => nil, # (plain, login and cram_md5)
starttls => true
}
htmlbody => ""
body => ""
attachments => ["/path/to/filename"]
}
}
Exe outputs/exec 插件的运用也非常简单,如下所示,将 logstash 切割成的内容作为参数传递给命令。
Eg: output {
exec {
command => "sendsms.pl \"%{message}\" -t %{user}"
}
}
File 保存成文件
Eg:output {
file {
path => "/path/to/%{+yyyy}/%{+MM}/%{+dd}/%{host}.log.gz"
message_format => "%{message}"
gzip => true
}
}
Nagios
outputs/nagios 插件发送数据给本机的 nagios.cmd 管道命令文件,outputs/nagios_nsca 插件则是 调用 send_nsca 命令以 NSCA 协议格式把数据发送给 nagios 服务器(远端或者本地皆可)。
filter {
if [message] =~ /err/ {
mutate {
add_tag => "nagios"
rename => ["host", "nagios_host"]
replace => ["nagios_service", "logstash_check_%{type}"]
}
}
}
output {
if "nagios" in [tags] {
nagios { }
}
}
Statsd Statsd 最早是 2008 年 Flickr 公司用 Perl 写的针对 Graphite、datadog 等监控数据后端存储开发的前端网络应用,2011 年 Etsy 公司用 node.js 重构。
Eg: output {
statsd {
host => "statsdserver.domain.com"
namespace => "logstash"
sender => "%{host}"
increment => ["httpd.response.%{status}"]
}
}
stdout 和之前 inputs/stdin 插件一样,outputs/stdout 插件也是最基础和简单的输出插件
Eg: output {
stdout {
codec => rubydebug
workers => 2
}
}
tcp 发送网络数据
Eg: output {
tcp {
host => "192.168.0.2"
port => 8888
codec => json_lines
}
}
到这里我们的logstash就算完结了.