gpt4 book ai didi

java - 引用的 Jar 中的 Log4J JDBC SQL 错误

转载 作者:可可西里 更新时间:2023-11-01 15:17:55 26 4
gpt4 key购买 nike

我正在编写一个使用 Hadoop 的 Java 应用程序,据我所知,它使用 Log4j。在我的应用程序中,Log4J 工作正常。我正在使用 JDBCAppender 写入 Oracle 数据库。发生的事情是,当我运行该应用程序时,在 log4j 调用期间在 Hadoop jar 中它崩溃并给出了缺少逗号错误。这很奇怪,因为它在我的程序部分工作,但在 Hadoop 的东西中崩溃了。我在 log4j 中打开调试,一切看起来都很正常。

我的问题如下。1)是否有可能以某种方式在 JDBCAppender 中打开额外的日志记录以查看有问题的 SQL 语句?2)我到底应该如何处理这个问题! :)

这是异常和 log4j.properties 文件。

log4j:ERROR Failed to excute sql
java.sql.SQLSyntaxErrorException: ORA-00917: missing comma

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:505)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:223)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1033)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1328)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1837)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1802)
at oracle.jdbc.driver.OracleStatementWrapper.executeUpdate(OracleStatementWrapper.java:294)
at org.apache.log4j.jdbc.JDBCAppender.execute(JDBCAppender.java:218)
at org.apache.log4j.jdbc.JDBCAppender.flushBuffer(JDBCAppender.java:289)
at org.apache.log4j.jdbc.JDBCAppender.append(JDBCAppender.java:186)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
at org.apache.log4j.Category.callAppenders(Category.java:206)
at org.apache.log4j.Category.forcedLog(Category.java:391)
at org.apache.log4j.Category.log(Category.java:856)
at org.apache.commons.logging.impl.Log4JLogger.info(Log4JLogger.java:199)
at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitTask(FileOutputCommitter.java:173)
at org.apache.hadoop.mapred.Task.commit(Task.java:1012)
at org.apache.hadoop.mapred.Task.done(Task.java:882)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:374)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
I/O error: Read timed out

还有属性文件...

log4j.rootLogger=INFO, DB

log4j.appender.DB = org.apache.log4j.jdbc.JDBCAppender

log4j.appender.DB.URL = jdbc:oracle:thin:@//192.168.0.18:1521/dev01.home.net
log4j.appender.DB.driver = oracle.jdbc.OracleDriver
log4j.appender.DB.user = syslog
log4j.appender.DB.password = syslog
log4j.appender.DB.sql = INSERT INTO SERVICELOG values (log4net_seq.nextVal, sysdate, '%p', null, '%m','')
log4j.appender.DB.layout = org.apache.log4j.PatternLayout

编辑 0

实际上,我想我可能会有所作为。它试图打印的字符串中有一个单引号。这是甲骨文的禁忌。现在我只需要弄清楚如何删除它:)。

/编辑0

最佳答案

我明白了。 Hadoop 在他们的日志中有单引号,这会搞砸对 Oracle 的写入。我实现了一个 hack 并修改了 log4j 以去除单引号。更改位于 Category.java 的 forcedLog 函数中。我检查传入的对象是否是一个 instanceof String。然后我获取该字符串并对其执行 replaceAll("'","") 操作。我本可以使用 replaceAll("'","''") 来使单引号适合 Oracle,但这对我来说无关紧要。

关于java - 引用的 Jar 中的 Log4J JDBC SQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com