"/opt/logst-6ren">
gpt4 book ai didi

jdbc - docker input jdbc 插件中的 Logstash 未获取新行

转载 作者:行者123 更新时间:2023-12-01 16:21:59 30 4
gpt4 key购买 nike

我正在尝试在 dockerized logstash 容器中使用输入 jdbc 插件。

jdbc {
type => "logs"
jdbc_driver_library => "/opt/logstash/driver/ojdbc6.jar"
jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
jdbc_connection_string => "jdbc:oracle:thin:@//<host>:<port>/<database>"
jdbc_user => "****"
jdbc_password => "****"
jdbc_fetch_size => 1000
schedule => "* * * * *"
statement => "select ROWIDTONCHAR ( rowid ) AS rid_obj ,CONNECTION_ID, IPADDRESS, START_DATE, ELAPSED_TIME_MS, GUI_EVENT_TYPE, GUI_EVENT_NAME, GUI_EVENT_PARAMS
from table where start_date>:sql_last_start"
clean_run => false
record_last_run => true
last_run_metadata_path => "/opt/logstash/lastrun/.logstash_jdbc_last_run"
}

元数据文件的卷映射如下:

-v - /opt/logstash/lastrun/.logstash_jdbc_last_run:/opt/logstash/lastrun/.logstash_jdbc_last_run

问题:start_date 字段是日期字段而不是时间戳字段。 sql_last_start 是一个时间戳字段。比较是否正确?表中的日期不是 UTC。我不确定如何将其转换为 logstash 可以理解的格式。

我尝试了几种比较方法,包括将日期字段转换为具有 UTC 的时间戳字段 - 均无效。

每次我重新启动 logstash 时都会遍历整个文件。为了防止重复,我使用了

中的解决方案

Logstash input jdbc is duplicating results

任何输入都会有所帮助。

最佳答案

我也无法找到一种方法来格式化 jdbc 插件存储在上次运行元数据文件中的时间戳。

所以我的解决方案是将存储在 :sql_last_value 中的日期时间戳重新格式化为可以与数据库中的时间戳进行比较的值,使用 SQL 函数进行转换。我使用的是 mysql,在 mysql 中,我通过在查询中执行此操作将上次运行元数据文件中的 2018-09-26 18:42:00.007000000 Z 时间戳转换为 unixtimestamp:

my_unixtimestamp_column > UNIX_TIMESTAMP(STR_TO_DATE(:sql_last_value, '%Y-%m-%d %T.%f000 Z'))

我不知道您在 start_date 列中使用的是 Oracle 的 TIMESTAMP 还是 DATE 数据类型,或者您为要呈现的数据创建的格式是什么。所以,我将根据我的回答根据两个猜测,也许您可​​以从那里调整您的解决方案。

我的第一个猜测是 start_date 是一种 TIMESTAMP 数据类型,并且您将其格式化如下:DD-MON-YY HH:MI:SSXFF 所以您的数据最终看起来像这样:


01-JAN-03 02:00:00.000000 上午
01-JAN-04 04:21:55.891000 上午
等等

因此任务是将存储在 :sql_last_value 中的时间戳转换为数据库引擎可以在 sql 查询本身中与其列值进行比较的格式。

根据上述假设,这是我可能的解决方案:

statement => "select ROWIDTONCHAR ( rowid ) AS rid_obj ,CONNECTION_ID, IPADDRESS,  START_DATE,  ELAPSED_TIME_MS,  GUI_EVENT_TYPE,  GUI_EVENT_NAME,  GUI_EVENT_PARAMS 
from table where start_date>TO_TIMESTAMP_TZ(:sql_last_value, 'YYYY-MM-DD HH.MI.SSXFF Z')"

由于我没有可用于测试的 Oracle 系统,也不知道您使用的格式,因此您的解决方案会有所不同,但这应该为您指明了正确的方向。基本思想是将上次运行元文件中捕获的 :sql_last_value 转换为与存储在列中相同的日期或时间戳格式,因此您的比较对您使用的 SQL 引擎有意义.

虽然理论上可以将数据库列中的值格式转换为上次运行元数据中存储的日期格式,但我认为这会慢得多。转换一次静态存储日期以与表中的行进行比较应该比转换表中的每一行以与静态字符串进行比较更快。

关于jdbc - docker input jdbc 插件中的 Logstash 未获取新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34345469/

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