Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logstash 对数存储多个输入多个输出_Logstash - Fatal编程技术网

Logstash 对数存储多个输入多个输出

Logstash 对数存储多个输入多个输出,logstash,Logstash,我正在尝试用Logstash在MySQL和Elasticsearch之间同步数据 我将多个jdbc输入和多个输出设置为不同的elasticsearch索引。。。我做错了一些事,因为所有的事情都会发生 这是我的配置: input { jdbc { jdbc_connection_string => "jdbc:mysql:127.0.0.1:3306/whatever" jdbc_user => "xxx" jdbc_passw

我正在尝试用Logstash在MySQL和Elasticsearch之间同步数据

我将多个jdbc输入和多个输出设置为不同的elasticsearch索引。。。我做错了一些事,因为所有的事情都会发生

这是我的配置:

 input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql:127.0.0.1:3306/whatever"
        jdbc_user => "xxx"
        jdbc_password => "yyy"
        jdbc_driver_library => "mysql-connector-java-5.1.41.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        schedule => "* * * * *"
        statement => "SELECT * from table1 WHERE updated_at > :sql_last_value order by updated_at"
        use_column_value => true
        tracking_column => updated_at
        type => "table1"
        last_run_metadata_path => "/opt/logstash-5.4.0/sql-last-values/table1"
    }
      jdbc {
        jdbc_connection_string => "jdbc:mysql:127.0.0.1:3306/whatever"
        jdbc_user => "xxx"
        jdbc_password => "yyy"
        jdbc_driver_library => "mysql-connector-java-5.1.41.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        schedule => "* * * * *"
        statement => "SELECT * from table2 WHERE updated_at > :sql_last_value order by updated_at"
        use_column_value => true
        tracking_column => updated_at
        type => "table2"
        last_run_metadata_path => "/opt/logstash-5.4.0/sql-last-values/table2"
    }
}
output {
    if [type] == "table1" {
           elasticsearch {
                hosts => ["localhost:9200"]
                index => "table1"
                document_type => "table1"
                document_id => "%{id}"
        }
        file {
                codec => json_lines
                path => "/opt/logstash-5.4.0/logs/table1.log"
        }

    } else if [type] == "table2" {
           elasticsearch {
                hosts => ["localhost:9200"]
                index => "table2"
                document_type => "table2"
                document_id => "%{id}"
        }
    } else {
         file {
                codec => json_lines
                path => "/opt/logstash-5.4.0/logs/unknown.log"
            }

    }
}
我做错了什么?所有内容都将转到else块,即/opt/logstash-5.4.0/logs/unknown.log

我的方法错了吗?我应该有多个文件吗

提前感谢您

找到解决方案

我使用了
标签
而不是
类型

input {
jdbc { 
...
tags => "table1"
...
}
jdbc { 
...
tags => "table2"
...
}
}
output {
  if "table1" in [tags] {

}

我遇到了类似的问题,使用标签解决了它。看来,“类型”可以在日志字段中使用,并且将重写输入值,例如Win LogPad,其中“类型”可以是日志的偶数类型。如果您不希望在输出的文档中有标记字段,则还可以考虑添加元数据和删除标记。例如,您可以添加每个标记对应的元数据,然后删除标记,然后使用这些元数据字段将不同的文档驱动到不同的输出。我写了一篇博客文章,在上展示了这种方法。免责声明:我是Elastic的咨询工程师。