Logstash配置方法

Logstash                                                                                                                                           
#############################logstash命令經常使用參數#############################
html

-n 指定logstash實例名稱,若是沒有指定,默認是本地主機名
-f 從指定的文件或文件夾中加載logstash的配置;若是是一個文件夾,它會加載裏面全部的文件,或者能夠加上通配符只加載特定格式的文件
-w 容許filter和output的pipeline線程數量,默認是CPU核數
-b 每一個 Logstash pipeline 線程,在執行具體的 filter 和 output 函數以前,最多能累積的日誌條數,默認是 125 條。越大性能越好,一樣也會消耗越多的 JVM 內存
-u 每一個 Logstash pipeline 線程,在打包批量日誌的時候,最多等待幾毫秒。默認是 5 ms
-l 指定日誌輸出位置
-r 監控配置配置文件,若是有變化則自動重載logstash
-e 使用給定的命令行字符串做爲配置,直接運行bin/log/logstash -e 配置默認是"input { stdin { type => stdin } }" "output { stdout { codec => rubydebug } }"
-t 檢查配置文件是否有語法錯誤
-V 打印logstash版本
--log.level 指定日誌等級,包括trace、debug、info、warn、error、fatal,默認info
--http.host 指定web API綁定的主機,默認127.0.0.1
--http.port 指定web API的http端口,默認9600至9700


#############################後臺啓動logstash#############################
1.安裝supervisor
java

yum -y install supervisor --enablerepo=epel

2.在/etc/supervisord.conf配置文件最後添加:
node

[program:logstash]
directory=/usr/local/logstash
command=/usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/conf.d/ -r -l /var/log/logstash

3.啓動
nginx

service supervisord start

4.單獨控制一個子進程
git

supervisorctl stop logstash


#############################編解碼配置插件#############################
#官網參考:https://www.elastic.co/guide/en/logstash/current/codec-plugins.html
#logstash不僅是一個input|filter|output的數據流,而是一個input|decode|filter|encode|output的數據流。codec就是用來decode、encode事件的。
1.JSON編解碼
#直接輸入預約義好的JSON數據,能夠省略filter/grok配置,下降logstash過濾的CPU負載消耗
github

input {
    file {
        path => "/opt/data/logs/bjape01-ngx-a1-172.16.3.2/nginx_access.log"
        codec => "json"
    }
}

2.multiline多行事件編碼
web

codec => multiline {
    pattern => "^\["
    negate => true
    what => "previous"
}

#pattern 要匹配的正則表達式,字符串類型
#negate  正則表達式是否生效,布爾類型,默認爲flase
#what 未匹配的內容是向前合併仍是向後後合併,previous,next兩個值選擇
#示例配置能夠用於Log4j方式的應用程序日誌

3.line面向行的文本數據

4.plain空的純文本編解碼
#使用已經有定義框架輸入或輸出,例如logstash輸出轉存到elasticsearch
正則表達式

output {
        if [type] == "user_audit" {
            elasticsearch {
                            hosts => ["172.16.1.25","172.16.1.26","172.16.1.27"] 
                            index => 'user_audit-%{+YYYY-MM-dd}'
                            codec=>plain{charset=>"UTF-8"}
                          }
                    }
        }


#############################輸入插件#############################
#官網參考:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
1.標準輸入
示例:
數據庫

input {
    stdin {
        add_field => {"key" => "value"}
        codec => "plain"
        tags => ["add"]
        type => "std"
    }
}

#add_field 向事件添加一個字段,hash類型
#codec 設置編碼方式,默認是line
#tags 添加標記
#type 添加類型

2.文件輸入
apache

input {
    file {
        path => [
                "/opt/data/logs/idca-web1-172.16.3.2/apache_access.log",
                "/opt/data/logs/idca-web1-172.16.3.2/apache_error.log"
                ]
        stat_interval => 1
        discover_interval => 1
        type => "logstash-apache_log"
    }
}

