gpt4 book ai didi

ruby - 使用 Ruby 插件在 logstash 中将 Ticks 转换为 @timestamp

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:46 24 4
gpt4 key购买 nike

我每分钟使用 jdbc-plugin 查询 MSSQL 数据库。在此数据库中,我的时间戳以滴答形式存储。字段名是上次更新。现在我想将 lastupdate 字段转换为时间戳格式,然后用转换后的 lastvalue 字段覆盖 @timestamp 字段。我使用另一篇关于从滴答到日期时间(Parse ticks to datetime)的转换的帖子提供的方法尝试了 ruby​​ 过滤器插件,但无法实现转换并得到 _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" ]
}
}
}

最后更新示例:636062509024728064

转换后的日期 http://tickstodatetime.com/ : 2016-08-08 T11:01:42.472Z

刻度的附加信息:https://msdn.microsoft.com/en-us/library/system.datetime.ticks%28v=vs.110%29.aspx

最佳答案

此处使用的刻度值为 specified如下:

The value of this property represents the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001 (0:00:00 UTC on January 1, 0001, in the Gregorian calendar), which represents DateTime.MinValue. It does not include the number of ticks that are attributable to leap seconds.

在 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 字段中。

关于ruby - 使用 Ruby 插件在 logstash 中将 Ticks 转换为 @timestamp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39039357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com