gpt4 book ai didi

grails - 当我使用JDBCAppender设置log4j时,Grails抛出ClassNotFoundException

转载 作者:行者123 更新时间:2023-12-02 14:07:14 32 4
gpt4 key购买 nike

语境

我正在尝试在Grails 2.4.3上使用JDBCAppender设置log4j,我正在尝试使用H2,MySQL和PostgreSQL,但是每个驱动程序都会引发ClassNotFoundException异常。

log4j JDBCAppender的Config.groovy配置:

我已经测试了用户和密码凭据信息,我的意思是,我可以通过Datasource.groovy文件连接到这些数据库。

带H2的Test1:

log4j = {
appenders {
jdbc name: "db",
databaseURL: "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE",
user: "sa",
password: "",
driverClassName: "org.h2.Driver",
sql: "INSERT INTO event_log (log_date, log_message) VALUES ('%d{yyyy.MM.dd HH:mm:ss}', '[%-5p]. Category: %c. Message: %m. User: %X{sessionUserName} DU:[%X{sessionUserDU}]');"
}

root {
info 'grails.app.controller','db'
}

}

使用Postgres的Test2:
log4j = {
appenders {
jdbc name: "db",
URL: "jdbc:postgresql://localhost/grailsTestDB",
user: "userDB",
password: "*******",
driver: "org.postgresql.Driver",
layout: pattern(conversionPattern: "[%t] %-5p %c{2} %x - %m%n - %X{username}'"),
sql: "INSERT INTO event_log (accion,nivel,req,logString,usuario) VALUES('%c{2} %x','%-5p','[%t]','%m%n','%X{username}');"
}

root {
info 'grails.app.controller','db'
}

}

使用MySQL的Test3:

下一个代码来自Grails 1.3.8应用程序,在该应用程序中,该代码可以正常工作。
log4j = {
appenders {
appender new JDBCAppender(
name: "db",
databaseURL: "jdbc:mysql://dbdevsie.db.hostname.com/dbdevsie",
driver: "com.mysql.jdbc.Driver",
user: "dbdevsie231",
password: "********",
layout: pattern(conversionPattern: "[%t] %-5p %c{2} %x - %m%n - %X{username}'"),
sql: "INSERT INTO activity_log (accion,nivel,req,logString,usuario) VALUES('%c{2} %x','%-5p','[%t]','%m%n','%X{username}');"
)
}

root {
info 'grails.app.controller','db'
}

}

Buildconfig.groovy依赖项设置:
dependencies {
runtime 'mysql:mysql-connector-java:5.1.29'
runtime 'org.postgresql:postgresql:9.3-1101-jdbc41'
test "org.grails:grails-datastore-test-support:1.0-grails-2.4"
}

测试结果:

当我测试h2时,它将引发com.mysql.jdbc.Driver异常。

当我测试Mysql时,它将引发sun.jdbc.odbc.JdbcOdbcDriver异常。

当我测试Postgresql时,它将引发org.postgresql.Driver异常。
| Error log4j:ERROR Failed to load driver
| Error java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
| Error at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
| Error at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
| Error at java.security.AccessController.doPrivileged(Native Method)
| Error at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
| Error at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
| Error at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
| Error at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
| Error at java.lang.Class.forName0(Native Method)
| Error at java.lang.Class.forName(Class.java:191)
| Error at org.apache.log4j.jdbc.JDBCAppender.setDriver(JDBCAppender.java:391)
| Error at org.apache.log4j.jdbc.JDBCAppender.getConnection(JDBCAppender.java:248)
| Error at org.apache.log4j.jdbc.JDBCAppender.execute(JDBCAppender.java:215)
| Error at org.apache.log4j.jdbc.JDBCAppender.flushBuffer(JDBCAppender.java:289)
| Error at org.apache.log4j.jdbc.JDBCAppender.append(JDBCAppender.java:186)
| Error at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)

附加评论

我还测试了下载log4j 1.2.17,PostgreSQL 9.3和MySQL 5.1.34 jar文件并将它们放在lib文件夹中的情况,但结果相同。

有人可以帮我这个忙吗?

提前致谢。

更新

此问题在Mac OS中显示,但是我在Linux中运行了相同的代码,因此没有问题。
  • OS X Yosemite版本10.10.1
  • Java 1.7.0_71
  • 最佳答案

    您使用DSL而不是实例化内联Appender是正确的。当您的代码在Config.groovy中运行时,依赖关系和类路径尚未解决,因此您需要某种方法来延迟附加程序的实际初始化,直到发生这种情况,并且DSL配置是一个不错的选择。

    我完成了这项工作,但失败的原因与您不同。以我为例,H2和MySQL早早就可靠地使我的1.7 JVM崩溃了,但是当我切换到1.8时它可以工作,现在即使删除了几乎所有内容,它也可以在1.7中工作。尝试通过注释掉这些配置更改来独立解决依赖关系,然后在启用它们的情况下重新启动。这也可能是由于 fork -我几乎总是通过删除BuildConfig.groovy中的整个grails.project.fork块来禁用它-如果没有其他效果,请查看是否有帮助。

    这是我在Config.groovy中拥有的:

    log4j.main = {

    appenders {
    jdbc name: 'jdbcAppender', driver: 'com.mysql.jdbc.Driver', user: '...',
    password: '...', URL: 'jdbc:mysql://localhost/<dbname>',
    layout: pattern(conversionPattern:
    "insert into logs(log_date, logger, log_level, message) " +
    "values('%d{yyyy-MM-dd HH:mm:ss}','%c','%p','%m')")
    }

    root {
    info 'stdout', 'jdbcAppender'
    }

    error 'org.codehaus.groovy.grails',
    'org.springframework',
    'org.hibernate',
    'net.sf.ehcache.hibernate'
    }

    我创建了该表以登录:
    create table logs (
    log_date datetime not null,
    log_level varchar(10) not null,
    logger varchar(100) not null,
    message varchar(1000) not null
    ) ENGINE=InnoDB;

    关于grails - 当我使用JDBCAppender设置log4j时,Grails抛出ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27489423/

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