ELK学习1.3 Logstash(6.3.2)搭建及配置

环境:

CentOS 7,Logstash6.3.2html

摘要说明:

Logstash:Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它能够从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它可以以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。node

本篇文章主要讲述Logstash的安装及相关配置mysql

步骤:

1.Logstash版本选择及安装

为了保持与Elasticsearch的版本一致,咱们也选择版本6.3.2;咱们能够从https://www.elastic.co/downloads选择要下载的版本连接:nginx

# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.2.rpm
# rpm -hvi logstash-6.3.2.rpm

安装完成以后咱们能够看到配置的路径为/etc/logstash;安装路径为/usr/share/logstash/;web

2.Logstash配置文件详解

首先咱们进入到安装路径下能够看到相关配置文件:正则表达式

# cd /etc/logstash/
# ls
conf.d  jvm.options  log4j2.properties  logstash.yml  pipelines.yml  startup.options
  • conf.d:logstash日志解析文件保存在此处;
  • jvm.options:内存相关设置
  • log4j2.properties:日志相关配置
  • logstash.yml:logstash系统相关配置
  • pipelines.yml:管道配置
  • startup.options:启动配置

通常测试时须要配置内存,默认内存为1g;redis

3.Logstash日志解析文件配置详解

Logstash 经过管道进行运做,管道有两个必需的元素,输入和输出,还有一个可选的元素,过滤器。sql

输入插件从数据源获取数据,过滤器插件根据用户指定的数据格式修改数据,输出插件则将数据写入到目的地。以下图:数据库

这中间的配置都是经过日志解析文件来进行配置,日志解析配置文件的框架共分为三个模块:input,output,filter;apache

配置文件通常放在/etc/logstash/conf.d/目录下,配置文件的写法以下:

# 日志导入
input {
}
# 日志筛选匹配处理
filter {
}
# 日志匹配输出
output {
}

input 模块:

input模块下可使用多个插件:如syslog、file、redis、beats等插件:

  • file #从文件系统上的文件读取,很是相似于UNIX命令tail -F
  • syslog #在众所周知的端口514上侦听系统日志消息,并根据RFC3164格式进行解析
  • redis #用redis通道和redis列表从redis服务器读取数据。 Redis常常用做集中式Logstash安装中的“broker”,它未来自远程Logstash“shippers”的Logstash事件排队。
  • beats  #处理由Filebeat发送的事件。

file插件配置详解:以下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html

input {
    # file为经常使用文件插件,插件内选项不少,可根据需求自行判断,可同时配置多个
    file {
        # type字段,可代表导入的日志类型,这里的type,对应了ES中index中的type,即若是输入ES时,没有指定type,那么这里的type将做为ES中index的type。
        type => "httpd_access"
        # 要导入的文件的位置,可使用*,例如/var/log/nginx/*.log
        path => "/etc/httpd/logs/access_log"
        # 要排除的文件
        Excude =>”*.gz”
        #start_position能够设置为beginning或者end,beginning表示从头开始读取文件,end表示读取最新的,这个也要和ignore_older一块儿使用。
        start_position => "beginning"
        # ignore_older表示了针对多久的文件进行监控,默认一天,单位为秒,能够本身定制,好比默认只读取一天内被修改的文件,0为无限制,单位为秒
        ignore_older => 0  
        # sincedb_path表示文件读取进度的记录,每行表示一个文件,每行有两个数字,第一个表示文件的inode,第二个表示文件读取到的位置(byteoffset)。默认为$HOME/.sincedb*;记录文件上次读取位置,输出到null表示每次都从文件首行开始解析
        sincedb_path => "/dev/null"
        #这个值默认是\n 换行符,若是设置为空"",那么后果是每一个字符表明一个event
        delimiter => ""
       
    }   
   file {
        path => "/var/lib/mysql/slow.log"
        start_position => "beginning"
        ignore_older => 0  
        .....
    }   
}

redis插件配置详解:以下,可酌情选择进行配置可参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-redis.html

input {
    # redis插件为经常使用插件,插件内选项不少,可根据需求自行判断
    redis {
        # EVAL命令返回的事件数目,设置为5表示一次请求返回5条日志信息
        batch_count => 1 
        # logstash redis插件工做方式
        data_type => "list" 
        # 监听的键值
        key => "logstash-test-list" 
        # redis地址
        host => "127.0.0.1" 
        # redis端口号
        port => 6379 
        # 若是有安全认证,此项为认证密码
        password => "123qwe" 
        # 若是应用使用了不一样的数据库,此为redis数据库的编号,默认为0。
        db => 0 
       # 启用线程数量
        threads => 1 
      }
}

beats插件配置详解:以下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-beats.html

input {
  beats {
    #指定监听端口
    port => 5044
    #要监听的ip地址,默认0.0.0.0;
    host => '0.0.0.0'
  }
}

更多input插件可参考:https://www.elastic.co/guide/en/logstash/current/input-plugins.html

filter 模块:

filter模块下主要插件grok、mutate、ruby、date、json以下:

grok插件配置详解:以下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

filter{
    # 解析任意文本而且结构化他们。grok目前是logstash中最好的解析非结构化日志而且结构化他们的工具。这个工具很是适合syslog、apache log、mysql log之类的人们可读日志的解析
    grok{
       # 正则匹配日志,能够筛选分割出须要记录的字段和值
        match => { "message" => "正则表达式"}
       # 删除不须要记录的字段
        remove_field => ["message"]
    }
}

mutate插件配置详解:以下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html

filter {  
    #mutate过滤器容许您对字段执行常规突变。您能够重命名,删除,替换和修改事件中的字段。
    mutate {
        #将字段的值转换为其余类型,例如将字符串转换为整数。若是字段值是数组,则将转换全部成员。若是该字段是哈希,则不会采起任何操做。
        convert => [
                    #把request_time的值装换为浮点型
                    "request_time", "float",
                    #costTime的值转换为整型
                    "costTime", "integer"
                    ]
        #将现有字段复制到另外一个字段。将覆盖现有目标字段
        copy => { "source_field" => "dest_field" }
        #将正则表达式与字段值匹配,并将全部匹配替换为替换字符串。仅支持字符串或字符串数​​组的字段。对于其余类型的领域,将不采起任何行动。
        gsub => [
         #用下划线替换全部正斜杠
         "fieldname", "/", "_",
         #替换反斜杠,问号,哈希和减小
         #带点“。”
         "fieldname2", "[\\?#-]", "."
         ]
    }

ruby插件配置详解:以下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html

filter {
    #ruby插件可使用任何的ruby语法,不管是逻辑判断,条件语句,循环语句,仍是对字符串的操做,对EVENT对象的操做,都是极其驾轻就熟的。
    ruby {
        #ruby插件有两个属性,一个init 还有一个code
        #init属性是用来初始化字段的,你能够在这里初始化一个字段,不管是什么类型的均可以,这个字段只是在ruby{}做用域里面生效。
        #这里我初始化了一个名为field的hash字段。能够在下面的coed属性里面使用。
        init => [field={}]
        #code属性使用两个冒号进行标识,你的全部ruby语法均可以在里面进行。
        #下面我对一段数据进行处理。
        #首先,我须要在把message字段里面的值拿到,而且对值进行分割按照“|”。这样分割出来的是一个数组(ruby的字符创处理)。
        #第二步,我须要循环数组判断其值是不是我须要的数据(ruby条件语法、循环结构)
        #第三步,我须要吧我须要的字段添加进入EVEVT对象。
        #第四步,选取一个值,进行MD5加密
        #什么是event对象?event就是Logstash对象,你能够在ruby插件的code属性里面操做他,能够添加属性字段,能够删除,能够修改,一样能够进行树脂运算。
        #进行MD5加密的时候,须要引入对应的包。
        #最后把冗余的message字段去除。
        code => "
            array=event。get('message').split('|')
            array.each do |value|
                if value.include? 'MD5_VALUE'
                    then 
                        require 'digest/md5'
                        md5=Digest::MD5.hexdigest(value)
                        event.set('md5',md5)
                end
                if value.include? 'DEFAULT_VALUE'
                    then
                        event.set('value',value)
                end
            end
             remove_field=>"message"
        "
    }
}

json插件配置详解:以下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-json.html

filter {
  #这是一个JSON解析过滤器。它须要一个包含JSON的现有字段,并将其扩展为Logstash事件中的实际数据结构。
  #默认状况下,它会将解析后的JSON放在Logstash事件的根(顶层)中,可是可使用配置将此过滤器配置为将JSON放入任意任意事件字段中 target。
  json {
    #指定json所在位置若是您在message字段中有JSON数据
    source => "message"
    #若是此过滤器成功,请向此事件添加任意字段。字段名称能够是动态的,并使用包含事件的部份内容%{field}。
    add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
    #移除字段
    remove_field => [ "foo_%{somefield}" ]
  }
}

更多可参考:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html

output模块:

output模块下主要插件elasticsearch 、file、redis、email、tdout 等以下:

elasticsearch插件配置详解:以下,可参考https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html

output {
     #能够同时输出到多个终端
     #筛选过滤后的内容输出到终端显示
     tdout { codec => "rubydebug" }
    
     #导出到elasticsearch
     elasticsearch {
        # 导出格式为json
        codec => "json"
        # ES地址+端口
        hosts => ["127.0.0.1:9200"]
        # 设置索引,可使用时间变量
        index => "logstash-slow-%{+YYYY.MM.dd}"
        # ES若是有安全认证就使用帐号密码验证,无安全认证就不须要
        user => "admin"
        password => "xxxxxx"
     }   
}

其余可参考:https://www.elastic.co/guide/en/logstash/current/output-plugins.html

4.Logstash启动及经常使用命令

logstash经常使用命令以下:

-e :指定logstash的配置信息,能够用于快速测试;

-f :指定logstash的配置文件;能够用于生产环境;

 -l :指定日志路径,不然输出到标准输出

一般想执行logtash命令需先到根路径下:

# cd /usr/share/logstash/

 再使用/bin/logstash执行命令,如:

# bin/logstash -f logstash.conf

为了更好的的执行logstash命令,建立一个软链接,每次执行命令的时候不用在写安装路劲(默认安装在/usr/share下):

# ln -s /usr/share/logstash/bin/logstash /bin/

logstash -e示例以下:

经过-e参数指定logstash的配置信息,用于快速测试,直接输出到屏幕。--quiet:日志输出安静模式
$ logstash -e "input {stdin{}} output {stdout{}}" --quiet
# 指定输出编码为rubydebug
$ logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'

logstash -f示例以下:

首先建立日志解析文件到/etc/logstash/conf.d/下如:

# vi /etc/logstash/conf.d/logstash-simple.conf

 从头开始读取/var/log/httpd/access_log,输出到elasticsearch 且指定索引:

input {
file {
    path => "/var/log/httpd/access_log"
    start_position => "beginning"
  }
 }
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "access-%{+YYYY.MM.dd}"
   }
  stdout { codec => rubydebug }
}

后台启动并指定日志文件:

# nohup ./logstash -f ../conf/logstach.conf -l ../log/logstash.log &

启动后结合上篇的Elasticsearch在head插件中查看导入日志:

 点击数据浏览查看日志: