在logstash字段中包含单调递增的值?

时间:2014-05-28 19:51:54

标签: logstash

我知道在通过logstash处理文件时没有内置的“行数”功能(出于各种可理解和记录的原因)。但是 - 在任何给定的logstash实例中应该存在一种机制,使每个已解析的行具有单调递增的变量/计数。

我不想去指标路线,因为它是一个连续的轮询机制(每隔n秒)。替代方案包括根据我的特定用例对日志文件进行预处理 - 这是不可接受的。

再次,让我重申一下 - 我需要能够生成/读取我在logstash过滤器中可以存储的单调递增变量。

思想?

3 个答案:

答案 0 :(得分:4)

此处没有内置到logstash中来执行此操作。

您可以构建一个过滤器来轻松完成

将这样的内容放到lib / logstash / filters / seq.rb

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
require "set"
#
# This filter will adds a sequence number to a log entry
#
# The config looks like this:
#
#     filter {
#       seq {
#         field => "seq"
#       }
#     }
#
# The `field` is the field you want added to the event.
class LogStash::Filters::Seq < LogStash::Filters::Base

  config_name "seq"
  milestone 1

  config :field, :validate => :string, :required => false, :default => "seq"

  public
  def register
    # Nothing
  end # def register

  public
  def initialize(config = {})
    super

    @threadsafe = false

    # This filter needs to keep state.
    @seq=1
  end # def initialize

  public
  def filter(event)
    return unless filter?(event)
    event[@field] = @seq
    @seq = @seq + 1
    filter_matched(event)
  end # def filter
end # class LogStash::Filters::Seq

每次重新启动Logstash时都会从1开始,但在大多数情况下,这都可以。如果你需要在重新启动时保持持久性的东西,你需要做更多的工作来将其持久化

答案 1 :(得分:3)

对于在2018年发现这一点的任何人:logstash现在有一个ruby filter,这使得这更加简单。将以下内容放在某个文件中:

# encoding: utf-8

def register(params)
    @seq = 1
end

def filter(event)
    event.set("seq", @seq)
    @seq += 1
    return [event]
end

然后在logstash.conf中配置它(在您使用的文件名中替换):

ruby {
  path => "/usr/local/lib/logstash/seq.rb"
}

从logstash.conf中可以很容易地配置字段名称,但是我会将其作为读者的练习。

我怀疑这不是线程安全的,所以我只运行一个logstash工作。

答案 2 :(得分:0)

这是解决问题的另一种选择,对我来说这很有效,这要感谢先前有关线程安全的人的回答。我使用seq字段对我的desc进行排序

enter image description here

这是我的配置

logstash.conf

filter {
  ruby {
    code => 'event.set("seq", Time.now.strftime("%N").to_i)'           
        }
}

logstash.yml

pipeline.batch.size: 200
pipeline.batch.delay: 60
pipeline.workers: 1
pipeline.output.workers: 1