1. 时区问题

Logstash默认时区为UTC,我们所在的时区是UTC+8,所以会有8小时的时差。使用jdbc-input-plugin时,sql中的所有时间字段都需要处理。下面给出几个例子:

  • sql中的**datetime**类型字段转为毫秒级时间戳并增加8小时

    1. ruby{
    2. code => "event.set('create_time_unix_time', (event.get('create_time').to_f.round(3)*1000).to_i)"
    3. }
    4. ruby {
    5. code => "event.set('create_time', (event.get('create_time_unix_time') + 8*60*60*1000))"
    6. }
  • sql中的**datetime**类型字段转为**yyyy-MM-dd HH:mm:ss**格式的字符串并增加8小时

    1. ruby {
    2. code => "event.set('create_time_format_date', (event.get('create_time').time.localtime + 8*60*60).strftime('%Y-%m-%d %H:%M:%S'))"
    3. }
    4. ruby {
    5. code => "event.set('create_time', event.get('create_time_format_date'))"
    6. }

    2. 给@timestamp赋值

    使用时间戳赋值错误率低

    1. date {
    2. match => ["create_time", "UNIX_MS"]
    3. }

    3. 删除多余的字段

    1. mutate {
    2. remove_field => [ "create_time_unix_time", "create_time_format_date" ]
    3. }

    4.tracking_column,tracking_column_type,:sql_last_value的使用

    **tracking_column**只有 numeric, timestamp 2种类型。
    按时间增量查询时,可以使用timestamp类型的字段,如创建时间、修改时间。
    按主键增量查询时,可以使用numeric类型的字段,这里要注意的是,numeric类型的主键只能是自增主键,使用雪花算法生成的主键会造成:sql_last_value不更新。

    5.last_run_metadata_path使用

    裸机环境或云环境部署可以忽略此条,此条只针对Docker环境。last_run_metadata_path的作用是在文件中保存:sql_last_value上一次后的值,当使用Docker时,如果容器被销毁,此文件也会跟容器一起被销毁,所以需要通过Docker的volume机制,将文件保存到物理存储中。
    last_run_metadata_path指向文件所在的文件夹需要在启动Docker前创建好并授予读写权限,启动Docker在volume中做映射,如下,我使用的是docker-compose: ```yaml version: ‘3.8’

networks: elastic: driver: bridge

services: logstash02: image: logstash:7.16.2 container_name: logstash02 volumes:

  1. - ./pipeline/:/usr/share/logstash/pipeline/
  2. - ./library/:/usr/share/logstash/library/
  3. - ./sql/:/usr/share/logstash/sql/
  4. - ./settings/:/usr/share/logstash/config/
  5. - ./logs/:/usr/share/logstash/logs/
  6. - ./data/:/usr/share/logstash/data/
  7. privileged: true
  8. networks:
  9. - elastic
  1. `last_run_metadata_path`指向文件的示例如下:<br />当`tracking_column_type``numeric`

—- 3560

  1. `tracking_column_type``timestamp`

—- !ruby/object:DateTime ‘2022-12-20 10:13:00.000000000 Z’

  1. <a name="KAmjQ"></a>
  2. ## 6. 多数据源同步数据
  3. 当使用1个Logstash同时同步多个数据源的数据时,一定要保存物理机的内存充足,其次是建立多个管道,不要在单个管道中同步多种数据,以免造成堵塞。
  4. ```yaml
  5. - pipeline.id: bis1_logstash
  6. queue.type: persisted
  7. path.config: '/usr/share/logstash/pipeline/bis1_logstash.conf'
  8. - pipeline.id: bis2_logstash
  9. queue.type: persisted
  10. path.config: '/usr/share/logstash/pipeline/bis2_logstash.conf'
  11. - pipeline.id: bis3_logstash
  12. queue.type: persisted
  13. path.config: '/usr/share/logstash/pipeline/bis3_logstash.conf'

7. schedule可以参考 小记:Logstash Jdbc input plugin的schedule参数不生效的问题

8. 打印Logstash执行日志

output节点下添加stdout输出。

  1. stdout { codec => rubydebug }