急!!帮忙解决 问题详情如下

woshishui5ww 2010-04-04 08:40:16
代码如下**
* 参数化消息
* @author Johnson.Lee
*
*/
public interface ParameterizedMessage extends Serializable {

/**
* 获取参数列表
* @return 返回参数列表
*/
public Object[] getParameters();

/**
* 获取指定索引位置的参数
* @param index 索引位置
* @return 返回参数列表中指定索引位置的参数值
* @throws IndexOutOfBoundsException 当index >= 参数列表个数时,抛出此异常
* @see #getParameterCount()
*/
public Object getParameter(int index) throws IndexOutOfBoundsException;

/**
* 获取参数个数
* @return 返回参数个数
*/
public int getParameterCount();

}

Java代码
/**
* JDBC日志消息
* @author Johnson.Lee
*
*/
public class JDBCLogMessage implements ParameterizedMessage {
private static final long serialVersionUID = 1709063421963292637L;
private Object[] params;

public JDBCLogMessage(Object... params) {
this.params = params;
}

public Object[] getParameters() {
return this.params;
}

public Object getParameter(int index) throws IndexOutOfBoundsException {
return this.params[index];
}

public int getParameterCount() {
return this.params.length;
}

@Override
public String toString() {
return Arrays.toString(this.params);
}
}
2.继承Log4j的AppenderSkeleton Java代码
/**
* 使用纯JDBC连接将日志记录到数据库中
* @author Johnson.Lee
*
*/
public class JDBCAppender extends AppenderSkeleton {
private String driver;
private String url;
private String userName;
private String password;
private String sql;

@Override
protected void append(LoggingEvent e) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
Class.forName(this.driver);
conn = DriverManager.getConnection(this.url, this.userName, this.password);
if (e.getMessage() instanceof ParameterizedMessage) {
try {
pstmt = conn.prepareStatement(sql);
Object[] params = ((ParameterizedMessage) e.getMessage()).getParameters();
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params);
}
pstmt.executeUpdate();
} catch (SQLException ex) {
this.errorHandler.error("log into database failed!", ex, 0);
} finally {
AbstractJDBCDao.close(pstmt);
AbstractJDBCDao.close(conn);
}
}
} catch (ClassNotFoundException ex) {
this.errorHandler.error("load jdbc driver [" + this.driver + "] failed!", ex, 0);
} catch (SQLException ex) {
this.errorHandler.error("establish connect failed!", ex, 0);
}
}

@Override
public void close() {
}

@Override
public boolean requiresLayout() {
return false;
}

/**
* 设置JDBC驱动
* @param driver JDBC驱动类名
*/
public void setDriver(String driver) {
this.driver = driver;
}

/**
* 设置连接字符串
* @param url 数据库连接字符串
*/
public void setUrl(String url) {
this.url = url;
}

/**
* 设置数据库用户名
* @param userName 用户名
*/
public void setUserName(String userName) {
this.userName = userName;
}

/**
* 设置数据库密码
* @param password 密码
*/
public void setPassword(String password) {
this.password = password;
}

/**
* 设置插入日志的SQL语句
* @param sql
*/
public void setSql(String sql) {
this.sql = sql;
}

}
[/pre]
3.配置log4j.properties Java代码
log4j.rootLogger=INFO, stdout, jdbc

#std appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

#file appender
#log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.file.File=${application.context}
#log4j.appender.file.DatePattern='_'yyyyMMdd'.log'
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n

#jdbc appender
log4j.appender.jdbc=net.kinginfo.framework.log.JDBCAppender
log4j.appender.jdbc.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
log4j.appender.jdbc.url=jdbc:microsoft:sqlserver://192.172.10.106:1433;databaseName=tempdb
log4j.appender.jdbc.userName=sa
log4j.appender.jdbc.password=sa
log4j.appender.jdbc.sql=insert into LogInfo(time, type, info) values(getDate(),?,?)

4.创建日志表 Sql代码
use tempdb;

create table LogInfo (
id int identity(1,1) primary key not null,
time datetime,
type int,
info varchar(255)
);

select * from LogInfo;

5.编写测试类 Java代码
public class TestJDBCAppender {

public static void main(String[] args) {
Logger logger = Logger.getRootLogger();
ParameterizedMessage msg = new JDBCLogMessage(1, "日志测试");
logger.info(msg);
}
}
问题如下
log4j:ERROR load jdbc driver [oracle.jdbc.driver.OracleDriver ] failed!
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at JDBCAppender.append(JDBCAppender.java:27)
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.info(Category.java:666)
at TestJDBCAppender.main(TestJDBCAppender.java:8)

jar文件都加了

...全文
66 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tdgwj 2010-04-04
  • 打赏
  • 举报
回复
驱动类没有找到
longmei998 2010-04-04
  • 打赏
  • 举报
回复
JDBC
woshishui5ww 2010-04-04
  • 打赏
  • 举报
回复
我找到问题了 多了空格 配置文件中
woshishui5ww 2010-04-04
  • 打赏
  • 举报
回复
Class.forName(this.driver);
这的问题 如果我把它换成Class.forName(“oracle.jdbc.driver.OracleDriver”);
就可以的 但是调试跟踪Class.forName(this.driver); 这也可以读到驱动信息啊 就是找不到
小李子 2010-04-04
  • 打赏
  • 举报
回复
找不到驱动 OracleDriver
是不是没有添加相应的jar包
建议你可以在程序里导入 oracle.jdbc.driver.OracleDriver 类,看是否编译错误,可以得知jar包是否引进
woshishui5ww 2010-04-04
  • 打赏
  • 举报
回复
我没用过log4j 信息写入数据库中 就是它加载数据库驱动时报错
woshishui5ww 2010-04-04
  • 打赏
  • 举报
回复
是啊 但是都加了啊 为什么还报呢
goodmrning 2010-04-04
  • 打赏
  • 举报
回复
加载JDBC失败!检查设置.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