Logstash mutate 插件【翻譯+實踐】

来源:http://www.cnblogs.com/liuning8023/archive/2016/05/17/5502460.html
-Advertisement-
Play Games

地址:https://www.elastic.co/guide/en/logstash/2.2/plugins-filters-mutate.html 本文內容 語法 mutate 插件可以在欄位上執行變換,包括重命名、刪除、替換和修改。這個插件相當常用。 比如: 你已經根據 Grok 表達式將 T ...


官網地址

本文內容

  • 語法
  • 測試數據
  • 可選配置項

mutate 插件可以在欄位上執行變換,包括重命名、刪除、替換和修改。這個插件相當常用。

比如:

  • 你已經根據 Grok 表達式將 Tomcat 日誌的內容放到各個欄位中,想把狀態碼、位元組大小或是響應時間,轉換成整型;
  • 你已經根據正則表達式將日誌內容放到各個欄位中,但是欄位的值,大小寫都有,這對於 Elasticsearch 的全文檢索來說,顯然用處不大,那麼可以用該插件,將欄位內容全部轉換成小寫。

語法


該插件必須是用 mutate 包裹,如下所示:

mutate {}

可用的配置選項如下表所示:

設置 輸入類型 是否必填 預設值
add_field hash No {}
add_tag array No []
convert hash No  
gsub array No  
join hash No  
lowercase array No  
merge hash No  
periodic_flush boolean No false
remove_field array No []
remove_tag array No []
rename hash No  
replace hash No  
split hash No  
strip array No  
update hash No  
uppercase array No  

其中,add_field、remove_field、add_tag、remove_tag 是所有 Logstash 插件都有。它們在插件過濾成功後生效。雖然 Logstash 叫過濾,但不僅僅過濾功能。

tag 作用是,當你對欄位處理期間,還期望進行後續處理,就先作個標記。Logstash 有個內置 tags 數組,包含了期間產生的 tag,無論是 Logstash 自己產生的,還是你添加的,比如,你用 grok 解析日誌,但是錯了,那麼 Logstash 自己就會自己添加一個 _grokparsefailure 的 tag。這樣,你在 output 時,可以對解析失敗的日誌不做任何處理;

而 field 作用是,對欄位的操作,比如,你想利用已有的欄位,創建新的欄位。這些在後面再說。

另外,你會發現,上表中所有選項,要麼是動詞,要麼是動賓短語。估計你也猜到了,選項其實就是 ruby 函數,而它們後面,即“=>”,跟著的肯定是一堆參數(要是你寫程式,你也會這麼乾)。第一個參數,肯定是欄位,也就是你期望該函數作用在哪個欄位上,從第二個欄位開始往後,是具體參數~

什麼是欄位?比如,你想解析 Tomcat 日誌,把一行訪問日誌拆分後,得到客戶端IP、位元組大小、響應時間等放到指定變數,那麼這個變數就是欄位。

下麵具體介紹各個選項。

測試數據


假設有 Tomcat access 日誌:

192.168.6.25 - - [24/Apr/2016:01:25:53 +0800] GET "/goLogin" "" 8080 200 1692 23 "http://10.1.8.193:8080/goMain" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
192.168.6.25 - - [24/Apr/2016:01:25:53 +0800] GET "/js/common/jquery-1.10.2.min.js" "" 8080 304 - 67 "http://10.1.8.193:8080/goLogin" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
192.168.6.25 - - [24/Apr/2016:01:25:53 +0800] GET "/css/common/login.css" "" 8080 304 - 75 "http://10.1.8.193:8080/goLogin" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
192.168.6.25 - - [24/Apr/2016:01:25:53 +0800] GET "/js/system/login.js" "" 8080 304 - 53 "http://10.1.8.193:8080/goLogin" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"

它是按如下 Tomcat 配置產生的:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t %m &quot;%U&quot; &quot;%q&quot; %p %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot;" />

若用如下 Grok 表達式解析該日誌:

%{IPORHOST:clientip} %{NOTSPACE:identd} %{NOTSPACE:auth} \[%{HTTPDATE:timestamp}\] %{WORD:http_method} %{NOTSPACE:request} %{NOTSPACE:request_query|-} %{NUMBER:port} %{NUMBER:statusCode} (%{NOTSPACE:bytes}|-) %{NUMBER:reqTime} %{QS:referer} %{QS:userAgent}

會得到如下結果:

{
          "message" => "192.168.6.25 - - [24/Apr/2016:01:25:53 +0800] GET \"/goLogin\" \"\" 8080 200 1692 23 \"http://10.1.8.193:8080/goMain\" \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0\"",
         "@version" => "1",
       "@timestamp" => "2016-05-17T08:26:07.794Z",
             "host" => "vcyber",
         "clientip" => "192.168.6.25",
           "identd" => "-",
             "auth" => "-",
        "timestamp" => "24/Apr/2016:01:25:53 +0800",
      "http_method" => "GET",
          "request" => "\"/goLogin\"",
    "request_query" => "\"\"",
             "port" => "8080",
       "statusCode" => "200",
            "bytes" => "1692",
          "reqTime" => "23",
          "referer" => "\"http://10.1.8.193:8080/goMain\"",
        "userAgent" => "\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0\""
}

註意,日誌拆分到各個欄位後的數據類型。port、statusCode、bytes、reqTime 欄位肯定是(最好是)數字,不過這裡暫時先用字元串。後面會介紹,下麵的示例都在此基礎上。

可配置選項


add_field

  • 值是散列,就是鍵值對,比如 add_field => {"field1"=>"value1","field2"=>"value2"}。
  • 預設值是空對象,即 {}

添加新的欄位。

示例:

input {
        stdin {
        }
}
filter {
        grok {
                match=>["message","%{IPORHOST:clientip} %{NOTSPACE:identd} %{NOTSPACE:auth} \[%{HTTPDATE:timestamp}\] %{WORD:http_method} %{NOTSPACE:request} %{NOTSPACE:request_query|-} %{NUMBER:port} %{NUMBER:statusCode} (%{NOTSPACE:bytes}|-) %{NUMBER:reqTime} %{QS:referer} %{QS:userAgent}"]
        }
        mutate {
                add_field=>{
                         "SayHi"=>"Hello , %{clientip}"
                }
        }
}
output{
        stdout{
                codec=>rubydebug
        }
}
註意黑體部分,如果用這個配置,解析前面的 Tcomat access 日誌,會得到如下結果:
{
          "message" => "192.168.6.25 - - [24/Apr/2016:01:25:53 +0800] GET \"/goLogin\" \"\" 8080 200 1692 23 \"http://10.1.8.193:8080/goMain\" \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0\"",
         "@version" => "1",
       "@timestamp" => "2016-05-17T04:52:02.031Z",
             "host" => "vcyber",
         "clientip" => "192.168.6.25",
           "identd" => "-",
             "auth" => "-",
        "timestamp" => "24/Apr/2016:01:25:53 +0800",
      "http_method" => "GET",
          "request" => "\"/goLogin\"",
    "request_query" => "\"\"",
             "port" => "8080",
       "statusCode" => "200",
            "bytes" => "1692",
          "reqTime" => "23",
          "referer" => "\"http://10.1.8.193:8080/goMain\"",
        "userAgent" => "\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0\"",
            "SayHi" => "Hello , 192.168.6.25"
}
你會看到多了一個 SayHi 欄位。這個欄位是寫死的,當然也可以動態。如果將
"SayHi"=>"Hello , %{clientip}"
改成:
"another_%{clientip}"=>"Hello , %{clientip}" 
你會看到如下結果:
{
                 "message" => "192.168.6.25 - - [24/Apr/2016:01:25:53 +0800] GET \"/goLogin\" \"\" 8080 200 1692 23 \"http://10.1.8.193:8080/goMain\" \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0\"",
                "@version" => "1",
              "@timestamp" => "2016-05-17T06:38:04.427Z",
                    "host" => "vcyber",
                "clientip" => "192.168.6.25",
                  "identd" => "-",
                    "auth" => "-",
               "timestamp" => "24/Apr/2016:01:25:53 +0800",
             "http_method" => "GET",
                 "request" => "\"/goLogin\"",
           "request_query" => "\"\"",
                    "port" => "8080",
              "statusCode" => "200",
                   "bytes" => "1692",
                 "reqTime" => "23",
                 "referer" => "\"http://10.1.8.193:8080/goMain\"",
               "userAgent" => "\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0\"",
    "another_192.168.6.25" => "Hello , 192.168.6.25"
}
雖然這個例子不太合理,但你現在知道,用已有欄位的值,可以生成新的欄位和它的值。
上面示例只添加了一個欄位,你也可以添加多個欄位:
add_field=>{
        "another_%{clientip}"=>"Hello , %{clientip}"
        "another_%{http_method}"=>"Hello, %{http_method}"
}

add_tag

  • 值是 array 數組
  • 預設值為空數組,即 []

添加新的標簽。

示例:

mutate {
        add_tag=>[
                "foo_%{clientip}"
        ]
}
你會看到如下結果:
{
          "message" => "192.168.6.25 - - [24/Apr/2016:01:25:53 +0800] GET \"/goLogin\" \"\" 8080 200 1692 23 \"http://10.1.8.193:8080/goMain\"

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 仿照Mac上的截圖編輯功能做的一個圖片編輯的Demo,功能有畫矩形,圓形,箭頭,手寫,輸入文字和分享. 做的時候看到一個大神的帖子寫的一個文字動畫的教程,故順帶學習做了一個類似的文字下落動畫. 有興趣的可以看看,github 鏈接如下: https://github.com/xl20071926/L ...
  • 1、連接Mysql 格式: mysql -h主機地址 -u用戶名 -p用戶密碼1、連接到本機上的MYSQL。 首先打開DOS視窗,然後進入目錄mysql\bin,再鍵入命令mysql -u root -p,回車後提示你輸密碼.註意用戶名前可以有空格也可以沒有空格,但是密碼前必須沒有空格,否則讓你重新 ...
  • http://timmurphy.org/tag/mysql/ http://timmurphy.org/2009/11/17/use-schema_name-in-postgresql/ For those moving from MySQL to PostgreSQL, there are a ...
  • mysql防止重覆插入記錄方法總結 防止mysql重覆插入記錄的方法有很多種,常用的是ignore,Replace,ON DUPLICATE KEY UPDATE,當然我們也可以在php中加以判斷了。 方案一:使用ignore關鍵字 如果是用主鍵primary或者唯一索引unique區分了記錄的唯一 ...
  • MyEclipse連接Mysql資料庫 準備工作:MyEclipse使用的是2013版,mysql Ver 14.14 Distrib 5.6.28 1.jar包的下載(jdbc驅動) 我下載的是:mysql-connector-java-5.1.7-bin.jar 2.打開MyEclipse >選 ...
  • 前一篇文章提到了在2014下分區表引起的奇葩問題,最近也在苦苦研究問題的原因。這篇文章主要講述在分區表下,查詢是怎麼樣的一個情況。由於2014的新功能“參數估計”下是如何運轉的目前無從得知,所以只能分享下2008下的原理了... 在 SQL Server 2008 中,已分區表的內部表示形式已發生變 ...
  • 1.DeadLocks 死鎖 Cycle of transactions waiting for locks to be released by each other. 2.Handle: (1) DeadLocks prevention Based on timestamps; Wait-Die ...
  • 接上文Mysql的簡單使用(二) mysql中結構相同的兩個表進行合併:(註意需要兩個表的結構是一樣的) 有如下結構的兩個表father和person。 合併的步驟為: 1.把person表和father表兩個表進行聯合輸出到臨時表tmp中。 命令為:>create temporary table ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...