Logstash 支持不同的數據源頭,在數據從源頭到目標的過程中,Logstash提供了對數據處理的操作。對數據的操作需要配置filter的內容。
關於安裝Logstash的安裝可以看之前的文章安裝Logstash並完成一個簡單的日誌收集功能
對事件中的數據進行處理
很多時候我們傳入logstash的原始數據並不是我們所需要傳輸的最終數據,這個時候需要我們隊數據進行處理。而filter用來進行數據處理的插件主要是下面幾個
- alter:主要根據元素中的值,對其進行重新賦值
- mutate:主要對元素中的值,進行值的修改
- translate:一種字典操作,將元素中的值,替換爲字典中的內容
- truncate:對超長字符串進行截短工作
alter
默認情況下未捆綁,需要使用bin/logstash-plugin install logstash-filter-alter進行安裝
alter過濾器使您可以對時間中字段進行常規更改。
可配置參數
參數 | 作用 |
---|---|
coalesce | 給定一組參數,第一個元素爲目標字段,它的值將被設置爲後續多個參數中第一個非空的表達式 |
condrewrite | 給定一組參數,第一個元素爲目標字段,假如它的值等於後一位參數的值,則它的值被設置爲第三位的參數 |
condrewriteother | 給定一組參數分別是:目標字段、預設值、修改的字段、修改的值。目標字段的內容等於預期的值,則將該字段的內容更改爲指定的值。 |
參數介紹
使用的例子
配置
filter {
json {
source => "message"
}
alter {
coalesce => [
"alter_field","%{desc}","%{name}"
]
condrewrite => [
"name","test","condrewrite test"
]
condrewriteother => [
"name","condrewriteother test","age",999
]
}
}
測試數據
- coalesce
coalesce會將指定參數賦值爲第一個不爲空的參數的值。所以在使用下面參數請求logstash的時候因爲不存在desc
的內容,此時alter_field
會被賦值爲那麼的結果
{"name":"coalesce test"}
最終控制檯結果
{
"@timestamp" => 2020-05-17T05:15:28.509Z,
"@version" => "1",
"name" => "coalesce test",
"alter_field" => "coalesce test",
"type" => "alter"
}
- condrewrite
condrewrite類似一種參數轉換,當目標字段等於某個值就被轉換成另外一個內容。
{
"name" => "test",
"age" => 10
}
使用上面的數據, 在經過logstash的時候,因爲name參數的匹配會使得其內容發生變化,最終可以得到下面的結果
{
"@timestamp" => 2020-05-17T05:36:04.872Z,
"@version" => "1",
"name" => "condrewrite test",
"type" => "alter2",
"age" => 10
}
- condrewriteother
condrewriteother和condrewrite不同之處在於,condrewrite只是修改進行參數判斷的元素,而condrewriteother是當目標參數符合判斷時,其可以修改另外一個參數的值
比如使用下面參數
{"age":5,"name":"condrewriteother test"}
此參數最終會被轉換爲下面的結果
{
"@timestamp" => 2020-05-17T05:41:19.012Z,
"@version" => "1",
"name" => "condrewriteother test",
"type" => "alter3",
"age" => "999"
}
ps.需要注意的是這裏age被設置成了字符串格式。
mutate
允許對字段執行一般的修改。您可以在事件中重命名、刪除、替換和修改字段。
可配置參數
列1 | 列2 |
---|---|
convert | 將字段的值轉換爲其他類型,例如將字符串轉換爲整數 |
copy | 將現有字段複製到另一個字段。 |
gsub | 將正則表達式與字段值匹配,然後將所有匹配項替換爲替換字符串。 |
join | 用分隔符連接數組。對非數組字段不執行任何操作。 |
lowercase | 將字符串轉換爲其小寫形式 |
merge | 合併兩個數組或哈希字段。字符串字段將自動轉換爲數組 |
coerce | 設置存在但爲空的字段的默認值 |
rename | 重命名一個或多個字段 |
replace | 用新值替換字段的值。 |
split | 使用分隔符將字段拆分爲數組。 |
strip | 從字段中刪除空格。僅適用於前後空白字段。 |
update | 用新值更新現有字段。如果該字段不存在,則不會採取任何措施。 |
uppercase | 將字符串轉換爲對應的大寫字母 |
capitalize | 將字符串轉換爲它的大寫等價物 |
使用的例子
配置
filter {
mutate {
split => {"split_field"=> "."}
join => { "join_field" => "," }
uppercase => [ "uppercase_field"]
capitalize => [ "capitalize_field"]
}
}
測試數據
現在結合上面的配置使用下面的測試數據
{
"split_field": "abc.def.123.456",
"uppercase": "sendMutate",
"join_field": [
"ab",
"cd",
"ef"
],
"capitalize": "sendMutate"
}
最終可以得到下面的結果
{
"split_field" => [
[0] "abc",
[1] "def",
[2] "123",
[3] "456"
],
"uppercase_field" => "SENDMUTATE",
"capitalize_field" => "Sendmutate",
"@timestamp" => 2020-05-17T06:00:55.280Z,
"@version" => "1",
"type" => "mutate",
"join_field" => "ab,cd,ef"
}
ps. 這裏需要注意一下,在官方的文檔中關於split
提供了兩個demo分別是下面內容,而實際使用中兩個格式都是可以使用的
filter {
mutate {
split => { "fieldname" => "," }
}
}
mutate {
split => ["hostname", "."]
}
結果及解釋
translate
使用已配置的散列和/或文件來確定替換值的工具。將事件中的特殊key替換爲字典中的對應內容
可配置參數
列1 | 列2 |
---|---|
destination | 轉換結果存放的字段 |
dictionary | 進行數據轉換的字典 |
dictionary_path | 外部詞典文件的完整路徑 |
exact | |
fallback | 如果事件中的key沒有匹配成功,則使用此字段的值作爲默認值 |
field | |
iterate_on | 當您需要對處理的值是可變大小的數組時,此設置中指定字段名稱。此設置引入兩種模式,1)當值是字符串數組時,2)當值是對象數組時 |
override | 如果指定的字段已存在,此參數設置是否跳過還是隻想覆蓋操作 |
refresh_interval | 配置logstash以多久的間隔去刷新配置內容 |
regex | 字典使用正則表達式匹配 |
refresh_behaviour | 指定字段刷新策略,1.新舊字典合併;2.舊字段完全覆蓋新字典 |
使用的例子
配置
filter {
translate {
iterate_on => "area_list"
field => "area"
destination => "area_des"
dictionary => {
"CN" => "China"
"FR" => "France"
"US" => "America"
"RU" => "Russia"
"GB" => "britain"
}
fallback => "Unknown"
}
}
測試數據
使用下面的格式對字典庫中匹配和不匹配的參數都嘗試發出請求。
{ "area" => "GB",}
結果
最終可以得到下面的結果,此時根據area中的內容在area_description
字段中填充字典中的值。
{
"area" => "GB",
"@timestamp" => 2020-05-17T04:53:39.511Z,
"@version" => "1",
"area_description" => "britain",
"type" => "translate1"
}
{
"area" => "RU",
"@timestamp" => 2020-05-17T04:53:39.512Z,
"@version" => "1",
"area_description" => "Russia",
"type" => "translate1"
}
{
"area" => "US",
"@timestamp" => 2020-05-17T04:53:39.512Z,
"@version" => "1",
"area_description" => "America",
"type" => "translate1"
}
{
"area" => "FR",
"@timestamp" => 2020-05-17T04:53:39.513Z,
"@version" => "1",
"area_description" => "France",
"type" => "translate1"
}
{
"area" => "CN",
"@timestamp" => 2020-05-17T04:53:39.513Z,
"@version" => "1",
"area_description" => "China",
"type" => "translate1"
}
{
"area" => "UK",
"@timestamp" => 2020-05-17T04:53:39.481Z,
"@version" => "1",
"area_description" => "nuknow",
"type" => "translate1"
}
數組數據的字典庫匹配
對於一些數組格式的數據比如下面這種
{"area_list":["CN","FR","US","RU","GB","UK"]}
可以使用下面的配置進行數據格式的數據進行字典匹配
translate {
iterate_on => "area_list"
field => "area_list"
destination => "area_name_list"
dictionary => {
"CN" => "China"
"FR" => "France"
"US" => "America"
"RU" => "Russia"
"GB" => "britain"
}
fallback => "Unknown"
}
輸出的結果同樣是個數組格式
{
"@version" => "1",
"area_name_list" => [
[0] "China",
[1] "France",
[2] "America",
[3] "Russia",
[4] "britain",
[5] "Unknown"
],
"area_list" => [
[0] "CN",
[1] "FR",
[2] "US",
[3] "RU",
[4] "GB",
[5] "UK"
],
"type" => "translate2"
}
嵌套數據的字典庫匹配
而對於嵌套的對象數組格式
{
"area_list": [
{
"area": "CN"
},
{
"area": "FR"
},
{
"area": "US"
},
{
"area": "RU"
},
{
"area": "GB"
},
{
"area": "UK"
}
]
}
可以使用下面配置
translate {
iterate_on => "area_list"
field => "area"
destination => "area_des"
dictionary => {
"CN" => "China"
"FR" => "France"
"US" => "America"
"RU" => "Russia"
"GB" => "britain"
}
fallback => "Unknown"
}
可以得到下面的結果
{
"@version" => "1",
"area_list" => [
[0] {
"area" => "CN",
"area_des" => "China"
},
[1] {
"area" => "FR",
"area_des" => "France"
},
[2] {
"area" => "US",
"area_des" => "America"
},
[3] {
"area" => "RU",
"area_des" => "Russia"
},
[4] {
"area" => "GB",
"area_des" => "britain"
},
[5] {
"area" => "UK",
"area_des" => "Unknown"
}
],
"type" => "translate3"
}
truncate
用來截取超過一定長度的字符串,這將截斷字節值,而不是字符數。
可配置參數
列1 | 列2 |
---|---|
fields | 需要截斷的字段 |
length_bytes | 超過此長度的字段將被截斷爲該長度 |
使用的例子
配置
filter {
truncate {
fields => "message"
length_bytes => 10
}
}
測試數據
使用下面的數據經過logstash其長度會被截取掉,
abcdefghijabcdefghijaaaa
最終我們只能的到這樣的結果。
{
"@timestamp" => 2020-05-17T06:08:34.899Z,
"@version" => "1",
"message" => "abcdefghij",
"type" => "truncate",
"tags" => [
[0] "_jsonparsefailure"
]
}
需要注意官方文檔中冶專門強調
This truncates on bytes values, not character count. In practice, this should mean that the truncated length is somewhere between length_bytes and length_bytes - 6
其截取的是字節值而不是字符數,所以在對中文進行截取的時候需要注意進行對應的調整。
個人水平有限,上面的內容可能存在沒有描述清楚或者錯誤的地方,假如開發同學發現了,請及時告知,我會第一時間修改相關內容。假如我的這篇內容對你有任何幫助的話,麻煩給我點一個贊。你的點贊就是我前進的動力。