在我的项目中,我为移动应用程序提供 api,并且在每个 api 中,前端使用 session_id
标记用户真实性,并在服务器端接受并验证它。
最近想用ELK( elasticsearch
, logstash
, kibana
)来保存和分析Web服务器访问日志,提取一些常见的用户事件。遇到一些问题,想换session_id
在日志中 user_id
(在程序中,我可以通过查询数据库从 user_id
获得 session_id
)但我就是不知道怎么做?
可以logstash's
过滤器这样做?或者当日志被索引到 elasticsearch
时我应该更改数据吗? ?
最佳答案
好吧,我试着给你一个答案,假设你有某种接口(interface)可以从中检索 user_id
.其实你需要做两件事:
session_id
的字段user_id
使用某种 api 拆分您的日志行
您需要将输入拆分为单独的字段。这可以通过像 grok 这样的过滤器来完成。和/或 kv .看看some SO questions查找匹配的 grok 模式或使用 grok debugger .如果您需要帮助,请提供一些日志行。
编辑:对于您给定的示例,您的配置应如下所示:
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
必须可用。有几个official plugins但我认为它们都不适合你的目的。由于session_id
是动态分配的,您不能使用静态 translate filter或类似的东西。这取决于您的 api,但一种可能的方法是获取相应的
user_id
通过http请求。为此,您可以使用社区插件。例如 logstash-filter-rest使用这样的配置:filter {
rest {
url => "http://yourserver/getUserBySessionId/"
sprintf => true
method => "post"
params => {
"session_id" => "%{session_id}"
}
response_key => "user_id"
}
}
关于nginx - 在 logstash 或 elasticsearch 中更改 nginx 访问日志数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31934538/