EclipseLink/Examples/Foundation/Logging
From Eclipsepedia
How do I integrate with a third party logging framework
EclipseLink's default logging is based on Java (1.4 an higher) java.util.logging but is also extensible to allow other logging frameworks to be used.
Contents |
EclipseLink User Guide References
This how-to example will illustrate how other logging solutions such as Log4J and Apache common logging can be easily used with EclipseLink.
References
How to configure a custom logger in JPA
Logging Extension Basics
Customizing EclipseLink to use another logging framework or integrate with an existing logging infrastructure involves:
- Implementing your own SessionLog
- Configuring the use of your SessionLog
Using Log4J
Two bug reports exist for that point :
The first deals about apache commons Logging 1.1 & Log4J integration with eclipseLink 1.x and the second about Log4J integration only.
Both propose custom implementations for the abstract SessionLog class.
How to use Log4J :
- add apache commons logging 1.1 & log4J libraries in your classpath
- add the sample log4.xml in your classpath : log4j.xml template
- add the following classes in the org.eclipse.persistence.logging package of your own project : CommonsLoggingSessionLog class : FastLogFormatter class
- add the following lines to your persistence.xml :
<!-- custom SessionLog implementation to use apache commons logging 1.1 API (so log4J) --> <property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.CommonsLoggingSessionLog"/>
- Compile & deploy your code : that's done.
About log4J levels & eclipselink log levels :
Altough the log4j.xml defines a log4J level for the 'org.eclipse.persistence' logger, the CommonsLoggingSessionLog overrides that level at runtime to be compatible with the chosen eclipselink.logging.level :
For example, in log4j.xml :
<logger name="org.eclipse.persistence">
<level value="info"/>
</logger>
In persistence.xml :
<!-- # ----------------------------------------------------------------------------- # Logging level : # OFF \u2013 disables logging # SEVERE \u2013 logs exceptions indicating EclipseLink cannot continue, as well as any exceptions generated during login. This includes a stack trace. # WARNING \u2013 logs exceptions that do not force EclipseLink to stop, including all exceptions not logged with severe level. This does not include a stack trace. # INFO \u2013 logs the login/logout per sever session, including the user name. After acquiring the session, detailed information is logged. # CONFIG \u2013 logs only login, JDBC connection, and database information. # FINE \u2013 logs SQL. # FINER \u2013 similar to warning. Includes stack trace. # FINEST \u2013 includes additional low level information. # # ----------------------------------------------------------------------------- --> eclipselink.logging.level = SEVERE
However, you should check that your root logger and appenders are well defined to produce log outputs (console, files or whatever appender ...)
Change Log levels at runtime : As you may not know, log4J levels can be changed at runtime for debug purposes : see the CommonsLoggingSessionLog#setLevel() method :
/**
* PUBLIC: Set the log level to a logger with name space extracted from the given category.
*
* @param level value according to the java.util.logging.Levels
* @param category category
*/
@Override
public final void setLevel(final int level, final String category)
Using Apache Commons Logging
An eclipselink bug report exists : : apache commons Logging 1.1 & Log4J integration
It deals about apache commons Logging 1.1 & Log4J integration with eclipseLink 1.x.
To use Apache Commons Logging without Apache Log4J, you can get inspired by this class :
: CommonsLoggingSessionLog class
Just remove any reference to org.apache.log4j classes ...
Please contribute to eclipselink then.