在logstash或elasticsearch中更改nginx访问日志数据

时间:2015-08-11 06:18:46

标签: nginx elasticsearch logstash

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

最近,我们希望使用ELK(elasticsearchlogstashkibana)来保存和分析Web服务器访问日志,以提取一些常见的用户活动。我遇到了一些问题,我想将日志中的session_id更改为user_id(在程序中我可以从user_id通过查询数据库获取session_id但我只是不知道怎么样?

logstash's过滤器可以执行此操作吗?或者我应该在elasticsearch中将日志编入索引时更改数据?

1 个答案:

答案 0 :(得分:1)

好吧,我试着给你一个答案,假设你有某种界面可以从中检索user_id。实际上你需要做两件事:

  1. 将您的日志行拆分为单独的字段,以显示包含session_id
  2. 的字段
  3. 使用某种api
  4. 获取相应的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"
        }
    }