当我使用JDBCAppender设置log4j时,Grails抛出ClassNotFoundException 上下文

当我使用JDBCAppender设置log4j时,Grails抛出ClassNotFoundException 上下文,grails,jdbc,log4j,classnotfoundexception,appender,Grails,Jdbc,Log4j,Classnotfoundexception,Appender,我尝试在Grails2.4.3上使用JDBCAppender设置log4j,我尝试使用H2、MySQL和PostgreSQL,但它会在每个驱动程序中抛出ClassNotFoundException异常 log4j JDBCAppender的Config.groovy配置: 我已经测试了用户和密码凭据信息,我的意思是,我可以通过Datasource.groovy文件连接到这些数据库 带有H2的Test1: } 带Postgres的Test2: } 使用MySQL的Test3: 下一段代码取自Gra

我尝试在Grails2.4.3上使用JDBCAppender设置log4j,我尝试使用H2、MySQL和PostgreSQL,但它会在每个驱动程序中抛出ClassNotFoundException异常

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

带有H2的Test1: }

带Postgres的Test2: }

使用MySQL的Test3: 下一段代码取自Grails1.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依赖项设置: 测试结果: 当我测试h2时,它抛出com.mysql.jdbc.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)    
当我测试Mysql时,它抛出sun.jdbc.odbc.JdbcOdbcDriver异常

| 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)    
当我测试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)    
补充意见 我还测试了下载log4j1.2.17、postgresql9.3和MySQL 5.1.34 jar文件,并将它们放在lib文件夹中,但得到了相同的结果

有人能帮我做这件事吗

提前谢谢

更新 这个问题在Mac OS中显示,但是我在linux中运行了相同的代码,没有问题

  • OS X优胜美地版本10.10.1
  • Java 1.7.0_71

使用DSL而不是内联实例化appender是正确的;当代码在Config.groovy中运行时,依赖项和类路径还没有被解析,因此您需要某种方法来延迟appender的实际初始化,直到发生这种情况之后,DSL配置是一个不错的选择

我成功了,但失败的次数和你不一样。在我的例子中,H2和MySQL在早期都可靠地崩溃了我的1.7 JVM,但当我切换到1.8时它工作了,现在它在1.7中也工作了,即使删除了几乎所有内容。尝试通过注释掉这些配置更改,然后在启用这些更改的情况下重新启动,从而独立地解决依赖关系。这也可能是由于forking造成的——我几乎总是通过删除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'
}

我们使用了一种变通方法,其中我们为jdbc appender使用了一个数据源

在datasource.groovy中添加日志数据源:

dataSource_log {
    url = "jdbc:sqlserver://DBServer:1433;databaseName=Logs;integratedSecurity=true" 
    dialect = "org.hibernate.dialect.SQLServerDialect" 
    driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver" 
}
然后重写JDBCAppender获取连接的位置

public class DataSourceAppender extends JDBCAppender {
    SessionFactory sessionFactory;
    protected java.sql.Connection getConnection() throws java.sql.SQLException {
        SessionImplementor imp = (SessionImplementor) sessionFactory.getCurrentSession();
        return imp.getJdbcConnectionAccess().obtainConnection();
    }
}
并将此自定义appender添加到Bootstrap.groovy中的log4j中:

def grailsApplication
def sessionFactory_log

def init = { servletContext ->
    def sqlAppender = new DataSourceAppender(
            grailsApplication.config.dataSourceAppender
    )
    sqlAppender.sessionFactory = sessionFactory_log
    Logger.getRootLogger().addAppender(sqlAppender)
}

不过,我希望看到一个真正的解决方案。

谢谢您的回复。
public class DataSourceAppender extends JDBCAppender {
    SessionFactory sessionFactory;
    protected java.sql.Connection getConnection() throws java.sql.SQLException {
        SessionImplementor imp = (SessionImplementor) sessionFactory.getCurrentSession();
        return imp.getJdbcConnectionAccess().obtainConnection();
    }
}
def grailsApplication
def sessionFactory_log

def init = { servletContext ->
    def sqlAppender = new DataSourceAppender(
            grailsApplication.config.dataSourceAppender
    )
    sqlAppender.sessionFactory = sessionFactory_log
    Logger.getRootLogger().addAppender(sqlAppender)
}