elasticsearch,duplicates,logstash,Jdbc,elasticsearch,Duplicates,Logstash" /> elasticsearch,duplicates,logstash,Jdbc,elasticsearch,Duplicates,Logstash" />

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

docker input jdbc插件中的Logstash未拾取新行,jdbc,elasticsearch,duplicates,logstash,Jdbc,elasticsearch,Duplicates,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>

我试图在一个停靠的日志存储容器中使用输入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"
}   
问题: 开始日期字段是日期字段而不是时间戳字段。sql\u last\u start是一个时间戳字段。这个比较正确吗?表中的日期不是UTC。我不知道如何将其转换为logstash理解的格式

我尝试了几种比较方法,包括使用UTC将日期字段转换为时间戳字段,但没有一种方法有效

每次我重新启动logstash都会检查整个文件。为了防止重复,我使用了解决方案


任何输入都会有帮助。

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

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

my_unixtimestamp_column>UNIX_时间戳(STR_TO_DATE(:sql_last_value,%Y-%m-%d%T.%f000z))

我不知道您是否在
start\u DATE
列中使用Oracle的时间戳或日期数据类型,或者您为要呈现的数据创建了什么格式。因此,我将根据两个猜测给出答案,也许您可以从中调整您的解决方案

我的第一个猜测是,
start_date
是一种时间戳数据类型,您将其格式化为:
DD-MON-YY HH:MI:SSXFF
,因此您的数据最终如下所示:


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

因此,任务是将存储在:sql\u last\u 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\u last\u值
转换为与您存储在列中的日期或时间戳格式相同的格式,以便您的比较对您使用的sql引擎有意义


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

在进一步检查日志后,我发现在元数据文件-2015-12-18 17:14:00.236000000 Z中,日期是这样存储的,而在日志中,日期显示为2015-12-18 17:14:00 UTC。我无法跟踪格式的配置位置。是否有人遇到此问题?如果是,请分享您的解决方案?谢谢
开始日期
列中的数据格式是什么?如果你给我一些例子,说明那篇专栏里的内容,我们可以解决这个问题。
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')"