log4jdbcsql错误

gg58donl  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(289)

据我所知,我正在编写一个使用hadoop的java应用程序,hadoop使用log4j。在我的应用程序中,log4j工作正常。我正在使用jdbcapender写入oracle数据库。所发生的是,当我运行应用程序时,在hadoopjar中,在log4j调用期间,它崩溃并给出一个缺少逗号的错误。这很奇怪,因为它在我的程序部分工作,但在hadoop的东西崩溃。我在log4j中打开了调试,一切看起来都正常。
我的问题如下。1) 有没有可能在jdbcapender中打开额外的日志记录来查看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

nnsrf1az

nnsrf1az1#

1:您可以很容易地定义happender的日志级别:log4j.appender.db=debug
您甚至可以为这样的特定包设置日志级别 com.foobar = DEBUG .
2您可能在log4j上有版本冲突。最简单的方法可能是使用与hadoop使用的版本完全相同的版本。另一种可能是切换到另一个记录器实现,比如logback。
最后一个是排除hadoop的log4j可传递依赖项,如果两个项目都使用maven,但结果不能保证。

ovfsdjhp

ovfsdjhp2#

我得到了它。hadoop在他们的日志中有单引号,这会破坏对oracle的写入。我实现了一个hack并修改了log4j,去掉了单引号。更改在forcedlog函数的category.java中。我检查传入对象是否是字符串的示例。然后我取那个字符串并对其执行replaceall(“'”,“”)。我本可以用replaceall(“'”,“'”)来让甲骨文接受这句话,但这对我来说并不重要。

相关问题