ElasticSearch詳解(二)

一、ES集羣健康檢查
二、ES查詢
三、Logstash
四、Logstash配置案例


一、ES集羣健康檢查

1、集羣健康檢查

curl IP:PORT/_cluster/health?pretty //查看集羣健康狀態
curl IP:PORT/_cluster/stats?pretty  //查看系統統計信息
curl IP:PORT/_cluster/pending_tasks?pretty  //查看集羣堆積任務;有一些任務只能由主節點去處理,比如創建一個新的 索引或者在集羣中移動分片。由於一個集羣中只能有一個主節點,所以只有這一節點可以處理集羣級別的元數據變動。在 99.9999% 的時間裏,這不會有什麼問題。元數據變動的隊列基本上保持爲零。
curl IP:PORT/_cluster/settings?pretty   //查看集羣配置
curl -XGET 'http://localhost:9200/_nodes/hot_threads?pretty' //集羣節點熱線程
curl -XGET '127.0.0.1:9200/_cluster/health?level=indices;pretty=true' //集羣各個索引健康狀況
curl '192.168.192.222:9200/_nodes/stats?pretty' //監控單個節點的狀態信息 https://www.elastic.co/guide/cn/elasticsearch/guide/current/_monitoring_individual_nodes.html#_%E7%B4%A2%E5%BC%95%E9%83%A8%E5%88%86

2、集羣慢日誌配置

[root@node1 config]# curl -H "Content-Type:application/json" -XPUT '192.168.192.222:9200/_cluster/settings?pretty' -d '{
"transient":
{
   "logger.index_search_slowlog_rolling.level":"trace"  //老版本使用= ,新版本使用: 
}
}'

{
  "acknowledged" : true,
  "persistent" : { },
  "transient" : {
    "logger" : {
      "index_search_slowlog_rolling" : {
        "level" : "trace"
      }
    }
  }
}

index.search.slowlog.level: TRACE
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms

調整集羣日誌級別

curl –XPUT IP:PORT/cluster/settings -d'{"transient":{"logger.root":"DEBUG"}}'
curl –XPUT IP:PORT/cluster/settings -d'{"transient":{"logger.root":"INFO"}}’
[root@node1 config]# curl  '192.168.192.222:9200/_cluster/settings?pretty'
{
  "persistent" : { },   //持久化配置
  "transient" : {   //臨時配置
    "logger" : {
      "index_search_slowlog_rolling" : {
        "level" : "trace"
      }
    }
  }
}

3、節點

curl -s 'http://192.168.192.222:9200/_cat/health?v'
GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax //節點狀態信息
curl -s 'http://127.0.0.1:9200/_cat/master' //查看master
curl -s 'http://127.0.0.1:9200/_cat/nodes?help' 
直接關閉節點下線, 可通過自動容災恢復副本, 也可以配置分配黑名單, ESDB 會自動把該 IP 的所有分片自動轉移到其他節點上。 等轉移完成後, 這個空節點就可以毫無影響地下線了。
curl  -H "Content-Type:application/json" 192.168.192.222:9200/_cat/shards?v
curl -XPUT -H "Content-Type:application/json" 192.168.192.222:9200/_cluster/settings -d '{ "transient" :{ "cluster.routing.allocation.exclude._ip" : "192.168.192.222" }}'
curl  '192.168.192.222:9200/_cluster/settings?pretty' //驗證是否生效
curl -XPUT -H "Content-Type:application/json" 192.168.192.222:9200/_cluster/settings -d '{ "transient" :{ "cluster.routing.allocation.exclude._ip" : "" }}' //這樣就可以繼續分配了

4、索引

curl http://192.168.192.222:9200/_cat/shards?v  //查看集羣分片狀態
curl http://192.168.192.222:9200/logstash-2019.03.24/_stats?pretty  //查看單個索引logstash-2019.03.2狀態信息
curl http://192.168.192.222:9200/logstash-2019.03.24/_settings?pretty   //查看索引配置
curl IP:PORT/INDEX_NAME/TYPE_NAME/_Mapping?pretty   //查看索引 Mapping
curl –XPUT IP:PORT/INDEX_NAME/_settings -d '{"index" :{"Refresh_interval" : "10s"}}'    //推送 Refresh 時間週期
curl -s 'http://192.168.192.222:9200/_all/_stats?pretty'   //所有索引統計信息
curl -s  http://192.168.192.222:9200/p2,partment/_stats?prett  //查看2個索引(p2,partment)的使用情況
curl -XDELETE  http://192.168.192.222:9200/logstash-2019.03.24?pretty    //刪除索引

查看partment這個indices的設置情況,分成了5個分片,一個副本 5*2=10

[root@node1 config]# curl  '192.168.192.222:9200/partment/_settings?pretty'
{
  "partment" : {
    "settings" : {
      "index" : {
        "creation_date" : "1553314416886",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "5EuKe9CGSaGkxwfq1RMVMQ",
        "version" : {
          "created" : "6060299"
        },
        "provided_name" : "partment"
      }
    }
  }
}

[root@node2 ~]# curl  '192.168.192.222:9200/_cat/shards?v'  //查看分片分佈情況,partment共10個分片(5個primary,5個replica)
index    shard prirep state   docs store ip              node
p2       3     p      STARTED    1 5.5kb 192.168.192.224 node3
p2       3     r      STARTED    1 5.5kb 192.168.192.223 node2
p2       2     p      STARTED    1 5.5kb 192.168.192.222 node1
p2       2     r      STARTED    1 5.5kb 192.168.192.224 node3
p2       1     r      STARTED    0  261b 192.168.192.222 node1
p2       1     p      STARTED    0  261b 192.168.192.223 node2
p2       4     r      STARTED    0  261b 192.168.192.224 node3
p2       4     p      STARTED    0  261b 192.168.192.223 node2
p2       0     r      STARTED    0  261b 192.168.192.222 node1
p2       0     p      STARTED    0  261b 192.168.192.224 node3
partment 3     p      STARTED    1 5.5kb 192.168.192.222 node1
partment 3     r      STARTED    1 5.5kb 192.168.192.224 node3
partment 2     r      STARTED    1 5.5kb 192.168.192.222 node1
partment 2     p      STARTED    1 5.5kb 192.168.192.223 node2
partment 1     p      STARTED    0  261b 192.168.192.224 node3
partment 1     r      STARTED    0  261b 192.168.192.223 node2
partment 4     r      STARTED    0  261b 192.168.192.222 node1
partment 4     p      STARTED    0  261b 192.168.192.224 node3
partment 0     p      STARTED    0  261b 192.168.192.222 node1
partment 0     r      STARTED    0  261b 192.168.192.223 node2

5、遷移shard

關閉 Allocate

curl –XPUT IP:PORT/_cluster/settings -d '{"persistent": {"cluster.routing.allocation.enable": "none"}}’

Allocate 限速

curl –XPUT IP:PORT/_cluster/settings -d '{"persistent":{"cluster.routing.allocation.node_concurrent_recoveries":8}}'
curl –XPUT IP:PORT/_cluster/settings -d '{"persistent":{"cluster.routing.allocation.cluster_concurrent_rebalance":8}}'
curl –XPUT IP:PORT/_cluster/settings -d '{"persistent":{"indices.recovery.max_bytes_per_sec":"600mb"}}’

遷移 Shard

curl –XPUT IP:PORT/_cluster/reroute?pretty –d '{"commands":[{"move":{"index":"INDEX","Shard":SHARD_NUM," from_node":"SOURCE_IP","to_node":"DES_IP"}}]}’

打開 Allocate

curl IP:PORT/_cluster/settings –d '{"persistent": {"cluster.routing.allocation.enable": "all"}}

6、其他

curl http://192.168.192.222:9200  //查看版本信息

白屏操作:可以安裝Kibana

二、ES查詢

1、查詢索引API