#path 處理的文件的路徑, 能夠定義多個路徑
#stat_interval 每隔多久檢查一次被監聽文件狀態(是否更新),默認是1秒
#discover_interval 每隔多久去檢查一次被監聽的path下是否有新文件,默認是15秒
#start_position 從什麼位置開始讀取文件數據,"beginning"從頭開始讀取,讀到最後一行不會終止,繼續tailf;"end"從結束位置tailf。默認值是"end"
    #坑:start_position僅在該文件從未被監聽過的時候起做用,若是sincedb文件中已經有這個文件的inode記錄了,那麼logstash依然會衝記錄過的pos開始讀取數據。因此重複測試的時候每回須要刪除sincedb文件,該文件通常在安裝目錄下的data/plugins/inputs/file/中
    #優化:在file中添加sincedb_path => "/dev/null",能夠直接將sincedb寫到黑洞中
#exclude 不想被監聽的文件能夠排除出去
#sincedb_path 配置sincedb文件位置
#sincedb_write_interval 每隔多久寫一次sincedb文件,默認15秒

3.syslog輸入

input {
    syslog {
        port => "514"
    }
}


4.kafka輸入

input {
kafka {
    type => "logstash-apache_log"
    codec => "plain"
    topics => "apache_log"
    bootstrap_servers => "kafka1:9092,kafka2:9092,kafka3:9092"
  }
}

#topics  主題名,多個主題時使用列表形式

#bootstrap_servers  kafka地址,多個地址時使用「host1:port1,host2:port2」格式



#############################過濾器配置#############################
#官網參考:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
1.grok正則捕獲
#用於匹配對應格式的message,而後過濾出來

filter {
  grok {
    break_on_match => false
    patterns_dir => ["/usr/local/logstash/etc/conf.d/patterns"]
    match => { "message" => "\[%{TIMESTAMP_ISO8601:time}\] \[%{GLASSFISHVERSION:gfversion}\] %{OTHER}"}
  }
   grok {
    break_on_match => false
    patterns_dir => ["/usr/local/logstash/etc/conf.d/patterns"]
    match => {"path" => "/%{USER}/%{USER}/%{USER}/%{USER:host}/%{OTHER}" }
    overwrite => [ "host" ]
  }
}

#break_on_match 表示匹配即中止,默認爲true,若是但願grok嘗試全部模式,設置爲false
#patterns_dir 將grok表達式統一寫到文件中,該選項指定文件目錄。grok表達式能夠寫到配置文件中,可是日誌格式可能有多種,每種都寫一行本身的表達式就可能會出問題,因此建議將全部的grok表達式統一寫到一個地方。

#grok表達式格式:

USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
#第一行用普通的正則表達式來定義一個grok表達式;第二行用以定義好的grok表達式來定義另外一個grok表達式。logstash內置了多種grok表達式,查看https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns,一樣能夠自定義grok表達式。
%{NUMBER:num}
%{NUMBER:num:int}
#grok表達式的打印複製格式,第一行中NUMBER表示匹配的模式,num是匹配內容的標識,表明匹配的內容;第二行中int表示轉換匹配內容的格式,默認是字符串格式。

#overwrite用來重寫message字段,上面例子第二個grok中match的是一個路徑,可是咱們只想保留路徑中的一個host字段,因此overwrite => [ "host" ]就能夠了
 
2.date時間處理
#日誌產生到logstash處理通常都會有一段時間差,致使logstash實際處理時間都比日誌產生時間晚。logstash-filter-date插件能夠解析日誌中的時間,變成LogStash:Timestamp對象,而後轉存到@timestamp字段裏,做爲事件的時間戳;若是未使用date插件或沒有解析到時間,logstash將使用日誌輸入的時間做爲事件的時間戳。

date {
      match => [ "time", "MMM dd yyyy HH:mm:ss",
            "MMM  d yyyy, HH:mm:ss", "ISO8601" ]
    }

#配置選項包括:locale、match、tag_on_failure、target、timezone。經常使用的是match,值的類型一樣是列表,默認是[]
#實例中的time就是grok中匹配字段的標識,由咱們自定義。
#date插件支持五種時間格式,經常使用的是ISO8601和Joda-Time庫

