Logstash JDBC 输入,过滤与@timestamp 不同的事件时间戳
Logstash JDBC input, filter event timestamp different to @timestamp
我正在尝试更改 @timestamp
以匹配我的 timestamp
,这是我的事件发生的时间,而不是 logstash 时间戳。
这是我的配置文件
input {
jdbc {
jdbc_driver_library => "C:/logstash/lib/mysql-connector-java-5.1.37-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/transport"
jdbc_user => "root"
jdbc_password => ""
schedule => "* * * * *"
statement => "select id, timestamp, type, service, data, success, trans_id from audit where timestamp >= :sql_last_start"
}
}
filter {
date {
match => [ "timestamp", "YYYY-MM-dd HH:mm:ss,SSS" ]
add_tag => [ "tsmatch" ]
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "audit-%{+YYYY.MM.dd}"
document_id => "%{id}"
}
stdout {
codec => rubydebug
}
}
输出
{
"id" => 32,
"timestamp" => 2015-11-18 18:21:44 +0000,
"type" => "Scheduled",
"service" => "Road",
"data" => "Changing the time",
"success" => 1,
"trans_id" => "ta819rsc",
"@version" => "1",
"@timestamp" => "2015-11-18T18:22:00.069Z",
"tags" => [
[0] "_dateparsefailure"
]
}
弹性搜索
可以看出,timestamp(时间)是不一样的。当我将它带入 Kibana 时,这会弄乱我的数据,因为我希望直方图在事件发生时过滤,而不是在 logstash 给它时间戳时过滤。
有人可以为我提供解决方法吗?
更新:
我已按照建议将过滤器更改为
match => [ "timestamp", "YYYY-MM-dd HH:mm:ss ZZZ" ]
并且时间还未到,得到相同的 _dateparsefailure
作为回应。这与它是 MySQL 的 Datestamp
并且无法转换这一事实有什么关系吗?
克
请注意我们文档中的 _dateparsefailure 标记。
您的 'timestamp' 字段如下所示:2015-11-18 18:21:44 +0000
而您的日期{}模式如下所示:YYYY-MM-dd HH:mm:ss,SSS
他们需要匹配。
好的,我终于想通了如何让 @timestamp
与事件发生的时间相匹配。
我需要将我的时间戳格式化为字符串格式,我在 MySQL 的 DATE_FORMAT()
的帮助下做到了这一点。
MySQL数据:
这是 logstash 配置代码。
input {
jdbc {
code omitted....
schedule => "* * * * *"
statement => "select id, DATE_FORMAT(timestamp, '%Y-%m-%d %T') AS timestamp, type, service, data, success, trans_id from `transport`.`audit` where timestamp >= :sql_last_start"
}
}
filter {
date {
locale => "en"
timezone => "UTC"
match => [ "timestamp", "YYYY-MM-dd HH:mm:ss" ]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "audit-%{+YYYY.MM.dd}"
document_id => "%{id}"
}
stdout {
codec => rubydebug
}
}
输出
{
"id" => 65,
"timestamp" => "2015-11-19 11:28:31",
"type" => "Scheduled",
"service" => "Road",
"data" => "Changing the time",
"success" => 1,
"trans_id" => "ee565",
"@version" => "1",
"@timestamp" => "2015-11-19T11:28:31.000Z"
}
如您所见,@timestamp
匹配事件 timestamp
Elasticsearch 索引。
我希望这对其他人有帮助..
G
我遇到了完全相同的问题,jdbc 输入过滤器检索到的我的字段时间戳不是日期过滤器插件。
我认为问题是 jdbc 输入插件 returns 一个日期类型字段,而日期过滤器插件需要一个字符串来解析。
这就是为什么当您通过 sql 语句将日期字段转换为字符串格式时,它起作用了。
我找到了另一个解决方案:
在您的 sql 语句中只需执行
statement => "select id, timestamp as \"@timestamp\", type, service ..."
PS:\"@timestamp\" 无法与我的 jdbc 驱动程序 Ucanassess 一起使用,我已经使用
[@timestamp]
我正在尝试更改 @timestamp
以匹配我的 timestamp
,这是我的事件发生的时间,而不是 logstash 时间戳。
这是我的配置文件
input {
jdbc {
jdbc_driver_library => "C:/logstash/lib/mysql-connector-java-5.1.37-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/transport"
jdbc_user => "root"
jdbc_password => ""
schedule => "* * * * *"
statement => "select id, timestamp, type, service, data, success, trans_id from audit where timestamp >= :sql_last_start"
}
}
filter {
date {
match => [ "timestamp", "YYYY-MM-dd HH:mm:ss,SSS" ]
add_tag => [ "tsmatch" ]
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "audit-%{+YYYY.MM.dd}"
document_id => "%{id}"
}
stdout {
codec => rubydebug
}
}
输出
{
"id" => 32,
"timestamp" => 2015-11-18 18:21:44 +0000,
"type" => "Scheduled",
"service" => "Road",
"data" => "Changing the time",
"success" => 1,
"trans_id" => "ta819rsc",
"@version" => "1",
"@timestamp" => "2015-11-18T18:22:00.069Z",
"tags" => [
[0] "_dateparsefailure"
]
}
弹性搜索
可以看出,timestamp(时间)是不一样的。当我将它带入 Kibana 时,这会弄乱我的数据,因为我希望直方图在事件发生时过滤,而不是在 logstash 给它时间戳时过滤。
有人可以为我提供解决方法吗?
更新:
我已按照建议将过滤器更改为
match => [ "timestamp", "YYYY-MM-dd HH:mm:ss ZZZ" ]
并且时间还未到,得到相同的 _dateparsefailure
作为回应。这与它是 MySQL 的 Datestamp
并且无法转换这一事实有什么关系吗?
克
请注意我们文档中的 _dateparsefailure 标记。
您的 'timestamp' 字段如下所示:2015-11-18 18:21:44 +0000
而您的日期{}模式如下所示:YYYY-MM-dd HH:mm:ss,SSS
他们需要匹配。
好的,我终于想通了如何让 @timestamp
与事件发生的时间相匹配。
我需要将我的时间戳格式化为字符串格式,我在 MySQL 的 DATE_FORMAT()
的帮助下做到了这一点。
MySQL数据:
这是 logstash 配置代码。
input {
jdbc {
code omitted....
schedule => "* * * * *"
statement => "select id, DATE_FORMAT(timestamp, '%Y-%m-%d %T') AS timestamp, type, service, data, success, trans_id from `transport`.`audit` where timestamp >= :sql_last_start"
}
}
filter {
date {
locale => "en"
timezone => "UTC"
match => [ "timestamp", "YYYY-MM-dd HH:mm:ss" ]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "audit-%{+YYYY.MM.dd}"
document_id => "%{id}"
}
stdout {
codec => rubydebug
}
}
输出
{
"id" => 65,
"timestamp" => "2015-11-19 11:28:31",
"type" => "Scheduled",
"service" => "Road",
"data" => "Changing the time",
"success" => 1,
"trans_id" => "ee565",
"@version" => "1",
"@timestamp" => "2015-11-19T11:28:31.000Z"
}
如您所见,@timestamp
匹配事件 timestamp
Elasticsearch 索引。
我希望这对其他人有帮助..
G
我遇到了完全相同的问题,jdbc 输入过滤器检索到的我的字段时间戳不是日期过滤器插件。
我认为问题是 jdbc 输入插件 returns 一个日期类型字段,而日期过滤器插件需要一个字符串来解析。
这就是为什么当您通过 sql 语句将日期字段转换为字符串格式时,它起作用了。
我找到了另一个解决方案: 在您的 sql 语句中只需执行
statement => "select id, timestamp as \"@timestamp\", type, service ..."
PS:\"@timestamp\" 无法与我的 jdbc 驱动程序 Ucanassess 一起使用,我已经使用
[@timestamp]