You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-user@logging.apache.org by Mohan Bhargava <mo...@gmail.com> on 2015/06/19 22:51:03 UTC

Fwd: Error while logging , using DbAppender

I am trying to log to Oracle 11g database using log4j's `DBAppender ( part
of Apache Extras project for log4j ) . I am using log4j-1.2.17

Have created the required tables by modifying the Oracle.sql script. Had to
tweak logging_event_id_seq_trig trigger to populate event_id column in
`logging_event` table. This was to avoid SQLException , resulting out of
null values in event_id column.

    CREATE SEQUENCE logging_event_id_seq MINVALUE 1 START WITH 1;

    CREATE TABLE logging_event
      (
        sequence_number   NUMBER(20) NOT NULL,
        timestamp         NUMBER(20) NOT NULL,
        rendered_message  VARCHAR2(4000) NOT NULL,
        logger_name       VARCHAR2(254) NOT NULL,
        level_string      VARCHAR2(254) NOT NULL,
        ndc               VARCHAR2(4000),
        thread_name       VARCHAR2(254),
        reference_flag    NUMBER(5),
        caller_filename   VARCHAR2(254) NOT NULL,
        caller_class      VARCHAR2(254) NOT NULL,
        caller_method     VARCHAR2(254) NOT NULL,
        caller_line       CHAR(4) NOT NULL,
        event_id          NUMBER(10) PRIMARY KEY
      );

    CREATE TRIGGER logging_event_id_seq_trig
      BEFORE INSERT ON logging_event
      FOR EACH ROW
    DECLARE
    BEGIN
       SELECT logging_event_id_seq.nextval
       INTO :new.event_id FROM dual;
       new:sequence_number := :new.event_id;
    END;


    CREATE TABLE logging_event_property
      (
        event_id      NUMBER(10) NOT NULL,
        mapped_key        VARCHAR2(254) NOT NULL,
        mapped_value      VARCHAR2(1024),
        PRIMARY KEY(event_id, mapped_key),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );

    CREATE TABLE logging_event_exception
      (
        event_id         NUMBER(10) NOT NULL,
        i                NUMBER(5)  NOT NULL,
        trace_line       VARCHAR2(254) NOT NULL,
        PRIMARY KEY(event_id, i),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );

I am logging to the database using Oracle JDBC Driver Manager.Here is what
my log4j.xml looks like

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration debug="true"
    xmlns:log4j='http://jakarta.apache.org/log4j/'>

    <root>
    <level value="ALL" />
    <appender-ref ref="DB" />
    </root>

    <appender name="DB" class="org.apache.log4j.DBAppender">
    <param name="locationInfo" value="true" />
    <connectionSource
    class="org.apache.log4j.receivers.db.DriverManagerConnectionSource">
    <param name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <param name="url"
    value="jdbc:oracle:thin:@//some.server.name:1501/some.databse.name" />
    <param name="user" value="some_user" />
    <param name="password" value="some_pwd" />
    </connectionSource>
    </appender>

    </log4j:configuration>

I have written a simple java program to test logging:

    import org.apache.log4j.Logger;

    public class LoggingTest
    {
    public static Logger log;

    public void logMessage()
    {
    log = Logger.getLogger(LoggingTest.class.getName());

    log.info("Entered the logMessage method");
    log.debug("This is a DEBUG message \n");
    log.error("This is a ERROR message \n");
    log.fatal("This is a FATAL message \n");
    log.info("This is a INFO message \n");
    log.warn("This is a WARNING message \n");
    }

    public static void main(String[] args)
    {
    LoggingTest logObj = new LoggingTest();
    logObj.logMessage();
    }
    }

I am getting the following error (for every log statement) when I run log4j
in debug mode.  Whats puzzling is despite the error , I still see events
being logged to the table. I cant figure out what is causing this
particular error.

    log4j:WARN Continuable parsing error 23 and column 23
    log4j:WARN The content of element type "log4j:configuration" must match
"(renderer*,throwableRenderer?,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)".
    log4j: reset attribute= "false".
    log4j: Threshold ="null".
    log4j: Level value for root is  [ALL].
    log4j: root level set to ALL
    log4j: Class name: [org.apache.log4j.DBAppender]
    log4j: Setting property [locationInfo] to [true].
    log4j: Setting property [driverClass] to
[oracle.jdbc.driver.OracleDriver].
    log4j: Setting property [url] to [jdbc:oracle:thin:@//
some.server.name:1501/some.databse.name].
    log4j: Setting property [user] to [some_user].
    log4j: Setting property [password] to [some_pwd].
    log4j: setConnectionSource called for DBAppender
    log4j: DBAppender.activateOptions called
    log4j: Adding appender named [DB] to category [root].
    log4j:ERROR problem appending event
    java.sql.SQLException: Invalid conversion requested
    at
oracle.jdbc.driver.T4CVarcharAccessor.StringToNUMBER(T4CVarcharAccessor.java:832)
    at
oracle.jdbc.driver.T4CVarcharAccessor.getNUMBER(T4CVarcharAccessor.java:239)
    at
oracle.jdbc.driver.T4CVarcharAccessor.getInt(T4CVarcharAccessor.java:527)
    at
oracle.jdbc.driver.GeneratedStatement.getInt(GeneratedStatement.java:217)
    at
oracle.jdbc.driver.GeneratedScrollableResultSet.getInt(GeneratedScrollableResultSet.java:573)
    at org.apache.log4j.DBAppender.append(DBAppender.java:281)
    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 com.log.test.LoggingTest.logMessage(LoggingTest.java:15)
    at com.log.test.LoggingTest.main(LoggingTest.java:28)
    Caused by: java.lang.NumberFormatException
    at java.math.BigDecimal.<init>(BigDecimal.java:470)
    at java.math.BigDecimal.<init>(BigDecimal.java:739)
    at
oracle.jdbc.driver.T4CVarcharAccessor.StringToNUMBER(T4CVarcharAccessor.java:825)
    ... 12 more

On setting breakpoints i see the exception being thrown where a string is
being converted to big decimal. this code expects an exponent , when it
does not find one its throws an exception

                // exponent expected
                if ((c != 'e') && (c != 'E'))
                    throw new NumberFormatException();

Can someone please help me understand the cause of this error and suggest a
fix for it

Re: Error while logging , using DbAppender

Posted by Gary Gregory <ga...@gmail.com>.
Hi Mohan,

You should know that Log4j 1 is not supported or maintained ATM. We are all
actively supporting and developing Log4j 2 though. I would use v2.x if you
can...

Gary

On Fri, Jun 19, 2015 at 1:51 PM, Mohan Bhargava <mo...@gmail.com> wrote:

> I am trying to log to Oracle 11g database using log4j's `DBAppender ( part
> of Apache Extras project for log4j ) . I am using log4j-1.2.17
>
> Have created the required tables by modifying the Oracle.sql script. Had to
> tweak logging_event_id_seq_trig trigger to populate event_id column in
> `logging_event` table. This was to avoid SQLException , resulting out of
> null values in event_id column.
>
>     CREATE SEQUENCE logging_event_id_seq MINVALUE 1 START WITH 1;
>
>     CREATE TABLE logging_event
>       (
>         sequence_number   NUMBER(20) NOT NULL,
>         timestamp         NUMBER(20) NOT NULL,
>         rendered_message  VARCHAR2(4000) NOT NULL,
>         logger_name       VARCHAR2(254) NOT NULL,
>         level_string      VARCHAR2(254) NOT NULL,
>         ndc               VARCHAR2(4000),
>         thread_name       VARCHAR2(254),
>         reference_flag    NUMBER(5),
>         caller_filename   VARCHAR2(254) NOT NULL,
>         caller_class      VARCHAR2(254) NOT NULL,
>         caller_method     VARCHAR2(254) NOT NULL,
>         caller_line       CHAR(4) NOT NULL,
>         event_id          NUMBER(10) PRIMARY KEY
>       );
>
>     CREATE TRIGGER logging_event_id_seq_trig
>       BEFORE INSERT ON logging_event
>       FOR EACH ROW
>     DECLARE
>     BEGIN
>        SELECT logging_event_id_seq.nextval
>        INTO :new.event_id FROM dual;
>        new:sequence_number := :new.event_id;
>     END;
>
>
>     CREATE TABLE logging_event_property
>       (
>         event_id      NUMBER(10) NOT NULL,
>         mapped_key        VARCHAR2(254) NOT NULL,
>         mapped_value      VARCHAR2(1024),
>         PRIMARY KEY(event_id, mapped_key),
>         FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
>       );
>
>     CREATE TABLE logging_event_exception
>       (
>         event_id         NUMBER(10) NOT NULL,
>         i                NUMBER(5)  NOT NULL,
>         trace_line       VARCHAR2(254) NOT NULL,
>         PRIMARY KEY(event_id, i),
>         FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
>       );
>
> I am logging to the database using Oracle JDBC Driver Manager.Here is what
> my log4j.xml looks like
>
>     <?xml version="1.0" encoding="UTF-8" ?>
>     <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
>     <log4j:configuration debug="true"
>     xmlns:log4j='http://jakarta.apache.org/log4j/'>
>
>     <root>
>     <level value="ALL" />
>     <appender-ref ref="DB" />
>     </root>
>
>     <appender name="DB" class="org.apache.log4j.DBAppender">
>     <param name="locationInfo" value="true" />
>     <connectionSource
>     class="org.apache.log4j.receivers.db.DriverManagerConnectionSource">
>     <param name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
>     <param name="url"
>     value="jdbc:oracle:thin:@//some.server.name:1501/some.databse.name" />
>     <param name="user" value="some_user" />
>     <param name="password" value="some_pwd" />
>     </connectionSource>
>     </appender>
>
>     </log4j:configuration>
>
> I have written a simple java program to test logging:
>
>     import org.apache.log4j.Logger;
>
>     public class LoggingTest
>     {
>     public static Logger log;
>
>     public void logMessage()
>     {
>     log = Logger.getLogger(LoggingTest.class.getName());
>
>     log.info("Entered the logMessage method");
>     log.debug("This is a DEBUG message \n");
>     log.error("This is a ERROR message \n");
>     log.fatal("This is a FATAL message \n");
>     log.info("This is a INFO message \n");
>     log.warn("This is a WARNING message \n");
>     }
>
>     public static void main(String[] args)
>     {
>     LoggingTest logObj = new LoggingTest();
>     logObj.logMessage();
>     }
>     }
>
> I am getting the following error (for every log statement) when I run log4j
> in debug mode.  Whats puzzling is despite the error , I still see events
> being logged to the table. I cant figure out what is causing this
> particular error.
>
>     log4j:WARN Continuable parsing error 23 and column 23
>     log4j:WARN The content of element type "log4j:configuration" must match
>
> "(renderer*,throwableRenderer?,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)".
>     log4j: reset attribute= "false".
>     log4j: Threshold ="null".
>     log4j: Level value for root is  [ALL].
>     log4j: root level set to ALL
>     log4j: Class name: [org.apache.log4j.DBAppender]
>     log4j: Setting property [locationInfo] to [true].
>     log4j: Setting property [driverClass] to
> [oracle.jdbc.driver.OracleDriver].
>     log4j: Setting property [url] to [jdbc:oracle:thin:@//
> some.server.name:1501/some.databse.name].
>     log4j: Setting property [user] to [some_user].
>     log4j: Setting property [password] to [some_pwd].
>     log4j: setConnectionSource called for DBAppender
>     log4j: DBAppender.activateOptions called
>     log4j: Adding appender named [DB] to category [root].
>     log4j:ERROR problem appending event
>     java.sql.SQLException: Invalid conversion requested
>     at
>
> oracle.jdbc.driver.T4CVarcharAccessor.StringToNUMBER(T4CVarcharAccessor.java:832)
>     at
>
> oracle.jdbc.driver.T4CVarcharAccessor.getNUMBER(T4CVarcharAccessor.java:239)
>     at
> oracle.jdbc.driver.T4CVarcharAccessor.getInt(T4CVarcharAccessor.java:527)
>     at
> oracle.jdbc.driver.GeneratedStatement.getInt(GeneratedStatement.java:217)
>     at
>
> oracle.jdbc.driver.GeneratedScrollableResultSet.getInt(GeneratedScrollableResultSet.java:573)
>     at org.apache.log4j.DBAppender.append(DBAppender.java:281)
>     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 com.log.test.LoggingTest.logMessage(LoggingTest.java:15)
>     at com.log.test.LoggingTest.main(LoggingTest.java:28)
>     Caused by: java.lang.NumberFormatException
>     at java.math.BigDecimal.<init>(BigDecimal.java:470)
>     at java.math.BigDecimal.<init>(BigDecimal.java:739)
>     at
>
> oracle.jdbc.driver.T4CVarcharAccessor.StringToNUMBER(T4CVarcharAccessor.java:825)
>     ... 12 more
>
> On setting breakpoints i see the exception being thrown where a string is
> being converted to big decimal. this code expects an exponent , when it
> does not find one its throws an exception
>
>                 // exponent expected
>                 if ((c != 'e') && (c != 'E'))
>                     throw new NumberFormatException();
>
> Can someone please help me understand the cause of this error and suggest a
> fix for it
>



-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory