聚合日志将第一个时间戳设置为@timestamp

时间:2016-11-15 15:41:43

标签: elasticsearch logstash elastic-stack

我正在处理“389 Directory Server”日志的过滤器,日志显示用户在服务器上操作的历史记录,连接,搜索,添加,修改等... 我正在使用聚合过滤器将所有这些日志行合并为一个单独的事件。

但是,我希望事件的最终@timestamp(在用户断开连接后)成为第一个事件的@timestamp(首次建立连接时) 我已尝试使用日期过滤器,虽然它确实更改了每个事件的@timestamp(每个日志行),但聚合过滤器生成的最终映射仍然使用处理日志的时间。

我可以将第一个@timestamp保存到地图中的另一个字段,但是如何用该字段替换@timestamp?

由于过滤器很长,我只会包括开头和结尾:

function y = foo(x)
    y = x;
end

function [y1, y2] = goo(x1, x2)
    y1 = x1;
    y2 = x2;
end

function varargout = yolo(functor, varargin)
    [varargout{1:nargout(functor)}] = functor(varargin{:});
end

y = yolo(@foo, 2)
[y1, y2] = yolo(@goo, 3, 4)

3 个答案:

答案 0 :(得分:1)

您还可以使用下面的代码行根据特定的事件时间戳更新汇总的事件时间戳。但是,如果您使用日志文件时间戳作为事件时间戳,请确保在聚合操作之前应用日期过滤器。

map['@timestamp'] ||= event.get('@timestamp');

答案 1 :(得分:0)

在过滤器中使用日期?
ISO8601表示您的日期类型

date {
            # timezone => "America/Asuncion"
            match => ["timestamp", "ISO8601"]
            target => "@timestamp"
        }   

答案 2 :(得分:0)

想出来,我没有意识到/理解的是,当我到达最终事件并推出地图时,它(地图)将被logstash处理为新事件(如新日志)来自文件的行)和logstash将尝试将该事件与其中一个过滤器匹配,并且失败,因为最终地图不会保持与任何过滤器匹配的按摩字段。

创建新过滤器修复了问题。

filter {
  if "aggregated" in [tags] {
    date {
      match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
      target => "@timestamp"
      add_tag => [ "tmatch" ]
    }
  }
}