Configure ADF12c application to work with log4j2
One of our customers had the requirement to use log4j 2 in his ADF 12c application. When executing his code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.io.Serializable; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import javax.faces.event.ActionEvent; public class LoggingBean implements Serializable { private static final long serialVersionUID = 1L; private static final Logger log = LogManager.getLogger(LoggingBean.class.getName()); public LoggingBean() { } public void logText(ActionEvent actionEvent) { log.info("Text to log"); } } |
an UnsupportedOperationException was thrown.
1 2 3 |
[...] Caused by: java.lang.UnsupportedOperationException: setXIncludeAware is not supported on this JAXP implementation or earlier: class oracle.xml.jaxp.JXDocumentBuilderFactory at javax.xml.parsers.DocumentBuilderFactory.setXIncludeAware(DocumentBuilderFactory.java:614) |
To resolve this issue you can configure your ADF12c application to use a specific implementation of DocumentBuilderFactory. This is quite simple and straightforward. Just configure your weblogic specific deployment descriptor (weblogic-application.xml) to use
1 |
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl |
as application’s DocumentBuilderFactory implementation. This is what worked for us. Other implementations of DocumentBuilderFactory might be valid, too. To configure the DocumentBuilderFactory you can use JDeveloper tooling:
This will put the following lines into your weblogic-application.xml:
1 2 3 4 5 6 7 |
<xml> <parser-factory> <document-builder-factory> com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl </document-builder-factory> </parser-factory> </xml> |
To dodge possible other unsupported operations, we also provided values for SAX Parser Factory and Transformer Factory:
- SAX Parser Factory: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
- Transformer Factory: com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
The screenshot below shows our configuration:
Prerequisites
The following JARs have been added to project’s classpath:
- log4j-api-2.1.jar
- log4j-core-2.1.jar
- log4j-web-2.1.jar
These files are contained within the log4j2 download package.
Follow ups
Without providing any configuration file log4j2 will log our messages on console. To configure another behavior just put a configuration file into your project’s src directory (e.g. ./Model/src or ./ViewController/src). The configuration file itself can be written in XML, JSON, or YAML. For more information on the expected syntax have a look at log4j2’s official documentation.