更改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 的接口,我试着给您一个答案。实际上你需要做两件事:

  1. 将您的日志行拆分为单独的字段,以便有一个字段包含您的 session_id
  2. 使用某种api
  3. 得到相应的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"
    }
}