Logstash——Logstash從Redis中收集數據並輸出

之前關於logstash數據源的文章,可以看這裏

Logstash——配置介紹,數據輸入配置(input)
Logstash——Logstash從MySQL中收集數據並輸出添加

之前介紹過如何使用文件系統通過Logstash將數據推送至elasticsearch來實現日誌的線上分析。而這次介紹的是使用redis作爲數據源進行數據操作的方法

Logstash-Redis數據源配置

最開始先看下Redis作爲數據來源時支持的所有配置

input {
  jdbc {
	### 使用EVAL從Redis返回的事件數,此屬性僅在list模式下起作用。
    batch_count => 
	### 以“舊名稱”⇒“新名稱”的形式配置重命名的redis命令。
	command_map => 
	### 指定列表或頻道。["list", "channel", "pattern_channel"]
	data_type => 
	### Redis數據庫號。
	db => 
	### Redis服務器的主機名。
	host => 
	### Redis服務器的unix套接字路徑。
	path => 
	### Redis列表或通道的名稱。
	key => 
	### 用於驗證的密碼。默認情況下沒有身份驗證。要連接的端口。
	password => 
	### 要連接的端口。
	port => 
	### 啓用SSL支持。
	ssl => 
	### 運行線程
	threads => 
	### 超時時間
	timeout => 
  }
}

完成Logstash從MySQL中收集數據

安裝Logstash

這裏可以看之前的文章安裝Logstash並完成一個簡單的日誌收集功能

Logstash配置

redis作爲數據來源的數據監聽模式

Redis的輸入插件,提供了一個data_type,不同的參數設置會採用不同的redis命令操作。目前可配置的值爲:

參數值 redis模式
list BLPOP
channel SUBSCRIBE
pattern_channel PSUBSCRIBE
  1. list

其中list,相當於隊列;

  1. channel 和 pattern_channel

channel相當於發佈訂閱的某個特定的頻道;pattern_channel相當於發佈訂閱某組頻道。

list模式

list模式其實就是隊列模式,我們向redis某個key中插入數據,然後logstash持續的從此key中取出數據

JAVA代碼向redis插入數據

public void pushJob(String value) {
        BoundListOperations ops = redisTemplate.boundListOps("key");
        ops.leftPush(value);
}

如果使用list模式作爲redis的數據模式的話可以使用下面配置

input {
	redis {
		key => "logstash-list"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "one"
	}
}
output {
	elasticsearch {
		hosts => "http://localhost:9200"
		index => "redis_test_list_one"
		user => exception_user # 此爲es的賬號,應用配置時刪除註釋
		password => exception # 此爲es的密碼,應用配置時刪除註釋
	}
  stdout {}
}

當應用list模式的時候,此時監聽的隊列同一時間只可能有一個logstash管道獲得數據,關於這個效果我們可以啓動兩個logstash來進行試驗,當然還有一個更簡單的方法。

下面配置中定義了兩個redis的數據源都指向了一個redis的同一個key。通過type來標記不同的數據通道

input {
	redis {
		key => "logstash-list"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "one"
	}
	redis {
		key => "logstash-list"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "list"
		type  => "two"
	}
}
output {
		stdout { codec => rubydebug }
}	

在啓動了上面配置後,當向key插入一條數據後,控制檯可以看到下面效果:

在這裏插入圖片描述

新增的數據,可能出現在one數據通道也可能two數據通道但是只會在其中一個通道出現。並且數據最終被哪個數據通道所獲得也是隨機的。

channel模式

channel相當於發佈訂閱的某個特定的頻道。這裏需要使用redis的channel的方式保存數據。關於JAVA代碼向Redis通道保存數據我之前有介紹過 Redis實現簡單的發佈訂閱以及配置序列化方式

如果使用channel模式作爲redis的數據模式的話可以使用下面配置

input {
	redis {
		key => "logstash-channel"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "channel"
		type  => "one"
	}
}
output {
	elasticsearch {
		hosts => "http://localhost:9200"
		index => "redis_test_list_one"
		user => exception_user # 此爲es的賬號,應用配置時刪除註釋
		password => exception # 此爲es的密碼,應用配置時刪除註釋
	}
  stdout {}
}

和上面一樣我們想測試channel在多個實例監聽其channel的時候可以使用類似配置

input {
	redis {
		key => "logstash-channel"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "channel"
		type  => "one"
	}
	redis {
		key => "logstash-channel"
		host => "localhost"
		password => "root"
		port => 6379
		db => "0"
		data_type => "channel"
		type  => "two"
	}
}
output {
  stdout { codec => rubydebug }
}

此時向redis添加數據,數據會出現在logstash的兩個通道中

在這裏插入圖片描述

關於redis的文字編碼

需要注意,當使用java向redis中插入數據時候,可能因爲數據或者key編碼問題。導致key中出現\xac\xed\x00\x05t這樣的亂碼,或者數據爲無法識別的內容時可以參考我之前介紹redis數據序列化的內容。將數據進行處理。
Redis實現簡單的發佈訂閱以及配置序列化方式

關於redis作爲數據源個人看法

和之前介紹的MySql相比,redis提供的隊列以及發佈訂閱的功能可以應用的場景更加豐富。一個輕量級的消息隊列,在對數據安全要求不是非常高的情況下可以滿足絕大多數的需求了。對一些日誌的轉發、一些較大數據的分析都可以通過redis來作爲數據源經過logstash引入的ES進行分析或者其他地方進行處理。


個人水平有限,上面的內容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關內容。假如我的這篇內容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。

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