我使用jdbc-plugin对每个分钟的MSSQL数据库进行查询。 在此数据库中,我的时间戳存储在刻度线中。字段名称是lastupdate。 现在我想将lastupdate字段转换为时间戳格式,然后用转换后的lastvalue字段覆盖@timestamp字段。 我尝试使用另一篇文章提供的ruby过滤器插件,从ticks到datetime(Parse ticks to datetime)转换,但无法实现转换并得到_rubyexception和_dateparsefailure。
我的过滤器如下所示:
filter {
if [type] == "mydb" {
ruby {
init => "require 'time'"
code => "lastupdate = Time.at(event['lastupdate'].to_s)"
}
date {
match => [ "lastupdate", "MM/dd/YY HH:mm:ss,SSS" ]
}
}
}
lastupdate的示例:636062509024728064
转换后的日期 http://tickstodatetime.com/:2016-08-08 T11:01:42.472Z
Ticks中的其他信息:https://msdn.microsoft.com/en-us/library/system.datetime.ticks%28v=vs.110%29.aspx
答案 0 :(得分:2)
此处使用的刻度值为specified,如下所示:
此属性的值表示自公元1月1日午夜12:00:00(公历1月1日0:00:00到公历)以来经过的100纳秒间隔的数量,代表DateTime.MinValue。它不包括可归因于闰秒的刻度数。
在Ruby中,内部时间表示遵循从1970年1月1日,00:00:00 UTC开始计算秒数的Unix约定。因此,要转换该值,您必须执行一些额外的步骤。在扩展的Ruby中,它看起来像这样:
epoch = 621_355_968_000_000_000 # 1970-01-01T00:00:00Z in ticks
ticks_per_second = 10_000_000.0
lastupdate = 636062509024728064 # the value in ticks we would like to convert
seconds_since_epoch = (lastupdate - epoch) / ticks_per_second
Time.at(seconds_since_epoch).utc
# => 2016-08-08 11:01:42 UTC
为了将其应用于logstash,您可以稍微压缩一下:
filter {
if [type] == "mydb" {
ruby {
code => "event['@timestamp'] = LogStash::Timestamp.at((event['lastupdate'].to_i - 621355968000000000) / 10_000_000.0)"
}
}
}
此代码剪切执行上面显示的计算,并将结果作为参数传递给Time.at
。最后,它将生成的时间对象formats采用logstash使用的格式,并将其存储在@timestamp
字段中。
答案 1 :(得分:1)
根据霍尔格的回答,我修好了我的。 (谢谢!)
他完全正确的转换。蜱虫是一个奇怪的时间单位:P我不会在这里重复他完美的解释。
这将解析String(!!!)tick值并创建一个Logstash时间对象以写入@timestamp字段:
ruby {
init => "require 'time'"
code => "
ts = (event['message'].to_i - 621355968000000000) / 10000000
event['@timestamp'] = LogStash::Timestamp.new(Time.at(ts))
"
}
有趣的问题:)仍然认为Holger值得一试;)
注意:您不需要"需要时间"部分。当lambda在logstash中执行时,它已被导入。
注意2:logstash 5.0会破坏事件(我相信它变成了一个java bean),所以不需要将它作为数组访问,而是需要通过set方法访问它。
此致
Artur
P.S。例如:
artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2/
Settings: Default pipeline workers: 8
Pipeline main started
636062509024728064
{
"message" => "636062509024728064",
"@version" => "1",
"@timestamp" => "2016-08-08T11:01:42.000Z",
"host" => "pandaadb"
}
P.s.2:我认为"不能复制Fixnum"是我试图调用解析整数值(不确定)