Issue created: https://issues.apache.org/jira/browse/LOG4J2-424


2013/10/12 Gary Gregory <garydgreg...@gmail.com>

> Yes, please open a Jira
>
> Gary
> Sent via the Samsung Galaxy Note® 3, an AT&T 4G LTE smartphone
>
>
> -------- Original message --------
> From: Tihomir Meščić **
> Date:10/12/2013 10:16 AM (GMT-05:00)
> To: Log4J Developers List **
> Subject: Re: Missing feature in the JDBC appender
>
> So, should I open a JIRA issue for this or you guys gonna handle that?
>
> Kind regards,
> Tihomir
>
>
> 2013/10/11 Gary Gregory <garydgreg...@gmail.com>
>
>> On Fri, Oct 11, 2013 at 11:50 AM, Nick Williams
>> <nicho...@nicholaswilliams.net> wrote:
>> >
>> > On Oct 11, 2013, at 10:29 AM, Gary Gregory wrote:
>> >
>> >> On Fri, Oct 11, 2013 at 11:10 AM, Nick Williams
>> >> <nicho...@nicholaswilliams.net> wrote:
>> >>> (Foreword: Apologies for my scarcity of late. I'm a month behind on
>> my book, mostly due to my wasted work on getCallerClass for Java 8, and I
>> still have $work to contend with.)
>> >>>
>> >>> Agreed that the unicode stuff is a problem with a non-compliant
>> driver. There's nothing we can do about that per se. Other, compliant
>> drivers will require unicode columns to use setNString, etc. Unicode is the
>> direction everything is headed (indeed, most things are unicode by default
>> now, such as MySQL), so we need to leave unicode as the default.
>> >>>
>> >>> The data types are an interesting problem. We can't just support any
>> Type constant. Here's why:
>> >>>
>> >>> The way you use the Types constant is to call setObject. The problem
>> with setObject is that the actual value passed to it must match the Type
>> constant passed to it. So, you can't pass a String into setObject and use
>> Types.INTEGER--that will result in an error for most drivers (though some
>> are more forgiving).
>> >>>
>> >>> The way the whole JDBCAppender works is to use the pattern layout to
>> determine column value. This gives the end user ultimate flexibility--they
>> can use one field or multiple fields from a LogEvent for each column,
>> format them different ways, etc. The pattern layout results in a String, so
>> we need to be aware of how to convert that String to the Type the user has
>> specified. That's a lot of work, and may not be possible for all Types the
>> user can specify.
>> >>>
>> >>> However, I _do_ understand how our users could often need to have
>> integer columns, so I think it's worth adding a special case for integer
>> column types. Of course, integer columns could be either INTEGER or BIGINT
>> in the most common cases, so I'm not completely sure the best way to
>> proceed with that.
>> >>>
>> >>> Thoughts?
>> >>
>> >> I was thinking of using Types values to then have a switch on the type
>> >> value in order to call setInt vs. setString vs. setXXX
>> >>
>> >> The string could be anything but using the names Types constants gives
>> >> us a known vocabulary of sorts.
>> >
>> > But like I pointed out, we can't support a majority of the Types. What
>> we CAN do, however, is remove the "unicode" attribute and replace it with a
>> "type" attribute that initially supports values VARCHAR, NVARCHAR, INTEGER,
>> and BIGINT and defaults to NVARCHAR. These names are equivalent to the
>> Types constants, but the semantic difference is we would only document
>> these four values instead of documenting "use a constant from Types." This
>> would give us the flexibility to support further types in the future
>> without confusing the user by having to list the 33 constants that they
>> CAN'T use. What about that?
>>
>> Brilliant, wise and future proof. I like it!
>>
>> Gary
>>
>> >
>> > Nick
>> >
>> >>
>> >> Gary
>> >>
>> >>>
>> >>> Nick
>> >>>
>> >>> On Oct 9, 2013, at 5:06 PM, Gary Gregory wrote:
>> >>>
>> >>>> I'd like Nick's feedback on this, so let's see what he has to say.
>> >>>>
>> >>>> WRT process, you should use JIRA to create feature requests and bug
>> >>>> reports. You can than attach SVN a unified diff file to a JIRA. It is
>> >>>> always nice when I see unit tests in the patches too :)
>> >>>>
>> >>>> IMO, about the Unicode stuff, the modern current APIs should be the
>> >>>> default, so I would not change it. Remember that you are dealing with
>> >>>> a non-compliant JDBC driver here, if the driver claims to be JDBC 4
>> >>>> but does not implement all the APIs, then you know who to blame ;)
>> >>>>
>> >>>> Gary
>> >>>>
>> >>>> On Wed, Oct 9, 2013 at 5:55 PM, Tihomir Meščić <
>> tihomir.mes...@gmail.com> wrote:
>> >>>>> Yes, something like that would be great, since this is not only an
>> issue
>> >>>>> with the Integer type, other data types
>> >>>>> are also not supported. I've made my own implementation of the JDBC
>> appender
>> >>>>> that does exactly that. I don't
>> >>>>> know what's the policy of the project, but I'll be happy to
>> contribute the
>> >>>>> code.
>> >>>>>
>> >>>>> There is one more very nasty issue with the JDBC appender - the
>> appender
>> >>>>> will call setNString() method
>> >>>>> on the PreparedStatement by default (this is the unicode version,
>> available
>> >>>>> in JDBC version 4). When using PostgreSQL
>> >>>>> database with the latest JDBC driver this will cause an error when
>> >>>>> inserting. It looked like a bug in log4j but then
>> >>>>> (after a couple of hours of digging through log4j code) it turned
>> out that
>> >>>>> the JDBC driver for Postgres only partially implements JDBC
>> >>>>> version 4 (it does not implement the setNString method) and nobody
>> knows
>> >>>>> when it'll implement the spec completely.
>> >>>>> The fix was to set <Column isUnicode="false" in the appender
>> configuration -
>> >>>>> that way, the setString() method on the PreparedStatement
>> >>>>> would be called.
>> >>>>> IMHO, a more conservative, backwards compatible solution
>> (non-Unicode)
>> >>>>> should be the default...
>> >>>>>
>> >>>>> Kind regards,
>> >>>>> Tihomir
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> 2013/10/9 Gary Gregory <garydgreg...@gmail.com>
>> >>>>>>
>> >>>>>> On Wed, Oct 9, 2013 at 11:24 AM, Tihomir Meščić
>> >>>>>> <tihomir.mes...@gmail.com> wrote:
>> >>>>>>> Ok, my database (Postgresql) has a table (log_entries) that's
>> used for
>> >>>>>>> logging purposes.
>> >>>>>>> One of the attributes is of type INTEGER.
>> >>>>>>> In the new version of the app we are migrating to log4j version 2
>> >>>>>>> (beta9)
>> >>>>>>> and we want to
>> >>>>>>> use the JDBCAppender that bundled with log4j. The INTEGER
>> attribute is
>> >>>>>>> something specific for our
>> >>>>>>> application and we are using ThreadContext (MDC) to set the value
>> of the
>> >>>>>>> parameter.
>> >>>>>>>
>> >>>>>>> Currently, log4j provides no support for integer type attributes
>> in the
>> >>>>>>> Column element of the JDBC appender
>> >>>>>>> configuration (the only things supported are string (default),
>> timestamp
>> >>>>>>> -
>> >>>>>>> isEventTimestamp flag and Clob - isCLob flag).
>> >>>>>>>
>> >>>>>>> When using the default settings in the Column element of the JDBC
>> >>>>>>> appender
>> >>>>>>> log4j will create a prepared statement
>> >>>>>>> and try to set the value using the Statement.setString() method.
>> Of
>> >>>>>>> course,
>> >>>>>>> the JDBC driver throws an excpetion:
>> >>>>>>>
>> >>>>>>> Caused by: org.postgresql.util.PSQLException: ERROR: column
>> "mn_type_d"
>> >>>>>>> is
>> >>>>>>> of type integer but expression is of type character varying
>> >>>>>>> Hint: You will need to rewrite or cast the expression.
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> My appender:
>> >>>>>>>
>> >>>>>>>   <JDBC name="jdbcAppender" tableName="log_entries">
>> >>>>>>>     <DriverManager url="jdbc:postgresql://10.28.10.32:5432/xxx"
>> >>>>>>> username="xxx" password="xxx" />
>> >>>>>>>     <Column name="log_entries_id"
>> >>>>>>> literal="nextval('hibernate_sequence')"
>> >>>>>>> />
>> >>>>>>>
>> >>>>>>>     .....
>> >>>>>>>     <Column name="message" isUnicode="false" pattern="%message" />
>> >>>>>>>
>> >>>>>>>     <Column name="mn_type_d" isUnicode="false"
>> pattern="%X{mn_type_d}"
>> >>>>>>> />
>> >>>>>>> <-- this is of type integer in the DB but LOG4J tries to insert
>> it as a
>> >>>>>>> String  -->
>> >>>>>>>   </JDBC>
>> >>>>>>
>> >>>>>> So maybe we need to be able to say:
>> >>>>>>
>> >>>>>> <Column name="mn_type_d" pattern="%X{mn_type_d}" type="INTEGER" />
>> >>>>>>
>> >>>>>> Where type is a name from java.sql.Types.
>> >>>>>>
>> >>>>>> Nick? Thoughts?
>> >>>>>>
>> >>>>>> Gary
>> >>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> Kind regards,
>> >>>>>>> Tihomir
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> 2013/10/9 Gary Gregory <garydgreg...@gmail.com>
>> >>>>>>>>
>> >>>>>>>> Hi Tihomir,
>> >>>>>>>>
>> >>>>>>>> Can you be more descriptive please with a practical example?
>> >>>>>>>>
>> >>>>>>>> Gary
>> >>>>>>>>
>> >>>>>>>> On Wed, Oct 9, 2013 at 10:43 AM, Tihomir Meščić
>> >>>>>>>> <tihomir.mes...@gmail.com> wrote:
>> >>>>>>>>> Hi everyone,
>> >>>>>>>>>
>> >>>>>>>>> there is a missing feature in the JDBCAppender for log4j
>> version 2,
>> >>>>>>>>> it
>> >>>>>>>>> does
>> >>>>>>>>> not support data types
>> >>>>>>>>> other than string, date and clob. So for example, if the table
>> you
>> >>>>>>>>> are
>> >>>>>>>>> trying to log to has an Integer
>> >>>>>>>>> column, there is way to force log4j to insert it. I ended up
>> writing
>> >>>>>>>>> my
>> >>>>>>>>> own
>> >>>>>>>>> JDBC appender. I think
>> >>>>>>>>> that this feature is very important and it should definitively
>> be
>> >>>>>>>>> included
>> >>>>>>>>> in the final version.
>> >>>>>>>>>
>> >>>>>>>>> Log4j version: 2.0.0-beta9
>> >>>>>>>>>
>> >>>>>>>>> Kind regards,
>> >>>>>>>>> Tihomir
>> >>>>>>>>
>> >>>>>>>>
>> >>>>>>>>
>> >>>>>>>> --
>> >>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>> >>>>>>>> Java Persistence with Hibernate, Second Edition
>> >>>>>>>> JUnit in Action, Second Edition
>> >>>>>>>> Spring Batch in Action
>> >>>>>>>> Blog: http://garygregory.wordpress.com
>> >>>>>>>> Home: http://garygregory.com/
>> >>>>>>>> Tweet! http://twitter.com/GaryGregory
>> >>>>>>>>
>> >>>>>>>>
>> ---------------------------------------------------------------------
>> >>>>>>>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
>> >>>>>>>> For additional commands, e-mail:
>> log4j-dev-h...@logging.apache.org
>> >>>>>>>>
>> >>>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>> --
>> >>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>> >>>>>> Java Persistence with Hibernate, Second Edition
>> >>>>>> JUnit in Action, Second Edition
>> >>>>>> Spring Batch in Action
>> >>>>>> Blog: http://garygregory.wordpress.com
>> >>>>>> Home: http://garygregory.com/
>> >>>>>> Tweet! http://twitter.com/GaryGregory
>> >>>>>>
>> >>>>>>
>> ---------------------------------------------------------------------
>> >>>>>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
>> >>>>>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org
>> >>>>>>
>> >>>>>
>> >>>>
>> >>>>
>> >>>>
>> >>>> --
>> >>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>> >>>> Java Persistence with Hibernate, Second Edition
>> >>>> JUnit in Action, Second Edition
>> >>>> Spring Batch in Action
>> >>>> Blog: http://garygregory.wordpress.com
>> >>>> Home: http://garygregory.com/
>> >>>> Tweet! http://twitter.com/GaryGregory
>> >>>>
>> >>>> ---------------------------------------------------------------------
>> >>>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
>> >>>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org
>> >>>>
>> >>>
>> >>
>> >>
>> >>
>> >> --
>> >> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>> >> Java Persistence with Hibernate, Second Edition
>> >> JUnit in Action, Second Edition
>> >> Spring Batch in Action
>> >> Blog: http://garygregory.wordpress.com
>> >> Home: http://garygregory.com/
>> >> Tweet! http://twitter.com/GaryGregory
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
>> >> For additional commands, e-mail: log4j-dev-h...@logging.apache.org
>> >>
>> >
>>
>>
>>
>> --
>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>> Java Persistence with Hibernate, Second Edition
>> JUnit in Action, Second Edition
>> Spring Batch in Action
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-dev-unsubscr...@logging.apache.org
>> For additional commands, e-mail: log4j-dev-h...@logging.apache.org
>>
>>
>

Reply via email to