【问题标题】:How to format digits in logstash?如何格式化logstash中的数字?
【发布时间】:2017-03-10 21:46:37
【问题描述】:

如何在 logstash 中格式化数字? 我在过滤器插件的 ruby​​ 代码中使用 '' % 格式表达式,但我得到 nil 作为格式结果。我尝试了 sprintf 和 format 函数,但结果相同。

下面是我的代码 sn-p。

ruby {
  code => "
    event.set( 'positioning', event.get('branch_lat') + ',' + event.get('branch_lon') )
    event.set( 'report_datetime', event.get('report_date') + '%04d' % event.get('report_time') )
  "
}

作为格式结果,我在日志中得到以下错误。

[2016-10-28T12:31:43,217][ERROR][logstash.filters.ruby    ] Ruby exception occurred: undefined method `+' for nil:NilClass

我的平台信息如下。

[root@elk-analytic logstash]# rpm -qi logstash
Name        : logstash
Epoch       : 1
Version     : 5.0.0
Release     : 1
Architecture: noarch
Install Date: Thu 27 Oct 2016 01:26:03 PM JST
Group       : default
Size        : 198320729
License     : ASL 2.0
Signature   : RSA/SHA512, Wed 26 Oct 2016 01:57:59 PM JST, Key ID d27d666cd88e42b4
Source RPM  : logstash-5.0.0-1.src.rpm
Build Date  : Wed 26 Oct 2016 01:10:26 PM JST
Build Host  : packer-virtualbox-iso-1474648640
Relocations : /
Packager    : <vagrant@packer-virtualbox-iso-1474648640>
Vendor      : Elasticsearch
URL         : http://www.elasticsearch.org/overview/logstash/
Summary     : An extensible logging pipeline
Description :
An extensible logging pipeline

添加于 2016.10.28 14:32

我的目标是将下面的 csv 列解析为 elasticsearch 中的时间戳字段。 请注意,时间的小时有 1 位和 2 位数字的混合模式。

日期,时间

20160204,1000

20160204,935

我尝试在过滤器插件中使用date 函数,但由于记录错误而无法正常工作。

[2016-10-28T11:00:10,233][WARN ][logstash.filters.date ] Failed parsing date from field {:field=>"report_datetime", 
:value=>"20160204 935", :exception=>"Cannot parse \"20160204 935\": Value 93 for hourOfDay must be in the range [0,23]", :config_parsers=>"YYYYMMdd Hmm", :config_locale=>"default=en_US"}

以下是出现上述错误时的代码sn-p。

ruby {
  code => "
    event.set( 'positioning', event.get('branch_lat') + ',' + event.get('branch_lon') )
    event.set( 'report_datetime', event.get('report_date') + ' ' + event.get('report_time') )
  "
}

# Set the @timestamp according to report_date and time
date {
  "match"  => ["report_datetime", "YYYYMMdd Hmm"]
}

我做了一些修改,最终得到了我第一次发布的代码。

【问题讨论】:

  • 您能否展示一个示例文档以及您想要实现的目标?可能还有其他方法。
  • @Val 请查看我更新的帖子。

标签: ruby elasticsearch logstash


【解决方案1】:

我建议在没有任何ruby 过滤器的情况下这样做:

filter {
  # your other filters...

  # if 3-digit hours, pad the time with one zero
  if [time] =~ /^\d{3}$/ {
    mutate {
      add_field => { "report_datetime" => "%{date} 0%{time}" }
    }
  # otherwise just concat the fields
  } else {
    mutate {
      add_field => { "report_datetime" => "%{date} %{time}" }
    }
  }

  # match date and time
  date {
    "match"  => ["report_datetime", "yyyyMMdd HHmm"]
    "target" => "report_datetime"
  }
}

【讨论】:

  • 谢谢。格式工作正常。我对其他错误感到困惑。但我会考虑您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2018-02-17
  • 1970-01-01
  • 2022-12-11
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多