Wednesday

Writing weblogic logs to database table

By default, oracle weblogic server logging service uses an implementation, based on the Java Logging APIs by using the LogMBean.isLog4jLoggingEnabled attribute. With a few effort you can use log4j with weblogic logging service. In the Administration Console, you can specify Log4j or keep the default Java Logging implementation. In this blog i will describe how to configure log4j with weblogic logging service and writes all the logs messages to database table.
Most of all cases it's sufficient to writes log on files, however it's better to get all the logs on table to query on it. In our case we have 3 different web logic servers in our project and our consumer need to get all the logs in one central place to diagnose if something goes wrong.
First of all we will create a simple table on our oracle database schema and next configure all other parts.
Here we go:
1)
CREATE TABLE LOGS
(USER_ID VARCHAR2(20),
DOMAIN  varchar2(50),
DATED   DATE NOT NULL,
LOGGER  VARCHAR2(500) NOT NULL,
LEVEL   VARCHAR2(50) NOT NULL,
MESSAGE VARCHAR2(4000) NOT NULL
);

2) Now we will create a log4j.properties file with following contents and save it %DOMAIN_HOME%
log4j.rootLogger=INFO, DB
log4j.logger.com.bea.weblogic.*=INFO, DB

log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
# Set JDBC URL
log4j.appender.DB.URL=jdbc:oracle:thin:@mercury.blu.com:1521:FTSDB
# Set Database Driver
log4j.appender.DB.driver=oracle.jdbc.OracleDriver
# Set database user name and password
log4j.appender.DB.user=xyz
log4j.appender.DB.password=xyz
# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO EXT_LOGS VALUES('%x','OSB_DOMAIN',sysdate,'%C','%p','%m')
log4j.appender.DB.layout=org.apache.log4j.PatternLayout
#log4j.appender.DB.layout.ConversionPattern=%d{dd.mm.yyyy HH:mm:ss.SSS} - %m%n

3) Copy log4j-1.2.9.jar & wllog4j.jar and ojdbc14.jar under domain_root/lib folder.
4) edit setDomainEnv.sh with following JAVA_OPTION parameter
set JAVA_OPTIONS=-Dweblogic.log.Log4jLoggingEnabled=true
which will active log4j for logging service
5) Most critical tips, add following parameter after JAVA_OPTIONS
set LOG4J_CONFIG_FILE=%DOMAIN_HOME%/log4j.properties
which will force weblogic server to read the log4j configure file from the specified location.
6) Restart the server and you should find all the log messages on database table.
You may also use custom connection pool mechanism with a little effort with JDBCAppender.

Friday

Configure apache CXF project to deploy on Weblogic server 10.3.2.0

Last week we have migrated our one of web service project on apache CXF. Apache CXF provides simplified security package to authentication and authorization for web services. As usual we decided to use Weblogic as our favorite application server to deploy and run migrated service. This blog post is consist of a few tips to configure properly Apache CXF project to deploy on Weblogic server. Most of all tips i have got from the following link JAX-WS, CXF and SAAJ on Oracle Weblogic 10.3, but it was not sufficient to deploy successfully, a few additional task needed to deploy Apcahe CXF on Weblogic. This current post is all about this tips.

First of all we must configure and prepare Apache CXF project to deploy.
1) Add the following fragment of xml configuration to you weblogic.xml
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>

which will force weblogic to use library from WEB-INF/lib. By default Apache CXF uses geronimo jax-ws implementations to execute webservices.
2) Add javax.jws.* package name into prefer-application-packages as follows:
<wls:prefer-application-packages>
<wls:package-name>antlr.*</wls:package-name>
<wls:package-name>org.apache.*</wls:package-name>
<wls:package-name>org.joda.time.*</wls:package-name>
<wls:package-name>javax.jws.*</wls:package-name>
</wls:prefer-application-packages>

3) Exclude a few libraries from WEB-INF/lib:
saaj-api and it's implementation saaj-impl. Because of conflict with weblogic saaj-api-1.1.jar. You can exclude these two jars through maven dependencies exclusion feature or through maven-war-plugin.
to avoid this following error
"weblogic.xml.jaxp.RegistrySAXParserFactory cannot be cast to javax.xml.parsers.SAXParserFactory"
you should also exclude xml-apis-*.jar from WEB-INF/lib directory.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
</resource>
</webResources>
<attachClasses>true</attachClasses>
<packagingExcludes>WEB-INF/lib/saaj-api*.jar, WEB-INF/lib/xml-apis-*.jar</packagingExcludes>
</configuration>
</plugin>

After archiving into ear archive it's time to configure Weblogic system properties to deploy.
In a few words you should add the following system property
"-Djavax.xml.soap.MessageFactory=com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl" into Weblogic startup script or setDomainEnv.sh.
This will enable the JSE6 saaj implementation for Weblogic server.