elk安装及使用四(logstash的安装及使用)

logstash的安装及使用

一、logstash的安装

1、logstash的概述

Logstash是一款开源的的数据收集、处理、传输工具,logstash可以处理日志、事件及非结构化的数据,并可以将他们输出,或输出到elasitcsearch

2、logstash的的安装

Logstash是由java语言所研发。所以,在安装logstash前需要安装javajdk(选择安装openjdk1.8版本安装)

安装openjdk:

]# yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
]# java -version
openjdk version "1.8.0_144"
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)

  下载安装logstash:

]# wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.2.rpm
]# rpm -ivh logstash-5.5.2.rpm 
warning: logstash-5.5.1.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing...             ################################# [100%]
Updating / installing...
   1:logstash-1:5.5.1-1    ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Successfully created system startup script for Logstash

3、配置启动logstash

  为了使用logstash,需要创建logstash的配置文件,配置文件中指定了使用的插件和每个插件的设置。Logstash的配置文件主要由三部分组成,input指定收集的数据来源,output指定数据输出到哪里去,filter对数据进行过滤和替换。创建完成logstash的配置文件就可以启动logstash

  使用root用户启动logstash时,有时会报错,所以,一般使用logstash用户启动logstash,如果使用rpm包安装logstashlogstash用户会在安装时自动创建,我们只需修改logstash用户登陆的shell即可切换到logstash用户登录logstash

修改logstash用户的登录shell:

]# usermod logstash -s /bin/bash

  创建一个简单的logstash的配置文件(通过接受标准的输入,再通过ruby的格式通过标准的格式输出):

]# cat /etc/logstash/conf.d/logstash-simple.conf 
input {
        stdin{
                type    => "stdandardinput"
        }
}
output {
        stdout { codec => rubydebug }
}

检查配置文件语法是否错误:

$ /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -t -f /etc/logstash/conf.d/logstash-simple.conf 
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
Configuration OK

  配置文件语法正常,现在可以正常启动logstash,正常启动后,会提示输入,输入字符串,由于在配置文件中,输出为以ruby的格式输出,所以会将输入的字符串以ruby的格式输出。

$ /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/logstash-simple.conf    
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
The stdin plugin is now waiting for input:
hello world
{
    "@timestamp" => 2017-09-26T02:53:46.919Z,
      "@version" => "1",
          "host" => "elk1",
       "message" => "hello world",
          "type" => "stdandardinput"
}

二、使用logstash收集及处理日志

  Logstash可以将系统及服务的日志实时的收集后,经过处理发送给elasticsearch,也可以接受filebeatredis的的日志经过处理后再发送给elasticsearchLogstash的原理如图1所示


图1  logstash的原理

1logstash处理日志流程

1logstash接受日志

  Logstash接受日志是通过input插件来完成的,可以实时的接受系统指定的日志文件产生的日志,也可以接受filebeat发送过来的日志,亦可去redis指定的队列中读取日志。将日志接受进来后将交由filter插件过滤或直接由output插件输出。如,实时接受本地系统日志则可以写为:

input {
	file {
		path => ["/var/log/messages"]
		type => "system"
		start_position => "beginning"
		}
}

  读取redis数据库日志则可以写为:

input {
	redis {
		host => “redis ipadd”		
		port=> 6379
		key=> “KEY”
		rassword=> “redis password”
		}
}

  接受filebeat的日志则写法为:

input {
  beats {
		Host => “filebeat ipaddr”
    	port => 5044
  }}

2)对日志进行过滤

  将本地的日志直接发送给elasticsearch是没有意义的,这样不易于在kibana中通过聚合图来展示分析日志。在将日志发送给elasticsearch前,很有必要做一下过滤,将过滤完的日志再发送给elasticsearch,这样有利于使用kibana对日志数据进行分析。Logstash过滤日志是通过filtergrok插件来实现的。

  使用grok时,只需调用定义好的正则表达式规则即可进行数据的过滤,调用的方式为“%[定义好的规则:key]”,grok默人定义了许多匹配规则,存放路径为:/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.1/patterns/目录下的grok-patterns文件中,如果匹配规则不够使用,则可以自行在配置文件中定义。

  如果过滤nginx的默认配置文件,则过滤filter的写法规则如下:

     Centos7Nginx的默认日志输出格式为:

10.0.0.12 - - [29/Sep/2017:19:44:42 -0400] "GET / HTTP/1.1" 200 3700 "-" "curl/7.29.0" "-"

  日志格式为:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

  Nginx默认日志filter的过滤规则可写为:

 filter {
		grok {
			match => {
			"message" => "%{IPORHOST:clientip} \[%{HTTPDATE:time}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:http_status_code} %{NUMBER:bytes} \"(?<http_referer>\S+)\" \"(?<http_user_agent>\S+)\" \"(?<http_x_forwarded_for>\S+)\""
			}
		}   
	}

  过滤后输出的日志格式为:

request:/ offset:10,829 auth:- http_status_code:200 ident:- input_type:log verb:GET source:/var/log/nginx/access.log message:10.0.0.13 - - [30/Sep/2017:01:54:07 -0400] "GET / HTTP/1.1" 200 3700 "-" "curl/7.29.0" "-" type:log tags:beats_input_codec_plain_applied http_user_agent:curl/7.29.0 datetime:30/Sep/2017:01:54:07 -0400 @timestamp:September 30th 2017, 13:54:07.702 bytes:3700 http_referer:- clientip:10.0.0.13 @version:1

(3)使用output插件将日志输出

  Logstash是一款接受处理日志的系统,无存储日志的功能,经过inputfilter接受处理完日志,需要将日志发送出去,发送日志由output插件来完成。Logstash可以将日志发送给elasticsearch,也可将日志发送给redis或将日志输出,也可同时将日志发送到多个地方。如将日志发送给elasticsearch写法为:

Output {
 elasticsearch {
           hosts => ["10.0.0.11:9200"]
           index => "logstash-nginxlog-%{+YYYY.MM.dd}"
}}

2、使用logstash处理日志配置案例

1)使用logstash接收处理filebeat发送的日志。

  Logstash是一款功能强大的日志收集处理系统,但运行起来对系统的资源消耗大,所以一般不直接使用logstash去收集系统服务日志,先由filebeat收集系统日志,收集后再发送给logstash处理,logstash可单独部署在一台服务器上用于接受处理filebeat发送过来的日志。Filebeat需要配置为将日志发送给logstashfilebeat的配置为(其他不发送的需注释掉):

]# sed -n 91,94p /etc/filebeat/filebeat.yml  
#-------------------Logstash output----------------------
output.logstash:
  # The Logstash hosts
  hosts: ["10.0.0.13:5044"]

  Logstash接受filebeat发送来的日志处理完成后再发送给elasticsearchlogstash的配置为:

#] cat /etc/logstash/conf.d/test.conf
input {
        beats {
                host => '0.0.0.0'
                port => 5044
        }
}
filter {
        grok {
                match => {
                        "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:dat
etime}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:http_status_code
} %{NUMBER:bytes} \"(?<http_referer>\S+)\" \"(?<http_user_agent>\S+)\" \"(?<http_x_forwarded_for>\S+)\
""
                }
        }
}
output {
        elasticsearch {
                hosts => ["10.0.0.11:9200"]
                index => "logstash-nginxlog-%{+YYYY.MM.dd}"
        }
}

  配置完成后则可以测试配置语法并启动logstash来收集日志

$ /usr/share/logstash/bin/logstash -t -f /etc/logstash/conf.d/test.conf
$ /usr/share/logstash/bin/logstash  -f /etc/logstash/conf.d/test.conf

  接下来就可以在kibana中创建索引来查询elasticsearch中接受到的日志信息了,因为我们在output中定义了index,所以查询名称可以写为“logstash-nginxlog-*”,如下图2所示:


图二 kibana中创建索引

  索引创建完,可模拟访问nginx,让产生日志,kibana中查到到的日志如图三所示:


图三 kibana中接受到的日志

(2)Logstashredis中读取处理日志并发送给elasticsearch

  Logstash接受处理日志也有一定的量,如果大量的日志发送给logstash去处理,超过了logstash接受处理日志的能力,则可能会导致logstash挂掉,对于这种情况,可使filebeat将日志发送给redislogstashredis中去读取日志,处理完再发送给elasticsearch。处理流程如图四所示。


图四 logstashredis读取处理日志

  此时,需要安装redis服务(数据量大时,可对redis做集群)。需要修改filebeat配置文件将接受日志发给redis,修改logstash配置文件从redis队列中读取数据。

  Centos7.2epel yum 源中带有redis可直接进行安装并启动redis,redis服务默认端口为6379。

安装redis:

]# yum install redis -y        

  安装完成后需要修改默认绑定的redis ip地址,默认为127.0.0.1,修改为当前主机ip地址或主机名(设置为主机名时个服务节点需要能解析)。

]# sed -i "s#bind 127.0.0.1#bind 10.0.0.14#g" /etc/redis.conf 

  修改完配置文件则可以启动redis:

]# systemctl start redis.service

  配置filebeat将日志发送给redis,在filebeat配置文件中将其他的输出项注释掉,并添加输出为redis,添加的配置内容为:

#------------------------ REDIS -----------------------
output.redis:
  hosts: [10.0.0.12:6379]
  key: "filebeat"
  db: 0
  timeout: 5

  修改完配置后需重启filebeat

]# systemctl restart filebeat

  修改完filebeat配置文件,也要修改logstash配置文件从redis对列中读取数据,则logstashinput配置为:

input {
        redis {
                host => '10.0.0.12'
                port => 6379
                key => "filebeat"
                data_type => "list"
        }
}

  配置完成后则可以启动logstash,也可登录redis查看是否有数据,亦可在kibana中创建索引来查看生成的日志。

  关于更多的logstash的配置与使用可参考elk官方文档(https://www.elastic.co/guide/en/logstash/5.2/index.html


猜你喜欢

转载自blog.csdn.net/dayi_123/article/details/78386731