簡體   English   中英

在logstash或elasticsearch中更改nginx訪問日志數據

[英]Change nginx access log data in logstash or elasticsearch

在我的項目中,我為移動應用程序提供了api,並且在每個api中,前端都使用session_id標記用戶的真實性,並在服務器端接受並驗證它。

最近,我們想用ELK( elasticsearchlogstashkibana )保存和分析Web服務器訪問日志中提取一些常用發生的用戶活動。 我遇到了一些問題,我想將日志中的session_id更改為user_id (在程序中,我可以通過查詢數據庫從session_id獲取user_id ),但我只是不知道怎么辦?

logstash's過濾器可以做到這一點嗎? 還是在elasticsearch日志建立索引時應該更改數據?

好的,我假設您具有某種可以從其中檢索user_id的接口,因此嘗試為您提供答案。 實際上,您需要做兩件事:

  1. 將您的日志行拆分為單獨的字段,以使該字段包含session_id
  2. 使用某種API獲取相應的user_id

分割日志行

您需要將輸入拆分為單獨的字段。 這可以通過諸如grok和/或kv之類的過濾器來完成。 查看一些SO問題,以找到匹配的grok模式或使用grok調試器 如果需要幫助,請提供一些日志行。

編輯:對於給定的示例,您的配置應如下所示:

filter {
    grok {
        match => [ 'message', '"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent} %{QS:xforwardedfor}' ]
    }
    kv {
        field_split => "&?"
    } 
}

請嘗試並自行調整以獲取session_id

一旦有了一個名為session_id的字段,就可以繼續執行步驟2。

獲取user_id

如前所述,您需要一個過濾器插件,因為session_id必須可用。 有幾個官方插件,但我認為它們都不適合您的目的。 由於session_id是動態分配的,因此您不能使用靜態轉換過濾器或類似的東西。

這取決於您的api,但是一種可能的方法是通過http請求獲取相應的user_id 為此,您可以使用社區插件。 例如, logstash-filter-rest具有如下配置:

filter {
    rest {
        url => "http://yourserver/getUserBySessionId/"
        sprintf => true
        method => "post"
        params => {                      
            "session_id" => "%{session_id}"        
        }
        response_key => "user_id"
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM