Hi,

I have written custom  JDBCAppender to write log messages to database. I have 
Hello World type program to test JDBCAppender.  When I run the program, I get 
following error:


2013-01-07 11:37:28,753 ERROR appenders contains an invalid element or 
attribute "JDBCAppender"


Here is my log4j2.xml :


<?xml version="1.0" encoding="UTF-8"?>
<configuration status="trace">
  <appenders>
    <JDBCAppender name="jdbc" driver="com.mysql.jdbc.Driver"
              url="jdbc:localhost:testdb" userName="root" password=""/>
  </appenders>
  <loggers>
    <root level="trace">
      <appender-ref ref="jdbc"/>
    </root>
  </loggers>
</configuration>



And JDBCAppender code is below:

@Plugin(name = "JDBCAppender", type = "Core", elementType = "appender", 
printObject = true)
public final class JDBCAppender extends AbstractAppender {

                private final  Connection con;
                private final String sql;

    @SuppressWarnings("unchecked")
                private JDBCAppender(String name, Filter filter, 
@SuppressWarnings("rawtypes") Layout layout, Connection con, String sql, 
boolean handleExceptions) {
                                super(name, filter, layout, handleExceptions);
                                this.con = con;
                                this.sql = sql;
}

    public void append(LogEvent event) {
        try {

        Statement stmt = con.createStatement();
            stmt.execute(sql);
            con.commit();
            con.close();
        } catch (Exception ex) {
            throw new AppenderRuntimeException(ex);
        }
    }

    @PluginFactory
    public static JDBCAppender createAppender(@PluginAttr("url") String 
databaseURL,
                                                  @PluginAttr("driver") String 
driverName,
                                                  @PluginAttr("userName") 
String databaseUser,
                                                  @PluginAttr("password") 
String databasePassword,
                                                  @PluginElement("sql") String 
sql,
                                                  @SuppressWarnings("rawtypes") 
@PluginElement("layout") Layout layout,
                                                  @PluginElement("filter") 
Filter filter,
                                                  
@PluginAttr("suppressExceptions") String suppress) {

        String name = "JDBC Connection Info " + databaseURL;
        boolean handleExceptions = suppress == null ? true : 
Boolean.valueOf(suppress);
        Connection con = null;
        if (!DriverManager.getDrivers().hasMoreElements())
                     setDriver(driverName);
         if (con == null) {
           try {
                                                con = 
DriverManager.getConnection(databaseURL, databaseUser,          
databasePassword);
                                } catch (SQLException e) {
                                                // TODO Auto-generated catch 
block
                                                e.printStackTrace();
                                }
         }

        if (con == null) {
            return null;
        }
        if (layout == null) {
            layout = SerializedLayout.createLayout();
        }
        return new JDBCAppender(name, filter, layout, con, sql, 
handleExceptions);
    }

    public static void setDriver(String driverClass) {
      try {
        Class.forName(driverClass);
      } catch (Exception e) {

      }
    }

}

Is there any other API changes or configuration needed to get Customer Appender 
work ?



Thanks
Anand





Reply via email to