logstash配置文件详解

    xiaoxiao2021-03-25  128

    Logstash实际应用配置详解

    背景

    业务目的是能够分析nginx和apache每天产生的日志,对url、ip、rest接口等信息进行监控,并将数据发送到elasticsearch服务。

    config

    输入

    从日志文件中获取信息

    file { path => "/home/keepgostudio/demo/logs/test.log" start_position => "beginning" }

    过滤

    grok

    目前是logstash中把非标准化的日志数据转换成标准化并且可搜索数据最好的方式。Logstash默认提供了能分析包括java堆栈日志、apache日志在内的120种形式。点击查看

    如没有特别的需求的话,使用默认的apache日志形式就能达到想要的效果,如下。

    grok{ match => {"message" => ["%{COMBINEDAPACHELOG}"]} }

    但如果想要监控更多的信息,比如url上的参数,那么默认的表达式将没办法满足我们的需求,这时我们就需要自己动手去编写一些符合我们业务需要的表达式,并告诉logstash以某种期望的方式进行数据转换。

    首先,在logstash的根目录下创建一个patterns文件夹,这个文件夹默认是没有的。

    其次,在patterns文件夹中创建文件test_pattern(这里为了方便所以没有按照pattern的功能对文件进行命名,在实际应用中最好按照功能来对文件命名,至于原因你懂的)。在test_pattern文件中可以按照“名称 正则表达式”这样的格式自定义一些正则表达式,以便在grok中进行使用。

    最后,在使用的时候一定要把pattern_dir这个参数带上,否则logstash无法识别你自定义的这些正则表达式。

    grok { patterns_dir => ["/home/keepgostudio/download/logstash-5.2.0/patterns"] match => { "message" => ["%{PARAMS_APACHELOG}", "%{NO_PARAMS_APACHELOG}"] } remove_field => ["host", "timestamp", "httpversion", "@version"] }

    kv

    将数据源转换成键值对,并创建相对的field。比如传入“a=111&b=2222&c=3333”,输出的时候,a,b,c会被创建成三个field,这样做的好处是,当需要查询某一个参数的时候可直接查询,而不是把一个字符串搜索出来再做解析。

    kv { source => "field_name" field_split => "&?" }

    geoip

    这个从字面上就能看出他的功能,根据ip查出相应的地理信息,比如城市,省份,国家,经纬度等。这个ip信息是在logstash中的一个数据源中进行搜索查找,而不是进行网络搜索。

    geoip { source => "field_name" fields => ["country_name", "region_name", "city_name", "latitude", "longitude"] target => "location" }

    drop

    drop可以跳过某些不想统计的日志信息,当某条日志信息符合if规则时,该条信息则不会在out中出现,logstash将直接进行下一条日志的解析。

    if [field_name] == "value" { drop {} }

    输出

    logstash输出到elasticsearch时,会随机生成一个id给每一条记录。建议在刚开始接触的时候,可以采用手动输入的方式。这样结合elasticsearch的服务,更容易理解整个实现的流程。

    elasticsearch { hosts => ["192.168.1.44:9200"] index => "logstash-test-%{type}-%{host}" }

    附录

    test.config

    input { stdin {} } filter { grok { patterns_dir => ["/home/keepgostudio/download/logstash-5.2.0/patterns"] match => { "message" => ["%{PARAMS_APACHELOG}", "%{NO_PARAMS_APACHELOG}"] } remove_field => ["host", "timestamp", "httpversion", "@version"] } kv { source => "params" field_split => "&?" } geoip { source => "ip" fields => ["country_name", "region_name", "city_name", "latitude", "longitude"] target => "location" } output { elasticsearch { hosts => ["192.168.1.44:9200"] index => "logstash-test-%{type}-%{host}" } }

    test_pattern

    HTTP_URL \S+(?=\?) HTTP_URL_WITH_PARAMS "(?:%{WORD:method} %{HTTP_URL:url}\?%{NOTSPACE:params}(?: HTTP/%{NUMBER:httpversion}))" HTTP_URL_WITHOUT_PARAMS "(?:%{WORD:method} %{NOTSPACE:url}(?: HTTP/%{NUMBER:httpversion}))" NO_PARAMS_APACHELOG %{IPV4:ip} %{USERNAME} %{USERNAME} \[%{HTTPDATE:timestamp}\] %{HTTP_URL_WITHOUT_PARAMS} %{NUMBER:response} (?:%{NUMBER:bytes}|-) "%{NOTSPACE:referrer}" %{QS:agent} PARAMS_APACHELOG %{IPV4:ip} %{USERNAME} %{USERNAME} \[%{HTTPDATE:timestamp}\] %{HTTP_URL_WITH_PARAMS} %{NUMBER:response} (?:%{NUMBER:bytes}|-) "%{NOTSPACE:referrer}" %{QS:agent}
    转载请注明原文地址: https://ju.6miu.com/read-20624.html

    最新回复(0)