ELK日誌相關

轉: Logstash 講解與實戰應用

1、Logstash 介紹php


Logstash 是一款強大的數據處理工具,它能夠實現數據傳輸,格式處理,格式化輸出,還有強大的插件功能,經常使用於日誌處理。
nginx



wKioL1e3v2vDm9B-AAEPIwibWb0700.png


官網地址:https://www.elastic.co/products/logstashlaravel


工做流程git


wKiom1e31O6hsGJUAADcUSxOIdM003.png

Logstash 工做的三個階段:web


input 數據輸入端,能夠接收來自任何地方的源數據。redis

  • file:從文件中讀取mongodb

  • syslog:監聽在514端口的系統日誌信息,並解析成RFC3164格式。json

  • redis:從redis-server list 中獲取
    vim

  • beat:接收來自Filebeat的事件centos


Filter 數據中轉層,主要進行格式處理,數據類型轉換、數據過濾、字段添加,修改等,經常使用的過濾器以下。

  • grok: 經過正則解析和結構化任何文本。Grok 目前是logstash最好的方式對非結構化日誌數據解析成結構化和可查詢化。logstash內置了120個匹配模式,知足大部分需求。

  • mutate: 在事件字段執行通常的轉換。能夠重命名、刪除、替換和修改事件字段。

  • drop: 徹底丟棄事件,如debug事件。

  • clone: 複製事件,可能添加或者刪除字段。

  • geoip: 添加有關IP地址地理位置信息。


output 是logstash工做的最後一個階段,負責將數據輸出到指定位置,兼容大多數應用,經常使用的有:

  • elasticsearch: 發送事件數據到 Elasticsearch,便於查詢,分析,繪圖。

  • file: 將事件數據寫入到磁盤文件上。

  • mongodb:將事件數據發送至高性能NoSQL mongodb,便於永久存儲,查詢,分析,大數據分片。

  • redis:將數據發送至redis-server,經常使用於中間層暫時緩存。

  • graphite: 發送事件數據到graphite。http://graphite.wikidot.com/

  • statsd: 發送事件數據到 statsd。



2、安裝logstash


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 配置yum源,新建yum文件
vim  /etc/yum .repos.d /es .repo
 
# 加入如下內容
 
[kibana-4.5]
name=Kibana repository  for  4.5.x packages
baseurl=http: //packages .elastic.co /kibana/4 .5 /centos
gpgcheck=1
gpgkey=http: //packages .elastic.co /GPG-KEY-elasticsearch
enabled=1
 
[beats]
name=Elastic Beats Repository
baseurl=https: //packages .elastic.co /beats/yum/el/ $basearch
enabled=1
gpgkey=https: //packages .elastic.co /GPG-KEY-elasticsearch
gpgcheck=1
 
# 執行安裝指令
yum  install  logstash -y



3、使用命令行運行一個簡單的logstash程序


1
2
3
4
5
6
7
8
9
10
logstash /bin/logstash  -e  'input{stdin{}}output{stdout{codec=>rubydebug}}'
 
# 輸入 abc 輸出以下
 
{
        "message"  =>  "abc" ,
       "@version"  =>  "1" ,
     "@timestamp"  =>  "2016-08-20T03:33:00.769Z" ,
           "host"  =>  "iZ23tzjZ"
}



4、配置語法講解


logstash使用{ }來定義配置區域,區域內又能夠包含其插件的區域配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 最基本的配置文件定義,必須包含input 和 output。
 
input{
     stdin{ }
}
 
 
output{
     stdout{
         codec=>rubydebug
     }
}
 
 
# 若是須要對數據進操做,則須要加上filter段
 
input{
     stdin{ }
}
 
 
filter{
   # 裏面能夠包含各類數據處理的插件,如文本格式處理 grok、鍵值定義 kv、字段添加、
   # geoip 獲取地理位置信息等等... 
 
}
 
output{
     stdout{
         codec=>rubydebug
     }
}
 
 
# 能夠定義多個輸入源與多個輸出位置
 
input{
     stdin{ }
     
     file {
         path => [ "/var/log/message" ]
         type  =>  "system"
         start_position =>  "beginning"
     }
}
 
 
output{
     stdout{
         codec=>rubydebug
     }
     
      
     file  {
         path =>  "/var/datalog/mysystem.log.gz"
         gzip  =>  true
     }
     
}


啓動方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 經過手動指定配置文件啓動
 
/bin/logstash  -f  /etc/logstash/conf .d /nginx_logstash .conf
 
# 以daemon方式運行,則在指令後面加一個 & 符號
 
/bin/logstash  -f  /etc/logstash/conf .d /nginx_logstash .conf &
 
 
# 若是是經過rpm包安裝的logstash則能夠使用自帶的腳本啓動
 
/etc/init .d /logstash  start 
 
# 經過這種方式啓動,logstash會自動加載 /etc/logstash/conf.d/ 下的配置文件



5、filebeat基本講解


filebeat是基於原先 logstash-forwarder 的源碼開發而來,無需JAVA環境,運行起來更輕便,無疑是業務服務器端的日誌收集工具。


配 置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# 配置文件路徑 "/etc/filebeat/filebeat.yml"
# 一個配置文件能夠包含多個prospectors,一個prospectors能夠包含多個path。
 
 
filebeat:
   # List of prospectors to fetch data.
   prospectors:
     # Each - is a prospector. Below are the prospector specific configurations
     -
       paths:
         /var/log/messages
         
       input_type: log
 
       document_type: messages
 
     -
       paths:
         /alidata/log/nginx/access/access .log.json
 
       input_type: log
 
       document_type: nginxacclog
 
     -
       paths:
         /alidata/www/storage/logs/laravel .log
 
       input_type: log
 
       document_type: larlog
 
     -
       paths:
         /alidata/www/500_error/500_error .log
 
       input_type: log
 
       document_type: error500
 
     -
       paths:
         /alidata/www/deposit/deposit .log
 
       input_type: log
 
       document_type: deposit
 
 
     -
       paths:
         /alidata/www/call_error .log
 
       input_type: log
 
       document_type: call_error
 
     -
       paths:
         /alidata/www/weixin_deposit .log
 
       input_type: log
 
       document_type: weixin_deposit
 
 
     -
       paths:
         /alidata/log/php/php-fpm .log.slow
 
       input_type: log
 
       document_type: phpslowlog
 
       # 多行處理
       multiline:
           pattern:  '^[[:space:]]'
           negate:  true
           match: after
 
 
     # Additional prospector
 
registry_file:  /var/lib/filebeat/registry
 
 
############################# Libbeat Config ##################################
# Base config file used by all other beats for using libbeat features
 
############################# Output ##########################################
 
# 輸出數據到 redis 
 
output:
 
 
   redis:
 
     host:  "10.122.52.129"
     port: 6379
     password:  "123456"
 
 
# 輸出數據到 logstash ,通常二者選用其一
  
   logstash:
     hosts: [ "10.160.8.221:5044" ]
 
 
############################# Shipper #########################################
 
shipper:
 
# 打上服務器tag
 
   name:  "host_2"
   
   
############################# Logging #########################################  
   
logging:  
   
   
   files:
   
 
     rotateeverybytes: 10485760  # = 10MB


filebeat主要配置就是這個配置文件了,設定好以後啓動服務就會自動從源拉取數據發送到指定位置,當數據爲普通行數據時,filebeat會自動爲其添加字段信息,其中一項字段 @timestamp 爲filebeat讀取到這條數據的時間,默認格式爲UTC時間,比中國大陸時間早8小時。


若是數據爲json格式,而數據中已包含@timestamp字段,filebeat處理時會把@timestamp字段值替換爲filebeat讀取到該行數據的當前UTC時間。



6、實戰運用


架構一

wKiom1e7uC6D7Us_AABlKRVNxjw054.png


nginx 日誌格式配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        log_format json  '{"@timestamp":"$time_iso8601",'
                  '"slbip":"$remote_addr",'
                  '"clientip":"$http_x_forwarded_for",'
                  '"serverip":"$server_addr",'
                  '"size":$body_bytes_sent,'
                  '"responsetime":$request_time,'
                  '"domain":"$host",'
                  '"method":"$request_method",'
                  '"requesturi":"$request_uri",'
                  '"url":"$uri",'
                  '"appversion":"$HTTP_APP_VERSION",'
                  '"referer":"$http_referer",'
                  '"agent":"$http_user_agent",'
                  '"status":"$status"}' ;


filebeat 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
filebeat:
   # List of prospectors to fetch data.
   prospectors:
     # Each - is a prospector. Below are the prospector specific configurations
 
     -
       paths:
         /alidata/log/nginx/access/access .log.json
 
       input_type: log
 
       document_type: nginxacclog
       
 
############################# Output ##########################################
 
output:            
  
   logstash:
     hosts: [ "10.160.8.221:5044" ]
 
# 其餘部分配置省略。


logstash 配置 (此處logstash用於接收filebeat的數據,而後轉存redis)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
input {
     beats {
     port => 5044
     codec =>  "json"
}
 
}
 
 
filter {
     if  [ type ] ==  "nginxacclog"  {
     geoip {
         source  =>  "clientip"
         target =>  "geoip"
         database =>  "/u01/elk/logstash/GeoLiteCity.dat"
         add_field => [  "[geoip][coordinates]" , "%{[geoip][longitude]}"  ]
         add_field => [  "[geoip][coordinates]" , "%{[geoip][latitude]}"  ]
}
 
     mutate {
         convert => [  "[geoip][coordinates]" , "float"  ]
 
}
 
}
 
}
 
 
output{
     if  [ type ] ==  "nginxacclog"  {
     redis {
         data_type =>  "list"
         key =>  "nginxacclog"
         host =>  "127.0.0.1"
         port =>  "26379"
         password =>  "123456"
         db =>  "0"
 
}
 
}
 
     if  [ type ] ==  "messages"  {
     redis {
         data_type =>  "list"
         key =>  "messages"
         host =>  "127.0.0.1"
         port =>  "26379"
         password =>  "123456"
         db =>  "0"
 
}
 
}
 
}


logstash 配置 (此處logstash用於讀取redis list中的數據,而後轉存elasticsearch)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
相關文章
相關標籤/搜索