m0_64078755 2024-02-08 16:53 采纳率: 71.4%
浏览 2
已结题

在windows中logstash配置文件执行出错

windows中logstash配置文件执行出错,版本是7.17.3。我使用的命令:D:\Logstash\logstash-7.17.3\bin>logstash -f logstash.conf -t
错误信息:

[2024-02-08T16:35:23,163][FATAL][logstash.runner          ] The given configuration is invalid. Reason: Expected one of [ \t\r\n], "#", "=>" at line 49, column 8 (byte 1526) after output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "info"
    document_id => "%{p_id}"
    doc_as_upsert => true
    action => "update"
    if
[2024-02-08T16:35:23,165][FATAL][org.logstash.Logstash    ] Logstash stopped processing because of an error: (SystemExit) exit

错误信息,大概说的是我output里ES里最后那个if格式的问题,不知道哪里错了,去网上找了很多if的写法格式,都不对。

这是我的配置文件(mysql密码脱敏):

input {
  jdbc {
    jdbc_driver_library => "D:\Maven\mavenRespo\mysql\mysql-connector-java\5.1.39\mysql-connector-java-5.1.39.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/school?useSSL=false"
    jdbc_user => "root"
    jdbc_password => "xxxxxx"
    schedule => "* * * * *"
    statement => "SELECT * FROM t_user"
    type => "user"
  }

  jdbc {
    jdbc_driver_library => "D:\Maven\mavenRespo\mysql\mysql-connector-java\5.1.39\mysql-connector-java-5.1.39.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/school?useSSL=false"
    jdbc_user => "root"
    jdbc_password => "xxxxxx"
    schedule => "* * * * *"
    statement => "SELECT * FROM t_pub"
    type => "info"
  }

  jdbc {
    jdbc_driver_library => "D:\Maven\mavenRespo\mysql\mysql-connector-java\5.1.39\mysql-connector-java-5.1.39.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/school?useSSL=false"
    jdbc_user => "root"
    jdbc_password => "xxxxxx"
    schedule => "* * * * *"
    statement => "SELECT * FROM t_comment"
    type => "comment"
  }
}

filter {
  ruby {
    code => "event.set('json_data', event.to_hash.to_json)"
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "info"
    document_id => "%{p_id}"
    doc_as_upsert => true
    action => "update"
    if [type] == "info"{
     # 占位注释,可以为空
    }
  }

  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "comment"
    document_id => "%{commentId}"
    doc_as_upsert => true
    action => "update"
    if [type] == "comment"{
     # 占位注释,可以为空
    }
  }

  redis {
    host => "localhost"
    port => 6379
    key => "user:%{user_id}"
    data_type => "string"
    codec => json
    if [type] == "user"{
     # 占位注释,可以为空
    }
  }
  
  redis {
    host => "localhost"
    port => 6379
    key => "user:%{username}"
    data_type => "list"
    codec => plain {
      format => "%{user_id}"
    }
    if [type] == "user"{
     # 占位注释,可以为空
    }
  }

  redis {
    host => "localhost"
    port => 6379
    key => "info:%{p_id}"
    data_type => "string"
    codec => json
    if [type] == "info"{
     # 占位注释,可以为空
    }
  }
  
  redis {
    host => "localhost"
    port => 6379
    key => "info:userId:%{userId}"
    data_type => "list"
    codec => plain {
      format => "%{p_id}"
    }
    if [type] == "info"{
     # 占位注释,可以为空
    }
  }  

  redis {
    host => "localhost"
    port => 6379
    key => "comment:%{commentId}"
    data_type => "string"
    codec => json
    if [type] == "comment"{
     # 占位注释,可以为空
    }
  }
  
  redis {
    host => "localhost"
    port => 6379
    key => "comment:pubId:%{pubId}"
    data_type => "list"
    codec => plain {
      format => "%{commentId}"
    }
    if [type] == "comment"{
     # 占位注释,可以为空
    }
  }
}

有朋友可以看看是怎么回事吗?我是要把mysql三张表的数据同步到redis和ES中,三张表都要同步到redis,其中两张表(info表和comment表)同步到ES。mysql中的数据是结构化的普通数据,redis和es中是json格式的数据,redis中还保存了一张表中某些字段和主键的映射。

  • 写回答

2条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-08 16:54
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    根据您提供的错误信息,问题出在 Logstash 配置文件中 if 语句的语法格式上。Logstash 的条件判断(如 if 语句)应该在插件参数内部使用,并且需要遵循特定的语法结构。

    在 Logstash output 插件配置中,条件判断通常结合 conditionalsevent-dependent filtering 来实现,而不是直接在输出插件配置内写入 if 语句。

    针对您的需求,可以在 filter 环节通过条件判断将不同类型的事件发送到不同的 output,如下所示:

    output {
      if [type] == "info" {
        elasticsearch {
          hosts => ["http://localhost:9200"]
          index => "info"
          document_id => "%{p_id}"
          doc_as_upsert => true
          action => "update"
        }
        redis { ... } # info 类型的数据对应的 Redis 输出配置
      }
    
      if [type] == "comment" {
        elasticsearch {
          hosts => ["http://localhost:9200"]
          index => "comment"
          document_id => "%{commentId}"
          doc_as_upsert => true
          action => "update"
        }
        redis { ... } # comment 类型的数据对应的 Redis 输出配置
      }
    
      # user 类型的数据,假设也需要发送到 Elasticsearch 和 Redis
      if [type] == "user" {
        elasticsearch { ... } # user 类型的数据对应的 Elasticsearch 输出配置
        redis { ... } # user 类型的数据对应的 Redis 输出配置
      }
    }
    

    这样,每个 if 语句块将会独立判断并执行相应的输出操作,从而避免了原始配置中的语法错误。不过请注意,在实际应用中,你可能并不需要对 Elasticsearch 进行条件判断,因为可以为每种类型数据设置不同的索引名,而无需使用 if 语句。对于 Redis 输出,则可以根据需要按照上述方式进行调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月16日
  • 已采纳回答 2月8日
  • 创建了问题 2月8日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见