[英]Change nginx access log data in logstash or elasticsearch
在我的項目中,我為移動應用程序提供了api,並且在每個api中,前端都使用session_id
標記用戶的真實性,並在服務器端接受並驗證它。
最近,我們想用ELK( elasticsearch
, logstash
, kibana
)保存和分析Web服務器訪問日志中提取一些常用發生的用戶活動。 我遇到了一些問題,我想將日志中的session_id
更改為user_id
(在程序中,我可以通過查詢數據庫從session_id
獲取user_id
),但我只是不知道怎么辦?
logstash's
過濾器可以做到這一點嗎? 還是在elasticsearch
日志建立索引時應該更改數據?
好的,我假設您具有某種可以從其中檢索user_id
的接口,因此嘗試為您提供答案。 實際上,您需要做兩件事:
session_id
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.