Logstash——使用Logstash過濾器(filter)對事件中的數據進行特殊處理

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

其截取的是字節值而不是字符數,所以在對中文進行截取的時候需要注意進行對應的調整。


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

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