Difference between revisions of "EclipseLink/Examples/Foundation/Logging"

From Eclipsepedia

Jump to: navigation, search
(Using Log4J)
(Using Log4J)
Line 27: Line 27:
  
 
Two bug reports exist for that point :  
 
Two bug reports exist for that point :  
- https://bugs.eclipse.org/bugs/show_bug.cgi?id=232240
+
- [https://bugs.eclipse.org/bugs/show_bug.cgi?id=232240 : apache commons logging & log4J integration]
- https://bugs.eclipse.org/bugs/show_bug.cgi?id=247852
+
- [https://bugs.eclipse.org/bugs/show_bug.cgi?id=247852 : documentation]
  
The first deals about apache commons Logging 1.1 & Log4J integration with eclipseLink 1.0 (so 1.1 should be supported too) and the second about Log4J integration only.
+
The first deals about apache commons Logging 1.1 & Log4J integration with eclipseLink 1.x and the second about Log4J integration only.
  
Both proposed custom implementations for the abstract SessionLog class.
+
Both propose custom implementations for the abstract SessionLog class.
  
  
Line 40: Line 40:
 
- add apache commons logging 1.1 & log4J libraries in your classpath
 
- add apache commons logging 1.1 & log4J libraries in your classpath
  
- add the sample log4.xml in your classpath : https://bugs.eclipse.org/bugs/attachment.cgi?id=103596
+
- add the sample log4.xml in your classpath :  
 +
[https://bugs.eclipse.org/bugs/attachment.cgi?id=103596 : log4j.xml template]
  
- add the following class in the org.eclipse.persistence.logging package of your own project : https://bugs.eclipse.org/bugs/attachment.cgi?id=104821
+
- add the following classes in the org.eclipse.persistence.logging package of your own project :  
 +
[https://bugs.eclipse.org/bugs/attachment.cgi?id=135503 : CommonsLoggingSessionLog class]
 +
[https://bugs.eclipse.org/bugs/attachment.cgi?id=135505 : FastLogFormatter class]
  
 
- add the following lines to your persistence.xml :  
 
- add the following lines to your persistence.xml :  
 
+
<pre>
 
<!-- custom SessionLog implementation to use apache commons logging 1.1
 
<!-- custom SessionLog implementation to use apache commons logging 1.1
 
API (so log4J) -->
 
API (so log4J) -->
 
<property name="eclipselink.logging.logger"
 
<property name="eclipselink.logging.logger"
 
value="org.eclipse.persistence.logging.CommonsLoggingSessionLog"/>
 
value="org.eclipse.persistence.logging.CommonsLoggingSessionLog"/>
 
+
</pre>
  
 
- Compile & deploy your code : that's done.
 
- Compile & deploy your code : that's done.
Line 58: Line 61:
 
'''About log4J levels & eclipselink log levels :'''
 
'''About log4J levels & eclipselink log levels :'''
  
Of course, you should check that the log4J level for the
+
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 :
org.eclipse.persistence logger (and your root logger and appenders) is
+
compatible with the eclipselink.logging.level.
+
  
 
For example, in log4j.xml :
 
For example, in log4j.xml :
 
+
<pre>
 
   <logger name="org.eclipse.persistence">
 
   <logger name="org.eclipse.persistence">
 
     <level value="info"/>
 
     <level value="info"/>
 
   </logger>
 
   </logger>
 +
</pre>
 +
  
 
In persistence.xml :
 
In persistence.xml :
Line 86: Line 89:
 
eclipselink.logging.level = SEVERE
 
eclipselink.logging.level = SEVERE
 
</pre>
 
</pre>
 +
 +
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 :'''
 
'''Change Log levels at runtime :'''
Line 91: Line 98:
  
 
<pre>
 
<pre>
  /**
+
    /**
  * PUBLIC:<p>Set the lw lev to a logger with name space extracted from the given category.</p>
+
    * PUBLIC: Set the log level to a logger with name space extracted from the given category.
  *
+
    *
  * @param level
+
    * @param level value according to the java.util.logging.Levels
  * @param category
+
    * @param category category
  */
+
    */
  @Override
+
    @Override
  public void setLevel(final int level, final String category)
+
    public final void setLevel(final int level, final String category)
 
</pre>
 
</pre>
  

Revision as of 02:32, 16 May 2009

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


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:

  1. Implementing your own SessionLog
  2. Configuring the use of your SessionLog

Using Log4J

Two bug reports exist for that point : - : apache commons logging & log4J integration - : documentation

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 : https://bugs.eclipse.org/bugs/show_bug.cgi?id=232240

It deals about apache commons Logging 1.1 & Log4J integration with eclipseLink 1.0 (so 1.1 should be supported too).


To use Apache Commons Logging without Apache Log4J, you can get inspired by this class : https://bugs.eclipse.org/bugs/attachment.cgi?id=104821

Just remove any reference to org.apache.log4j classes ...

please contribute to eclipselink then.