查詢索引:Query API
Query DSL:domain search language //JSON格式的語言

  • 用戶實現諸多類型的查詢操作:比如,simple term query,phrase,range boolean,fuzzy等。
  • (JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式
    ES的查詢操作執行分爲兩個步驟:
  • 分散階段:向所有shard分散的node發起請求
  • 合併階段:合併shard

查詢方式:
向ES發起查詢請求的方式有兩種:

  • 1.通過Restful request API查詢。也稱爲query string.
  • 2.通過發送REST request body進行。
    
    1.Query string
  • curl -XGET '192.168.192.222:9200/students/_search?pretty'
  • curl -XGET 'http://192.168.192.222:9200/students/_search?pretty'
    2.REST body
    [root@node3 ~]# curl -XGET 'http://192.168.4.120:9200/students/_search?pretty' -d '
    {
    "query": { "match_all": {} }
    }'
    多索引、多類型查詢://多個索引之間或者同索引多類型之間

    [root@node3 ~]# curl -XGET 'http://192.168.4.120:9200/_search?pretty'

  • /_search: 查詢所有索引
  • /INDEX_NAME/_search:單索引
  • /INDEX1,INDEX2/_search:多索引
  • /s,t/_search :所有s或者t開頭的索引
  • /students/class1/_search: 單類型搜索
  • /students/class1,class2/_search :多類型搜索
    
    Mapping和Analysis:映射和分析
    ES:對每一個文檔,會取得其所有域的所有值,生成一個名爲“_all"的域;執行查詢時,如果在query_string未指定查詢的域,
    則在_all域上執行查詢操作。
  • GET /_search?q='Xianglong'
  • GET /_search?q-'Xianglong Shiba Zhang'
  • GET /_search?q=courses:'Xianglong Shiba Zhang'
  • GET /_search?q=courses:'Xianglong' /在指定域上精確查找
前兩個在_all域中搜索,後兩個,在指定的域中搜索。
  • curl -XGET 'localhost:9200/students/_search?q="long"' //可以搜索到,匹配到關鍵字了
  • curl -XGET 'localhost:9200/students/_search?q="long shiba"' //搜索不到,因爲會把“long shiba”當做一個詞,但是分詞時把long和shiba 是分開的
  • curl -XGET 'localhost:9200/students/_search?q=courses:"long shiba"&pretty'
  • curl -XGET 'localhost:9200/students/_search?q=courses:"shiba"&pretty' //能夠搜索到
  • curl -XGET 'localhost:9200/students/_search?q="shiba%20shiba"&pretty' //%20代表一個空格
  • curl -XGET 'localhost:9200/students/_search?q="Guo"&pretty' // “Guoxiang” 都不會被匹配到,前後有多餘的子串都不行,分詞的緣故
_all域中默認使用的是數值型,
數據類型:string,numbers,boolean,dates
  • curl 'localhost:9200/students/_mapping/
  • curl 'localhost:9200/students/_mapping/class1?pretty' //查看被映射的數據類型
    age : long
    class: string
    ... :string //多數都是子串

    2、查詢定義

    ES中所有的數據廣義上可被理解爲兩類:

  • types:exact //精確值:值未經加工過的原始值,在搜索時進行精確匹配。(可緩存)
  • full-text:全文搜索 用於引用文本中數據,可以不區分大小寫或者引用同義詞,判斷文檔在多大程度上匹配查詢請求。(不可緩存)

爲了完整full-text搜索,ES 必須首先分析文本,並創建出倒排索引。倒排索引中的數據還需要進行“正規化”爲標準格式 //例如統一使用小寫,正整數,等

  • 分詞:
  • 正規化:

分析=分詞+正規化,分析需要由分析器來進行:analyzer
分析器通常有三個組件:

  • 1.字符過濾器
  • 2.分詞器
  • 3.分詞過濾器

ES內置的分析器:

  • Standard analyzer:基於unicode,用途廣
  • Simple analyzer:單詞
  • Whitespce analyzer:空白字符進行分割
  • Lanuage analyer:適用於多種不同語言的

分析器不僅在創建索引時用到:在構建查詢時也會用到;
建議在查詢和創建時使用同一種分析方法

索引/類型/id

[root@node1 conf.d]# curl -XPUT 'localhost:9200/test/class2/1?pretty' -d '{
 "first_name":"Feng",
 "sencond_name":"Xiao",
 "gender":"Male",
 "courses":"xinaglongshibazhang"
}'
{   
  "_index" : "test",
  "_type" : "class2",
  "_id" : "1",
  "_version" : 1,
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : true
}
[root@node1 conf.d]# curl -XGET 'localhost:9200/test/_search?q="xiao"&pretty'
{
  "took" : 21,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.15342641,
    "hits" : [ {
      "_index" : "test",
      "_type" : "class2",
      "_id" : "1",
      "_score" : 0.15342641,
      "_source" : {
        "first_name" : "Feng",
        "sencond_name" : "Xiao",
        "gender" : "Male",
        "courses" : "xinaglongshibazhang"
      }
    } ]
  }
}