ISO8601:相似"2018-10-19T14:25:25.905+0800",這是咱們的北京時間,若是是UTC時間後面跟的是一個大寫的Z(時區偏移),nginx、apache、java應用均可以設置爲這種格式。
UNIX:UNIX時間戳格式,記錄從1970年起至今的總秒數。
UNIX_MS:從1970年至今的總毫秒數。
TAI64N:tai64n格式,不多用。
Joda-Time庫:y年,yyyy例如2018,yy例如18;M月,MMMM例如January,MMM例如Jan,MM例如01,M例如1;d日,dd例如01,d例如1;H時,HH例如01,H例如1;m分,mm例如01,m例如1;s秒,ss例如01,s例如1

3.GeoIP地址查詢
#GeoIP過濾器根據來自Maxmind GeoLite2數據庫的數據,添加關於IP地址地理位置的信息。
#插件名稱logstash-filter-geoip,能夠先使用logstash-plugin list命令查看插件是否安裝,沒有安裝可使用logstash-plugin install logstash-filter-geoip命令來安裝
#基本配置

geoip {
                source => "clientip"
        }

#debug標準輸出爲

{
           "path" => "/var/log/logstash_test/apache_access.log",
           "type" => "apache_log",
      "timestamp" => "26/Oct/2018:14:44:25 +0800",
       "@version" => "1",
       "response" => "302",
        "usetime" => "0",
       "referrer" => "/hsbp2pUser/view/html/errorSkip.html;jsessionid=f1deac55291cdf60c1e66108a89c.bjape01-wgw-b2",
     "@timestamp" => 2018-10-26T06:44:25.000Z,
          "geoip" => {
         "country_code2" => "CN",
              "timezone" => "Asia/Shanghai",
              "latitude" => 22.8167,
        "continent_code" => "AS",
           "region_code" => "45",
           "region_name" => "Guangxi",
          "country_name" => "China",
              "location" => {
            "lon" => 108.3167,
            "lat" => 22.8167
        },
         "country_code3" => "CN",
                    "ip" => "113.15.241.43",
             "longitude" => 108.3167,
             "city_name" => "Nanning"
    },
          "agent" => "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
           "host" => "opsmanage",
        "message" => "113.15.241.43 - - [26/Oct/2018:14:44:25 +0800] \"/hsbp2pUser/view/html/errorSkip.html;jsessionid=f1deac55291cdf60c1e66108a89c.bjape01-wgw-b2\"  302 460 0 \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)\"",
       "clientip" => "113.15.241.43",
          "bytes" => "460",
    "remote_user" => "-"
}

#經常使用配置
#source 指定來源IP字段,即便用GeoIP庫來分析的IP地址,若是是一個列表,只有第一個會被使用
#database 指定GeoIP庫的路徑,若是不指定該配置項默認隨Logstash的GeoLite2城市數據庫
#fields 指定輸出那些字段,格式是一個列表。若是不指定默認爲[city_name,continent_code,country_code2,country_code3,country_name,dma_code,ip,latitude,longitude,postal_code,region_name,timezone]
#target 指定應該將geoip數據存儲在哪一個Logstash的字段,通常設置爲geoip


#############################輸出插件#############################
#官網參考:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
1.輸出到Elasticsearch

output {
    elasticsearch {
        hosts => ["172.16.1.25","172.16.1.26","172.16.1.27"]
        index => "%{type}-%{+YYYY-MM-dd}"
        codec=>plain{charset=>"UTF-8"}
    }
}

#hosts Elasticsearch地址,列表形式,能夠寫多個。#index 索引名,寫入Elasticsearch索引的名稱,可使用變量。注意:%{+YYYY-MM-dd}}在語法解析時,看到已+開頭的,就會自動認爲後面是時間格式,因此以前處理過程當中不要給自定義字段取加號開頭的名字;索引名中不要有大寫字母,不然Elasticsearch會報InvalidindexNameException

相關文章
相關標籤/搜索