在我的项目中,我为移动应用程序提供了api,并且在每个api中,前端使用session_id
来标记用户的真实性,并在服务器端接受并验证它。
最近,我们希望使用ELK(elasticsearch
,logstash
,kibana
)来保存和分析Web服务器访问日志,以提取一些常见的用户活动。我遇到了一些问题,我想将日志中的session_id
更改为user_id
(在程序中我可以从user_id
通过查询数据库获取session_id
但我只是不知道怎么样?
logstash's
过滤器可以执行此操作吗?或者我应该在elasticsearch
中将日志编入索引时更改数据?
答案 0 :(得分:1)
好吧,我试着给你一个答案,假设你有某种界面可以从中检索user_id
。实际上你需要做两件事:
session_id
user_id
醇>
拆分日志行
您需要将输入拆分为单独的字段。这可以使用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,但一种可能的方法是通过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"
}
}