一、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:
1、logstash概述
Logstash:數據收集,日誌收集。
- 高度插件化:
- input,codec,filter,output
圖2:
logstash server:output之後,再發給前端Redis實現存儲也可以
MQ:message queue //AMQP:高級消息隊列協議,實現數據緩衝。
實現方案有:RabbitMQ,ActiveMQ,Qpid,ZeroMQ,Kafka,Redis的一個子功能
rsyslog:面對海量數據時,不行。
Logstash支持多種數據獲取機制:通過TCP/UDP協議、文件、syslog、windows Eventlogs及STDIN等。
獲取到數據後:支持對數據進行過濾、修改等操作;
工作機制:
圖3:
每個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.htmldata_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