3、過濾器filter dsl:

term filter: //精確匹配包含包含指定term的文檔;
    { "term": {"name":"Guo"} } //判斷name中是否包含Guo
terms filter:用於多值精確匹配
    { "terms": { "name": ["Guo","Rong"] }}  //name包含Guo或者Rong的
range filter:用於在指定的範圍內查找數值或時間
    { “range":
        "age": {
            "gte": 15
            "lte": 25  //15和25之間
        }
    }
    gt,lt,gte,lte
exists and missing filter:存在於不存在
    { 
        "exists": {
            "age": 25
        }
    }
boolean filter:基於boolean模型來合併多個filter子句。
    must:其內部所有的子句條件必須同時匹配,即must
        must: {
            "term": { "age": 25}
            "term": { "agnder": "Female" }
        }   
    must_not:其所有子句必須不匹配,即not
        must_not: {
            "term": { “age": 25 }
        }
    should:至少有一個子句匹配,即or
        should: {
            "term": { "age": 25}
            "term": { "agnder": "Female" }
        }   

查詢語句的結構:

    {
        QUERY_NAME: {
            ARGEMENT: VALUE,
            ARGEMENT: VALUE,
            }
    }

    {
        QUERY_NAME: {
            FIELD_NAME: {
            ARGEMENT: VALUE,
            ARGEMENT: VALUE,
            }
        }   
    }   
[root@node3 ~]# curl -XGET 'localhost:9200/students/_search?pretty' -d '{
"term" : {"name": "Guo" }
}'
//在新的版本中這種用法,好像已經不能使用

[root@node1 conf.d]# curl -XGET 'localhost:9200/test/_search?pretty' -d '{
"query": {
"term": {
"first_name":"feng"
}
}
}'
注意,縮進,要統一,例如都適用兩位座位縮進

[root@node3 ~]# curl -XGET 'localhost:9200/students/_search?pretty' -d '{
"query": {
  "terms": {
  "age": [25,23,22,28]
   }
  }
}'

4、QUERY DSL:

match_all Query:查看index內的所有文檔,沒有指定任何query,默認即match_all query
{ "match_all" : {} }
match Query:在幾乎任何域上執行full-text或exact-value查詢

如果執行full-text查詢,首先要對查詢時的語句進行分析;
    { "match": {"students": "Guo" }}
如果指定exact-value查詢,搜索精確值,此時,建議使用過濾,而非查詢
    { "match": {"name": "Guo"} }

multi_match Query:

    用於在多個域上執行相同的查詢;
    {
        "multi_match":
            "query": full-text search
            "field": {'field1','field2'}
    }           

    {
        "multi_match":
            "query": {
                "students":"Guo"
            }
            "field":
                {
                    "name",
                    "description"
                }
    }
    //在name和description中查找 students和Guo

bool query:
基於boolean邏輯合併多個查詢語句:與bool filter不同的是,查詢子句不是返回"yes"或“no"
而是其計算出的匹配度分值,因此,boolean Query會爲各個子句合併其score;

must:
must_not:
should:
合併filter和query:

    可以把filter放到query上,進行過濾,但是很少把filter用到query上
    {
        "filterd": {
            query: { "match": {"gender": "female" }}
            filter: { "term": {"age": 25}}
            }
    }

查詢語句語法檢查:_validate

GET /INDEX/_validdata/query?pretty   
{
    ...
}

GET /INDEX/_validdata/query?explain&pretty  //顯示具體的錯誤內容
{
    ...
}

[root@node3 ~]# curl -XGET 'localhost:9200/students/_search?pretty' -d '
{    "term": { "first_name": "Jing" }
  "query": {
     "term": { "first_name": "Jing" }
 }
}'
    //執行成功
[root@node3 ~]# curl -XGET 'localhost:9200/students/_validate/query?pretty' -d '
{
  "query": {
     "term": { "first_name": "Jing" }
 }
}'
    //valid: "true"  表示語法正確

[root@node3 ~]# curl -XGET 'localhost:9200/students/_validate/query?explain&pretty' -d '
{
  "query": {
     "term": { "first_name": "Jing" }
 }
}'    
    "explanation": "ConstantScore: \u0001,,,,,)"
    //常量值,分數

