在我的项目中,我为移动应用程序提供api,并且在每个api中,前端都使用session_id标记用户的真实性,并在服务器端接受并验证它。

最近,我们要使用ELK(elasticsearchlogstashkibana)保存和分析Web服务器访问日志,以提取一些常见的用户 Activity 。我遇到了一些问题,我想将日志中的session_id更改为user_id(在程序中,我可以通过查询数据库从user_id获取session_id),但我只是不知道怎么办?
logstash's过滤器可以做到这一点吗?还是在elasticsearch中为日志建立索引时应该更改数据?

最佳答案

好吧,我尝试给您一个答案,假设您具有某种接口(interface),可以从中检索user_id。实际上,您需要做两件事:

  • 将您的日志行拆分为单独的字段,以使该字段包含session_id
  • 使用某种api
  • 获取相应的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/

    10-10 09:19
    查看更多