自定义log4j输出至数据库,项目启动时的错误

在项目中添加了log4j输出至数据库,自定义了一个Log2OrclObject,结构如下:

public class Log2OrclObject
{
  private int log_id;
  private String log_user;
  private String log_ip;
  private String log_sys_name;
  private String log_fun_model;
  private String log_message;
  private String log_date;
  private String log_level;
  private String log_identity;
  private String log_exception;
  private String log_logger;
  private String log_source;
}

扩展了JdbcAppender,CustomJdbcAppender,如下:
   public class CustomJdbcAppender extends AppenderSkeleton
{
  private String user;
  private String pass;
  private String driver;
  private String url;
  private PreparedStatement pst;
  protected void append(LoggingEvent event)
  {
    this.sql = "insert into Y05_SYSTEMLOGS values(Y05_SYSTEMLOGS_SEQ.nextval,?,?,?,?,?,?,?,?,?,?,?)";
    try
    {
      Class.forName(this.driver);
      Connection conn = DriverManager.getConnection(this.url, this.user, this.pass);
      this.pst = conn.prepareStatement(this.sql);
      

      Log2OrclObject log2OracleObject = (Log2OrclObject)event.getMessage();
      ...
      }

这么写出来,单独用测试类测试的时候时没有问题的,但是当项目启动时,就会报错:

java.lang.ClassCastException:java.lang.String cannot be cast to com.log4j.Log2OracObject

位置就是在这一行中:

Log2OrclObject log2OracleObject = (Log2OrclObject)event.getMessage();

求解这是什么问题啊? 本来log4j中 event.getMessage()获取到的就是Object类型了,为什么初始化的时候会报是String类型的错误呢?

阅读 2.8k
1 个回答

event.GetMessage() 定义的返回 Object 类型,这只是一个引用类型,但引用的对象实际是什么类型在这里是看不出来的。从报错的情况来看,这里实际是一个 String 类型的对象,而不是 Log2OrclObject 对象,所以就报 ClassCastException 了。

简单的举个例子,

Object o = "Hello World";   // o 是 Object 引用,但实际是 String 类型的对象
Integer n = (Integer) o;   // ClassCastException
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题