我知道在通过logstash处理文件时没有内置的“行数”功能(出于各种可理解和记录的原因)。但是 - 在任何给定的logstash实例中应该存在一种机制,使每个已解析的行具有单调递增的变量/计数。
我不想去指标路线,因为它是一个连续的轮询机制(每隔n秒)。替代方案包括根据我的特定用例对日志文件进行预处理 - 这是不可接受的。
再次,让我重申一下 - 我需要能够生成/读取我在logstash过滤器中可以存储的单调递增变量。
思想?
答案 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)