cva*_*alt 3 ruby timestamp logstash
我使用 jdbc-plugin 每分钟查询 MSSQL 数据库。\n在此数据库中,我的时间戳存储在刻度中。字段名称是lastupdate。\n现在我想将lastupdate字段转换为时间戳格式,然后用转换后的lastvalue字段覆盖@timestamp字段。\n我尝试使用另一篇关于转换的帖子提供的方法来使用ruby过滤器插件刻度到日期时间(解析刻度到日期时间),但无法实现转换并得到 _rubyexception 和 _dateparsefailure。
\n\n我的过滤器看起来像这样:
\n\nfilter {\n if [type] == "mydb" {\n ruby {\n init => "require \'time\'"\n code => "lastupdate = Time.at(event[\'lastupdate\'].to_s)"\n }\n date {\n match => [ "lastupdate", "MM/dd/YY HH:mm:ss,SSS" ]\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n上次更新示例:636062509024728064
\n\n使用 \n http://tickstodatetime.com/转换后的日期:2016-08-08\xe2\x80\x8bT11:01:42.472Z
\n\n蜱中的其他信息:https://msdn.microsoft.com/en-us/library/system.datetime.ticks%28v=vs.110%29.aspx
\n这里使用的刻度值指定如下:
此属性的值表示自 0001 年 1 月 1 日午夜 12:00:00(公历 0001 年 1 月 1 日 0:00:00 UTC)以来经过的 100 纳秒间隔数,它表示 DateTime .MinValue。它不包括归因于闰秒的刻度数。
在 Ruby 中,内部时间表示遵循 Unix 约定,即自 1970 年 1 月 1 日 00:00:00 UTC 开始计算秒数。因此,要转换该值,您必须执行一些额外的步骤。在扩展的 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
Run Code Online (Sandbox Code Playgroud)
为了将其应用到logstash,您可以稍微压缩一下:
filter {
if [type] == "mydb" {
ruby {
code => "event['@timestamp'] = LogStash::Timestamp.at((event['lastupdate'].to_i - 621355968000000000) / 10_000_000.0)"
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码片段执行上面所示的计算并将结果作为参数传递给Time.at. 最后,它获取生成的时间对象,将其格式化为 Logstash 使用的格式并将其存储在@timestamp字段中。