簡介:
第二次嘗試 ELK 記錄...
工作流程:
1、客戶端的 Logstash 將日志信息采集到之后傳輸給 Redis 做消息隊列
2、然后服務端的 Logstash 將日志從 Redis 中取出之后根據日志規則將數據序列化( 方便查詢 )完成后存入 Elasticsearch 文本數據庫中
3、最后通過 Kibana 展示數據,可以根據序列化好的數據做查詢過濾、數據聚合等操作
環境描述:
192.168.214.20 服務端( Logstash 、Elasticsearch 、Redis 、Nginx 、Kibana4 )
192.168.214.30 客戶端( Logstash )
一、客戶端操作
shell > yum -y install java
1、安裝 Logstash
shell > cd /usr/local/src ; wget https://download.elastic.co/logstash/logstash/logstash-1.5.2.tar.gz shell > tar zxf logstash-1.5.2.tar.gz shell > mv logstash-1.5.2 /usr/local/logstash
2、編寫配置文件
shell > vim /usr/local/logstash/logstash.conf # Logstash.conf input { file { type => "apache_access" path => ["/tmp/access.log"] start_position => "beginning" } } output { # stdout { # codec => rubydebug # } redis { host => "192.168.214.20" port => 6379 data_type => "list" key => "logstash-redis" } }
## input 段定義從哪里采集日志,beginning 代表服務啟動時從日志文件頭部開始導入日志,而不是監聽新生成的日志( 當然導入完成也會變成監聽新生成的日志 )
## output 段定義將日志數據輸送到指定的 Redis 服務中,類型為 list ,key 為 logstash-redis
## stdout 段是為了簡單驗證有沒有采集到日志數據( 效果:會在終端輸出日志信息,rubydebug 為輸出格式,可以不設置 codec 看看有什么區別 )
3、檢查配置文件
shell > /usr/local/logstash/bin/logstash -f /usr/local/logstash/logstash.conf -t
Configuration OK
## 啟動前先檢查一下配置文件是否正確
## OK ,客戶端配置完畢,暫時不啟動( 因為服務端的 Redis 服務還沒有,現在啟動會報錯:傳輸失敗 )
二、服務端操作
1、安裝 Elasticsearch
shell > cd /usr/local/src ; wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.6.0.tar.gz shell > tar zxf elasticsearch-1.6.0.tar.gz shell > mv elasticsearch-1.6.0 /usr/local/elasticesearch
2、配置 Elasticsearch
shell > vim /usr/local/elasticesearch/config/elasticsearch.yml cluster.name: my_es node.name: "Master"
## cluster.name 集群名稱,局域網內只要這個名稱相同,那么就可以自動組成一個集群
## nod.name 節點名稱
## 這些都是可以不用修改的,采用默認參數即可( 要知道,Elasticsearch 是一個數據庫,所以功能遠遠不止這些 )
shell > vim /usr/local/elasticesearch/bin/elasticsearch.in.sh if [ "x$ES_MIN_MEM" = "x" ]; then ES_MIN_MEM=64m fi if [ "x$ES_MAX_MEM" = "x" ]; then ES_MAX_MEM=256m
## Elasticsearch 可用的最大、最小內存數( 根據實際情況來吧 )
3、啟動 Elasticsearch
shell > /usr/local/elasticesearch/bin/elasticsearch -d shell > netstat -anpt | grep 9200 tcp 0 0 :::9200 :::* LISTEN 1263/java
## -d 后台運行,默認監聽 TCP 9200 端口
shell > curl -X GET 127.0.0.1:9200 { "status" : 200, "name" : "Master", "cluster_name" : "my_es", "version" : { "number" : "1.6.0", "build_hash" : "cdd3ac4dde4f69524ec0a14de3828cb95bbb86d0", "build_timestamp" : "2015-06-09T13:36:34Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" }
## 這是一些基本信息
shell > curl -X GET 127.0.0.1:9200/_cat =^.^= /_cat/allocation /_cat/shards /_cat/shards/{index} /_cat/master /_cat/nodes /_cat/indices /_cat/indices/{index} /_cat/segments /_cat/segments/{index} /_cat/count /_cat/count/{index} /_cat/recovery /_cat/recovery/{index} /_cat/health /_cat/pending_tasks /_cat/aliases /_cat/aliases/{alias} /_cat/thread_pool /_cat/plugins /_cat/fielddata /_cat/fielddata/{fields}
## 怎么說呢,所支持的一些指令吧
shell > curl -X GET 127.0.0.1:9200/_cat/master 6LEg6Ap4Qq-9HYUbEoy9Bw localhost.localdomain 127.0.0.1 Master
## 例如查看 master 信息
shell > curl -X GET 127.0.0.1:9200/_cat/master?v id host ip node 6LEg6Ap4Qq-9HYUbEoy9Bw localhost.localdomain 127.0.0.1 Master
## 結尾加了 ?v 可以顯示各字段意思
4、Elasticsearch 安裝插件
shell > /usr/local/elasticesearch/bin/plugin -i mobz/elasticsearch-head
## 可以使用 plugin 命令跟 -i 參數,自動下載並安裝插件
## 如果因網絡問題不能這樣安裝時,可以將插件包手動下載到機器上,使用 ./plugin -u file:///usr/local/src/插件包.zip -i head 這樣安裝
shell > /usr/local/elasticesearch/bin/plugin -l Installed plugins: - head
## 使用 -l 可以列出已經安裝過的插件
## 訪問 URL : http://192.168.214.20:9200/_plugin/head 查看插件頁面,記得防火牆開啟 TCP 9200 端口
shell > /usr/local/elasticesearch/bin/plugin -i lukas-vlcek/bigdesk
## 這是一個用來監控集群狀態的插件,如: CPU 、內存 、索引數據、搜索情況、HTTP 連接數等
## 手動下載時,例如第一個插件的地址就是 https://github.com/mobz/elasticsearch-head
5、Redis
shell > cd /usr/local/src ; wget http://download.redis.io/releases/redis-3.0.2.tar.gz shell > tar zxf redis-3.0.2.tar.gz shell > cd redis-3.0.2 ; make ; make install shell > mkdir /usr/local/redis shell > cp /usr/local/src/redis-3.0.2/redis.conf /usr/local/redis/ shell > sed -i '/daemonize/s/no/yes/' /usr/local/redis/redis.conf shell > sed -i 's#dir ./#dir /usr/local/redis#' /usr/local/redis/redis.conf shell > redis-server /usr/local/redis/redis.conf shell > redis-cli ping PONG
## Redis 已經啟動成功,記得防火牆開放 TCP 6379 端口,不然客戶端收集到的日志信息傳輸不過來
6、先來個小測試
1> 客戶端啟動 Logstash
shell > /usr/local/logstash/bin/logstash -f /usr/local/logstash/logstash.conf &
2> 客戶端導入日志( 找線上的日志導入到本地指定的日志文件中 )
3> 服務端查看 Redis 能否接收到數據
shell > redis-cli 127.0.0.1:6379> keys * 1) "logstash-redis"
## 可以看到有一個名為 logstash-redis 的 key( 正是客戶端定義的 key )
127.0.0.1:6379> lrange logstash-redis 0 -1 1) "{\"message\":\"121.42.0.30 - - [17/Jul/2015:18:01:21 +0800] \\\"POST /include/fckeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=FileUpload&Type=File&CurrentFolder=%2F HTTP/1.1\\\" 404 279\",\"@version\":\"1\",\"@timestamp\":\"2015-07-20T15:31:46.914Z\",\"host\":\"localhost.localdomain\",\"path\":\"/tmp/access.log\",\"type\":\"apache_access\"}" 2) "{\"message\":\"121.42.0.30 - - [17/Jul/2015:18:01:23 +0800] \\\"POST /plugins/fckeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=FileUpload&Type=File&CurrentFolder=%2F HTTP/1.1\\\" 404 279\",\"@version\":\"1\",\"@timestamp\":\"2015-07-20T15:31:46.941Z\",\"host\":\"localhost.localdomain\",\"path\":\"/tmp/access.log\",\"type\":\"apache_access\"}"
## 使用指令查看這個 key 中的數據,0 -1 表示從頭到尾全部查看,最終發現有 89 條數據
## 而此時在客戶端上執行 wc -l < /tmp/access.log 發現得到的結果也是 89 條,說明數據傳輸沒有問題
7、Logstash
## 安裝方式跟客戶端一樣,只是配置文件有所不同而已
shell > vim /usr/local/logstash/logstash.conf # Logstash.conf input { redis { host => "127.0.0.1" port => 6379 data_type => "list" key => "logstash-redis" type => "redis-input" } } filter { grok { match => { "message" => "%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_request})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-)" } } } output { stdout { codec => rubydebug } # elasticsearch { # host => "127.0.0.1" # port => 9200 # protocol => 'http' # } }
## input 段定義從 Redis 中取數據
## output 段定義將序列化好的數據寫入本機的 Elasticsearch 中( 上面注釋掉是為了查看規則是否匹配成功 )
## filter 段定義將取出的數據序列化( 根據日志格式編寫匹配規則 )
141.212.122.34 - - [18/Jul/2015:14:54:51 +0800] "GET /x HTTP/1.1" 400 226
## 這是我的日志格式,非常簡單,匹配規則每個 %{} 對應一個字段,要完全匹配才會出結果,否則匹配失敗
## 編寫規則時可以根據這里的定義自由組合,地址:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
## 上面的一長串其實直接定義為 match => { "%{COMMONAPACHELOG}" } 即可,單獨寫出來是為了記錄自由組合時格式是怎么樣的
shell > /usr/local/logstash/bin/logstash -f /usr/local/logstash/logstash.conf -t
Configuration OK
shell > /usr/local/logstash/bin/logstash -f /usr/local/logstash/logstash.conf &
## 配置文件沒有問題,那么就啟動
{ "message" => "121.42.0.30 - - [17/Jul/2015:18:02:47 +0800] \"GET /phpMyAdmin/scripts/setup.php HTTP/1.1\" 404 226", "@version" => "1", "@timestamp" => "2015-07-20T15:31:47.963Z", "host" => "localhost.localdomain", "path" => "/tmp/access.log", "type" => "apache_access", "client_ip" => "121.42.0.30", "ident" => "-", "auth" => "-", "timestamp" => "17/Jul/2015:18:02:47 +0800", "verb" => "GET", "request" => "/phpMyAdmin/scripts/setup.php", "http_version" => "1.1", "response" => "404", "bytes" => "226" }
## 截取一段輸出信息來看,日志中的各項指標都匹配到了,說明規則沒有問題
## 那么接下來就可以將 stdout 段注釋掉,將 Elasticsearch 段注釋取消,將結果寫到 Elasticsearch 中了( 修改配置文件要重啟服務,這個不用多說 )
shell > curl -X GET 127.0.0.1:9200/_cat/indices
## 重啟完服務查看 Elasticsearch 中有沒有索引時,發現是空的!
## 這是正常現象,如果你現在去看 Redis 時,就會發現也是空值,因為 Redis 作為消息隊列,Logstash 讀取完( 拿走 ) Redis 中的數據,Redis 自然就成了空值。
## 再次導入一些日志信息測試
shell > curl -X GET 127.0.0.1:9200/_cat/indices yellow open logstash-2015.07.20 5 1 31 0 49.4kb 49.4kb
## 可以看到 Elasticsearch 已經生成了索引( 有數據了 )
shell > curl -X GET 127.0.0.1:9200/_cat/shards?v index shard prirep state docs store ip node logstash-2015.07.20 2 p STARTED 7 10kb 127.0.0.1 Master logstash-2015.07.20 2 r UNASSIGNED logstash-2015.07.20 0 p STARTED 6 10.2kb 127.0.0.1 Master logstash-2015.07.20 0 r UNASSIGNED logstash-2015.07.20 3 p STARTED 6 9.6kb 127.0.0.1 Master logstash-2015.07.20 3 r UNASSIGNED logstash-2015.07.20 1 p STARTED 7 10.1kb 127.0.0.1 Master logstash-2015.07.20 1 r UNASSIGNED logstash-2015.07.20 4 p STARTED 5 9.3kb 127.0.0.1 Master logstash-2015.07.20 4 r UNASSIGNED
## 這樣再來看看,更清楚了
8、Kibana
shell > cd /usr/local/src ; wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz shell > tar zxf kibana-4.1.1-linux-x64.tar.gz shell > mv kibana-4.1.1-linux-x64 /usr/local/kibana shell > vim /usr/local/kibana/config/kibana.yml elasticsearch_url: "http://127.0.0.1:9200"
## 這里也沒什么需要改的,確認一下從哪讀取數據
shell > /usr/local/kibana/bin/kibana > /usr/local/kibana/kibana.log & netstat -anpt | grep 5601 tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 1881/node
## 啟動服務,默認監聽 TCP 5601 端口,防火牆怎么做不用說了吧
## 訪問 URL : http://192.168.214.20:5601
> 第一次訪問要求創建一個索引( 沒有導入日志是不能創建索引的 ),可以使用默認的 logstash-* ,也可以使用事件時間來創建索引( 能用時間匹配的情況下 )
> 接下來就可以查看日志信息了,第一個界面簡單展示,第二個界面可以創建圖表,第三個界面可以將創建好的多個圖表放在一起,第四個界面是配置頁,創建索引就在這里
## 頭次瀏覽可能會提示搜索不到信息,在右上角選擇合適的時間區間應該就可以了