【问题标题】:Logstash Oracle Driver issueLogstash Oracle 驱动程序问题
【发布时间】:2020-06-05 08:41:35
【问题描述】:

我正在尝试使用连接到 Oracle DB 的 JDBC 输入插件设置简单的 Logstash 7.6.0 管道。

无论我尝试什么,我总是得到同样的错误:

  2052     LogStash::PluginLoadingError
  2052     oracle.jdbc.OracleDriver not loaded. Are you sure you've included the correct jdbc driver in :jdbc_driver_library?
  2052       C:/Apps/logstash/logstash-7.6.0/vendor/bundle/jruby/2.5.0/gems/logstash-integration-jdbc-5.0.0/lib/logstash/plugin_mixins/jdbc/jdbc.rb:179:in `open_jdbc_connection'
  2052       C:/Apps/logstash/logstash-7.6.0/vendor/bundle/jruby/2.5.0/gems/logstash-integration-jdbc-5.0.0/lib/logstash/plugin_mixins/jdbc/jdbc.rb:242:in `execute_statement'

这似乎仅影响 Oracle 驱动程序。我尝试过使用 H2(详情如下)、PostgreSQL。有用。

我在 Docker 镜像中运行 logstash,所以我在本地尝试,得到了完全相同的结果。

  • 我重新下载了驱动jar(见下面的url)
  • 我检查了连接字符串(使用简单的 java 程序,见下文)
  • 我尝试使用 H2,并且工作正常(参见下面的配置)
  • 我尝试添加日志(见下文)
  • 我试过“oracle.jdbc.OracleDriver”和“oracle.jdbc.driver.OracleDriver”
  • 我在“jdbc_driver_library”中使用错误的文件名进行了测试,得到了另一个错误
  • 我查看了驱动程序 jar,类在那里。 (见下文)

我的选择已经不多了。

一些细节:

这是我的 Oracle 配置

input {
  jdbc {

    schedule => "*/5 * * * * *"

    jdbc_connection_string => "jdbc:oracle:thin:@host:1521/service_name"
    jdbc_driver_library => "C:/Apps/ORACLE_DRIVER/ojdbc7.jar"
    jdbc_driver_class => "oracle.jdbc.OracleDriver"
    statement => "SELECT p.* FROM  person p "
    jdbc_user => "x"
    jdbc_password => "y"

  }
}

output {
  stdout {
    codec => rubydebug
  }

}

我最初是从我的本地 maven ".m2" 存储库中获取驱动程序的,所以只是为了确保我从以下位置重新下载了驱动程序:https://download.oracle.com/otn/utilities_drivers/jdbc/121010/ojdbc7.jar

如果我拼错了“jdbc_driver_library”,我会得到一个不同的错误,所以我知道我的路径是好的

我查看了罐子里面,我可以看到驱动程序:

我创建了这个简单的 java 类来测试驱动程序/连接字符串,它工作得很好:

package oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;

public class TestConnection {
    public static void main(String[] args) {

        try {
            Class.forName("oracle.jdbc.OracleDriver");
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@host:1521/service_name", "x", "y");
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT p.* FROM person p");
            while (rs.next()) {                
                System.out.println(rs.getString(1) + " : " + rs.getString(2));
            }
            System.out.println(new Date());
            con.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

所以我继续,并尝试了一个示例 H2 数据库,它在第一次尝试时完美运行,这是有效的配置(运行 H2 tcp 服务器)。与 Oracle 配置几乎相同

input {
  jdbc {

    schedule => "*/5 * * * * *"

    jdbc_connection_string => "jdbc:h2:tcp://localhost/~/test"
    jdbc_driver_library => "C:/Apps/h2/h2.jar"
    jdbc_driver_class => "org.h2.Driver"
    statement => "SELECT p.* FROM public.person p"
    jdbc_user => "sa"
    jdbc_password => ""

  }
}

output {
  stdout {
    codec => rubydebug
  }

}

我尝试在“logstash/config/log4j2.properties”中添加日志

logger.jdbcinput.name = logstash.inputs.jdbc
logger.jdbcinput.level = DEBUG

但我什么也没得到。

我没有灵感了。

有什么想法吗?

谢谢

【问题讨论】:

    标签: java oracle elasticsearch logstash


    【解决方案1】:

    我终于在这里找到了答案:https://github.com/logstash-plugins/logstash-input-jdbc/issues/43

    jdbc_driver_class => "oracle.jdbc.OracleDriver"
    

    需要:

    jdbc_driver_class => "Java::oracle.jdbc.OracleDriver
    

    为什么要添加这个 Java:: 前缀?为什么没有它它可以与其他驱动程序一起使用?我不明白。

    【讨论】:

      猜你喜欢
      • 2017-07-15
      • 2021-09-27
      • 1970-01-01
      • 2013-08-16
      • 2010-10-05
      • 2011-06-08
      • 2020-10-15
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多