elk 第二篇 , 为elk加入redis, 替换下beats(个人感觉不错2)
為elk加入redis, 替換下beats
這是elk的第二篇文章
- 編譯安裝日志分析平臺 elk + filebeat
使用場景
數(shù)據(jù)不可控時 ,例如日志不是文件 , 而是由TCP直接推送到elk的 ,filebeats就無法使用了當(dāng)然redis是可以和beats一起使用的, 例如beats讀取文件解析后輸出到redis ,再由elk正常流程處理, 具體的這里不做討論
優(yōu)勢
在通過logstash之前走redis , 分散壓力不至于logstash負(fù)載太高 ,處理緩慢甚至宕機(jī)流程圖
elk
請看第一篇文章 :?編譯安裝日志分析平臺 elk + filebeatredis
什么是redis
Redis是一個支持多種數(shù)據(jù)結(jié)構(gòu)的開源(BSD許可)內(nèi)存型數(shù)據(jù)庫 , 除此之外它甚至可以被用作持久化數(shù)據(jù)庫,緩存器和消息隊列?查看更多如何安裝redis
極其簡單 ,使用yum或下載源碼make即可 , 不再贅述
- yum安裝
- 源碼安裝
配置redis
可以不配置 ,但是筆者需要從外部鏈接redis ,所以把監(jiān)聽地址修改為局域網(wǎng)IP?
大家按需執(zhí)行即可
配置文件位置:?
yum :?/etc/redis.conf?
源碼 :?/opt/redis-4.0.11/redis.conf
啟動redis
這里也分兩種?
yum安裝啟動方法
源碼安裝啟動方法
/opt/redis-4.0.11/src/redis-server /opt/redis-4.0.11/redis.conf &啟動完成就像這樣 , 然后回車即可
配置elk
和第一篇中為elk加入beats一樣 , 只需要編輯logstash的配置文件就可以了
修改logstash的輸入輸出配置
為了避免你已經(jīng)手動修改了配置文件 , 我們不再使用sed為改為手動修改配置文件使用你喜愛的編輯器打開 /opt/logstash-6.3.2/config/logstash-io.conf
在input代碼塊中增加如下內(nèi)容并保存
redis {key => "redis_log"data_type => "list"type => "redis"host => "192.168.1.147"port => "6379"threads => 12# 如果存進(jìn)redis的數(shù)據(jù)是json才需要這一行codec => "json" }在input代碼塊的同級增加如下內(nèi)容并保存
這里是處理nginx日志的過濾器 , 稍候會講里面的grok語法 filter {if [type] == "redis" {grok {match => { "message" => "%{IPORHOST:remote_ip} - - \[%{HTTPDATE:datetime}\] \"(:?%{WORD:request_method} %{NOTSPACE:uri}) (:?HTTP/%{NUMBER:http_version})\" (:?%{NUMBER:http_code}) (:?%{NUMBER:contents_length}) \"(:?%{NOTSPACE:domail})\" \"(:?%{DATA:ua}) \((:?%{DATA:os})%{NUMBER:os_version}\) %{DATA}\) %{DATA:browser}/%{DATA:browser_version} (:?%{DATA:safari_version})\"" }}geoip {source => "client_ip"}date {match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]}} }修改output代碼為如下這樣
這為了按類型劃分索引 output {if [type] == "redis" {elasticsearch {hosts => ["192.168.1.147:9200"]manage_template => falseindex => "redis-%{+YYYY.MM.dd}"}} else if [type] == "beats" {elasticsearch {hosts => ["192.168.1.147:9200"]manage_template => falseindex => "beats-%{+YYYY.MM.dd}"}} else {elasticsearch {hosts => ["192.168.1.147:9200"]manage_template => falseindex => "unkown-%{+YYYY.MM.dd}"}} }最終配置文件大概會是這個樣子
input {beats {port => 5044type => "beats"}redis {key => "redis_log"data_type => "list"type => "redis"host => "192.168.1.147"port => "6379"threads => 12codec => "json"} }filter {if [type] == "redis" {grok {match => { "message" => "%{IPORHOST:remote_ip} - - \[%{HTTPDATE:datetime}\] \"(:?%{WORD:request_method} %{NOTSPACE:uri}) (:?HTTP/%{NUMBER:http_version})\" (:?%{NUMBER:http_code}) (:?%{NUMBER:contents_length}) \"(:?%{NOTSPACE:domail})\" \"(:?%{DATA:ua}) \((:?%{DATA:os})%{NUMBER:os_version}\) %{DATA}\) %{DATA:browser}/%{DATA:browser_version} (:?%{DATA:safari_version})\"" }}geoip {source => "client_ip"}date {match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]}} }output {if [type] == "redis" {elasticsearch {hosts => ["192.168.1.147:9200"]manage_template => falseindex => "redis-%{+YYYY.MM.dd}"}} else if [type] == "beats" {elasticsearch {hosts => ["192.168.1.147:9200"]manage_template => falseindex => "beats-%{+YYYY.MM.dd}"}} else {elasticsearch {hosts => ["192.168.1.147:9200"]manage_template => falseindex => "unkown-%{+YYYY.MM.dd}"}} }然后和第一篇一樣 , 使用screen啟動elk
screen -S elk /opt/elasticsearch-6.3.2/bin/elasticsearch & \ /opt/logstash-6.3.2/bin/logstash -f /opt/logstash-6.3.2/config/logstash-io.conf & \ /opt/kibana-6.3.2-linux-x86_64/bin/kibana &# 本次不切換回去了 # Ctrl A + c如果配置沒有問題的話, 最后會輸出12行?[logstash.inputs.redis ] Registering Redis...?這樣的句子
會輸出12行因為我們在input部分指定了threads為12然后我們再看一看熟悉的kibana , 并且做一些事情
如果啟動完成但是看不到kibana ,就回到root關(guān)閉防火墻?systemctl stop firewalld測試elk + redis
任何語言的redis客戶端都可以向redis推送數(shù)據(jù)
測試邏輯
鏈接到redis后, 向redis_log這個list結(jié)構(gòu)循環(huán)推送下面的日志內(nèi)容 127.0.0.1 - - [21/Aug/2018:06:00:32 +0800] "GET?/api/index/game-type HTTP/1.0" 200 269 "http://yooooooooo.com/"?"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"以php的predis客戶端為例向redis推送數(shù)據(jù)
predis下載地址 <?php use Predis\Client; require __DIR__ . '/src/Autoloader.php';Predis\Autoloader::register();// 使用predis來鏈接redis $client = new Client('tcp://192.168.1.147:6379'); // 開始一個死循環(huán) while (true) {// 每次向redis的redis_log這個list推送10000條數(shù)據(jù)foreach (range(0 ,10000) as $value) {$client->lpush('redis_log' ,'127.0.0.1 - - [21/Aug/2018:06:00:32 +0800] "GET /api/index/game-type HTTP/1.0" 200 269 "http://yooooooooo.com/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"');echo "$value \n";}// 推送完成休息一秒 sleep(1); }運(yùn)行這個php例子
php ./pushToRedis.php假設(shè)鏈接沒有問題 , 你會在elk那個終端里看到輸出 , 我這里因為配置了json卻輸入的字符串 , 才會輸出的全是錯誤
在kibana建立redis索引
來到 management 部分一路下一步 ,創(chuàng)建完成
回到首頁(一定到確保左上角是redis... 如果不是就點(diǎn)名字旁邊的按鈕來切換到redis) ,然后打開自動刷新 , 數(shù)據(jù)就會源源不斷的渲染到頁面上了
并且我們發(fā)現(xiàn) , 左側(cè)是篩選條件和右側(cè)的數(shù)據(jù)都多了很多字段 , 這就是修改配置文件時 ,加入的filter段的功勞
大功告成
來源:https://segmentfault.com/a/1190000016145885
總結(jié)
以上是生活随笔為你收集整理的elk 第二篇 , 为elk加入redis, 替换下beats(个人感觉不错2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 沪深股市开盘时间和收盘时间 注意不
- 下一篇: P2P爆雷后董事长开直播怎么回事 回应爱