当我使用JDBCAppender设置log4j时,Grails抛出ClassNotFoundException 上下文
我尝试在Grails2.4.3上使用JDBCAppender设置log4j,我尝试使用H2、MySQL和PostgreSQL,但它会在每个驱动程序中抛出ClassNotFoundException异常 log4j JDBCAppender的Config.groovy配置: 我已经测试了用户和密码凭据信息,我的意思是,我可以通过Datasource.groovy文件连接到这些数据库 带有H2的Test1: } 带Postgres的Test2: } 使用MySQL的Test3: 下一段代码取自Grails1.3.8应用程序,在该应用程序中,该代码运行良好当我使用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
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
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)
}