更改logstash或elasticsearch中的nginx访问日志数据
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
- 使用某种api
得到相应的user_id
拆分您的日志行
您需要将您的输入分成单独的字段。这可以通过像 grok and/or kv. Take a look at to find a matching grok pattern or use the 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 but I think none of them suits your purpose. Since the session_id
is assigned dynamically you cannot use a static 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"
}
}
在我的项目中,我为移动应用程序提供了api,并且在每个api前端使用session_id
来标记用户真实性,并在服务器端接受和验证它。
最近想用ELK(elasticsearch
, logstash
, kibana
)来保存和分析web服务器访问日志,提取一些常见的用户活动。我遇到了一些问题,我想将日志中的 session_id
更改为 user_id
(在程序中我可以通过查询数据库从 session_id
中获取 user_id
)但我不知道如何?
logstash's
过滤器可以做到这一点吗?或者我应该在 elasticsearch
中索引日志时更改数据吗?
好的,假设您有某种可以从中检索 user_id
的接口,我试着给您一个答案。实际上你需要做两件事:
- 将您的日志行拆分为单独的字段,以便有一个字段包含您的
session_id
- 使用某种api 得到相应的
user_id
拆分您的日志行
您需要将您的输入分成单独的字段。这可以通过像 grok and/or kv. Take a look at
编辑: 对于给定的示例,您的配置应如下所示:
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 but I think none of them suits your purpose. Since the session_id
is assigned dynamically you cannot use a static 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"
}
}