在我的项目中,我为移动应用程序提供api,并且在每个api中,前端都使用session_id
标记用户的真实性,并在服务器端接受并验证它。
最近,我们要使用ELK(elasticsearch
,logstash
,kibana
)保存和分析Web服务器访问日志,以提取一些常见的用户 Activity 。我遇到了一些问题,我想将日志中的session_id
更改为user_id
(在程序中,我可以通过查询数据库从user_id
获取session_id
),但我只是不知道怎么办?logstash's
过滤器可以做到这一点吗?还是在elasticsearch
中为日志建立索引时应该更改数据?
最佳答案
好吧,我尝试给您一个答案,假设您具有某种接口(interface),可以从中检索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"
}
}
关于nginx - 在logstash或elasticsearch中更改nginx访问日志数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31934538/