三、Logstash

ELK stack的另外一個組件:
L:logstash //log stash的agent部署在服務器上,負責收集日誌,存儲到elasticsearch上

  • 性能不太高,重量級。
  • 有人使用:message queue, //消息隊列收集數據
    K:Kibina //Node js開發的搜索界面

圖1:
ElasticSearch詳解(二)

1、logstash概述

Logstash:數據收集,日誌收集。

  • 高度插件化:
  • input,codec,filter,output

圖2:
ElasticSearch詳解(二)

logstash server:output之後,再發給前端Redis實現存儲也可以
MQ:message queue //AMQP:高級消息隊列協議,實現數據緩衝。
實現方案有:RabbitMQ,ActiveMQ,Qpid,ZeroMQ,Kafka,Redis的一個子功能

rsyslog:面對海量數據時,不行。
Logstash支持多種數據獲取機制:通過TCP/UDP協議、文件、syslog、windows Eventlogs及STDIN等。
獲取到數據後:支持對數據進行過濾、修改等操作;

工作機制:
圖3:
ElasticSearch詳解(二)

每個shifter負責收集日誌,但是server不可能同時接受如此多的shifter同時發來信息。
message queue:常用的是redis,server從隊列中逐條取出。過濾或者修改。然後發送給ES集羣
server是插件式工作方式:

  • input plugin:收集數據。從redis或者其他地方取出數據。
  • codec plugin:編碼插件
  • filter plugin:過濾插件
  • output plugin:發送插件

2、安裝logstash

源碼安裝:https://www.elastic.co/downloads/logstash
解壓後直接啓動:
bin/logstash -e 'input { stdin {} } output { stdout{} }'    //輸入內容測試
bin/logstash -e 'input { stdin {} } output { stdout{codec => rubydebug} }' //使用rubydebug編碼
bin/logstash -e 'input { stdin {} } output { elasticsearch {hosts => ["192.168.192.222:9200"]} stdout{} }' //推送到目標es主機
bin/logstash -e 'input { stdin {} } output { elasticsearch {hosts => ["172.16.0.15:9200", "172.16.0.16:9200"]} stdout{} }'
bin/logstash -e 'input { stdin {} } output { kafka { topic_id => "test" bootstrap_servers => "172.16.0.11:9092,172.16.0.12:9092,172.16.0.13:9092"} stdout{codec => rubydebug} }' //推送到消息隊列

3、修改配置文件

vim logstash.conf
[root@node1 logstash-7.0.0-beta1]# cat config/logstash.conf 
input {
    file {
        type => "os_message_log"
        path => "/var/log/*.log"
        discover_interval => 10
        start_position => "beginning" 
    }
}

output {
  elasticsearch {
    hosts => ["http://192.168.192.222:9200"]
    index => "%{File}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

啓動:logstash -f ./logstash.conf

4、配置框架:

logstash的功能類似於管道:input | filter | output ,如無需對數據進行過濾,filter可以省略

input {
    ...
}

filter {
    ...
}

output {
    ...
} 
四種類型的插件:input,filter,codec,output
input {
  file { 
    type => "flow"
    path => "/var/nginx_logs/*.log" 
    discover_interval => 5
    start_position => "beginning"
  }
}

output {

  if [type] == "flow" {
    elasticsearch { 
      index => "flow-%{+YYYY.MM.dd}"
      hosts => ["172.16.0.14:9200", "172.16.0.15:9200", "172.16.0.16:9200"]
    }

  }  

}

5、數據類型和字段引用

數據類型:

  • Array: [item1,item2,...]
  • Boolean: true,false
  • Bytes:簡單數據
  • Codec:編碼器
  • Hash:key => value ,字典
  • Number:數值,整數或者浮點數
  • Password: 密碼,****
  • Path:文件系統路徑
  • String:字符串

字段引用: []
條件判斷:

  • ==,!=,《,《=,>,>=
  • =~,!~ //正則匹配
  • in,not in
  • and,or,xor //xor異或
  • () //複合表達式

6、插件Input插件

https://www.elastic.co/guide/en/logstash/current/input-plugins.html
input插件:

  • file:從指定的文件中讀取事件流;其工作特性類似於tail -1 file //首次會讀取所有。
    按行讀取,每一行爲一個事件。可以通過codec實現將多行變爲一個事件。
    使用Filewatch(Ruby Gen庫)監聽文件的變化。支持glob風格進行文件展開[可以同時展開多個文件]。
    .sincedb:記錄了每個被監聽文件的inode,number,minor,number,pos[上一次讀取的位置]
    能夠識別日誌的滾動操作。滾動後的新文件從第一行讀取
  • udp:通過udp協議從網絡連接來讀取Message,其必備參數爲port;
    用於指明自己監聽的端口。host則用來指明自己監聽的地址。
    //接受別人的日誌,我的端口和地址
    collectd:性能監控程序:C開發,收集系統性能,發送到網絡主機。
  • redis插件:允許logstash從redis收集數據。支持redis channel和list兩種方式。
    等等

    7、filter插件

    https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
    filter插件:用於將event通過output發出之前對其實現處理功能。//這裏只說 grok
    grok:用於分析並結構化文本數據;目前是logstash中將非結構化日誌數據轉換爲結構化可查詢數據的不二之選。
    syslog,apache,nginx日誌等,需要指定模式
    模式:這是httpd的日誌
    192.168.4.101 - - [11/May/2017:18:26:46 +0800] "GET /favicon.ico HTTP/1.1" 403 213 "http://192.168.4.119/_plugin/head"
    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36"

%ip %user %group [%datetime] %method %url %version %status  %size %reference %user_agent
%ip //模式%ip會自動替換爲 192.168.4.101,按照空格進行分割
    ip => 192.168.4.101
    user =>
    group => 
    datetime => 11/May/2017:18:26:46 +0800
grok提供有combined和common 等log
    [root@node1 conf.d]# rpm -ql logstash |grep -i "patterns$"
    /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.3.0/patterns/grok-patterns
        COMMONAPACHELOG:
        COMBINEDAPACHELOG:

語法格式:

    %{SYNTAX:SEMANTIC}
        SYNTAX:預定義模式名稱
        SEMANTIC:匹配到的文本的自定義標識符
    示例:
        1.1.1.1  GET /index.html 30 0.23

        %{IP:clientip} %{WORD:method} %{URLPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

        %{IP:clientip} //IP是預定義的能夠匹配1.1.1.1,clientip是取出之後自定義的變量名
        %{WORD:method} //匹配單詞,然後賦值給method
        %{URLPATHPARAM:request} //          

自定義grok的模式:

  • grok的模式是基於正則表達式的模式編寫,其元字符與其他awk/sed/grep/pcre差別不大
  • 1.直接使用模式匹配:
  • 2.pattern放到一個文件中匹配
    filter {
    grok {
    patterns_dir => ["./patterns"]
    match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
    }
    }           

    8、output插件

    https://www.elastic.co/guide/en/logstash/current/output-plugins.html
    lotstash之output插件:elasticsearch,file,http,mongodb,redis ,stdout,tcp ,udp,zabbix,...
    elasticsearch:保存到elasticsearch中

  • action ["index", "delete", "create", "update"]
  • hosts: 主機列表
  • index: 存儲到的目標索引的位置
  • protocol:協議
    http: 9200,transport:9300,node和transport一樣
  • workers:工作線程數
    redis:保存到redis中 //可以當做logstash的輸入和輸出
  • agent ----[redis] ---> ES--->ES集羣[]/[]/[] //對於agent來說輸出時redis,但是對於ES來說輸入時redis
    redis作爲logstash的輸出插件:https://www.elastic.co/guide/en/logstash/2.4/plugins-outputs-redis.html
    data_type:logstash輸出時有兩種格式:list:列表channel:頻道
    list相對簡單,
    channel:
    用戶可能只關心其中一個頻道
    數據存儲的時候:是指定數據存儲到哪個頻道的
    0-15個數據庫,
    可以專門爲redis分配一個數據庫
    redis可能同時爲多個服務提供存存儲服務
    batch:true/false,一次可以rpush多個數據,false一次只能一個
    key:爲list或者list啓用的名字

四、Logstash配置案例

1、logstash-input-file

[root@node1 conf.d]# vim /etc/logstash/conf.d/file.conf
input {
    file {
        type => "flow"
        discovery_interval => 5
        path => ["/var/log/messages"]
        type => "system"
        start_position => "beginning"
    }
}

output {
    if [type] == "flow" {
        elasticsearch {
        index => "flow-%{+YYYY.MM.dd}"
        hosts => ["172.16.0.14:9200", "172.16.0.15:9200", "172.16.0.16:9200"]
    }

    }
}

[root@node1 conf.d]# logstash -f file.conf

2、logstash-input-udp

node2上使用collectd記錄主機狀態信息,發送給node2 [logstash],的UDP

(1)node2:collectd

    yum install collectd -y 
[root@node2 ~]# vim /etc/collectd.conf 
[root@node2 ~]# egrep -v "^#|^$" /etc/collectd.conf
    Hostname    "node2.mt.com"
    LoadPlugin syslog
    LoadPlugin cpu
    LoadPlugin df
    LoadPlugin interface
    LoadPlugin load
    LoadPlugin memory
    LoadPlugin network
    <Plugin network>
        <erver "192.168.3.109","25820">
        </Server>
    </Plugin>
    Include "/etc/collectd.d"
[root@node2 ~]# systemctl start collectd.service
[root@node2 ~]# systemctl status collectd.service

(2)node1:logstash

[root@node1 conf.d]# vim udp_collectd.conf
input {
        udp {
                port => 25820
                codec => collectd {}  //編碼器爲collectd
                type => "collectd"  //type可以隨意起名字
        }
}
output {
        stdout {
                codec => rubydebug
        }
}
[root@node1 conf.d]# logstash -f udp_collectd.conf --configtest

3、logstash-filter-grok

[root@node1 conf.d]# vim grok.conf
[root@node1 conf.d]# egrep -v "^#|^$" grok.conf 
input {
    stdin {}
}
filter {
    grok {
        match => { "message" => "%{IP:clientip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} "}
    }
}
output {
    stdout {
        codec => rubydebug
    }
}   

4、logstash-file-apachelog

[root@node1 conf.d]# cat apache2.conf 
input {
    file {
        path    => ["/root/access_log"]
        type    => "apachelog"
        start_position  => "beginning"
    }
}

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
}

output {
    stdout {
        codec => rubydebug
    }
}   

5、收集nginx日誌

在grok-parms文件中添加對nginx的匹配模式

[root@node1 conf.d]# cat nginx.conf 
input {
    file {
        path    => ["/var/log/nginx/access.log"]  //nginx的日誌是access.log,而httpd的是access_log
        type    => "nginxlog"
        start_position  => "beginning"
    }
}

filter {
    grok {
        match => { "message" => "%{NGINXACCESS}" }
    }
}

output {
    stdout {
        codec => rubydebug
    }
}   

將如下信息添加至 /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.3.0/patterns/grok-patterns文件的尾部:
NGUSERNAME [a-zA-Z.\@-+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} [%{HTTPDATE:timestamp}] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}

6、redis作爲輸出插件

node1:192.168.3.109 //運行了redis,logstash用於測試

[root@node1 conf.d]# vim nglogredis.conf
input {
    file {
        path    => ["/var/log/nginx/access.log"]
        type    => "nginxlog"
        start_position  => "beginning"
    }   
}

filter {
    grok {
        match   => { "message" => "%{NGINXACCESS}" }
    }   
}

output {
    redis {
        port    => "6379"       //一定要有“ ” 否則會出錯
        host    => ["127.0.0.1"]
        data_type   => "list"   
        key => "logstash_log"
    }   
}

redis-cli
    help @list
    LLEN logstash-nginxlog //
    LINDEX logstash-nginxlog 1 //獲取第一個

7、redis作爲輸入插件

[root@node2 ~]# vim /etc/logstash/conf.d/server.conf
input {
    redis {
        port    => "6379"
        host    => "192.168.3.109"
        data_type       => "list"
        type    => "nginxlog"
        key     => "logstash_log"
    }
}

output {
    stdout {
        codec   => rubydebug
    }
}   

logstash -f /etc/logstash/conf.d/server.conf //可以看到收集的日誌
假如在node1上繼續執行 獲取命令
[root@node1 conf.d]# logstash -f nglogredis.conf

參考博客:
https://blog.csdn.net/zuochang_liu/article/details/81807955
https://www.elastic.co/guide/en/logstash/current/first-event.html
https://www.elastic.co/guide/en/logstash/current/dir-layout.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章