Thursday 2 April 2015

Customize routing of logs + Liferay

In Liferay sometimes we do have some requirements  to route some particular logs to particular folder in particular file.

In liferay we can do that easily without any code change.Liferay provide log4j ext mechanism just to do this kind of stuff.

 When Liferay starts, it reads log4j configuration from "liferay-portal-6.1.20\tomcat-7.0.27\webapps\ROOT\WEB-INF\classes\META-INF"

So as a first step we have to put "portal-log4j-ext.xml" file in above location.

But wait ...before that ;),
 We are using portal-log4j-ext.xml to follow liferay best development processes.You can directly change the portal-log4j.xml but that is not the right way.You can find that file liferay source code in portal implementation package or in portal-impl.jar.

All the routing configuration of logs are written in this file.If you open it than you'll realize how liferay is managing those logs with particular file name in particular folder.

Now lets see the content of this default file provide by Liferay OOB.

 <?xml version="1.0"?>  
 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  
      <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">  
           <layout class="org.apache.log4j.PatternLayout">  
                <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n" />  
           </layout>  
      </appender>  
      
      <appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">  
           <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">  
                <param name="FileNamePattern" value="@liferay.home@/logs/liferay.%d{yyyy-MM-dd}.log" />  
           </rollingPolicy>  
           <layout class="org.apache.log4j.PatternLayout">  
                <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n" />  
           </layout>  
      </appender>  
      <category name="com.ecyrd.jspwiki">  
           <priority value="ERROR" />  
      </category>  
      <category name="com.germinus.easyconf">  
           <priority value="ERROR" />  
      </category>  
      <category name="com.liferay">  
           <priority value="ERROR" />  
      </category>  
      <category name="com.liferay.jdbc">  
           <priority value="ERROR" />  
      </category>  
      
      //removed //;)too long
      <root>  
           <priority value="INFO" />  
           <appender-ref ref="CONSOLE" />  
           <appender-ref ref="FILE" />   
      </root>  
 </log4j:configuration> 

If you want your rule manipulate by liferay then create "portal-log4j-ext.xml" and put that file in "liferay-portal-6.1.20\tomcat-7.0.27\webapps\ROOT\WEB-INF\classes\META-INF".

Now if you want to add your rule like, logs having a string "properties"  in it that should go to another folder name "ExceptionLog" and file name must be "1.log."

So for that you have to add below tag to "portal-log4j-ext.xml" parallel to other appender tag and also put a entry in root tag.


 <appender name="FILE_MINE" class="org.apache.log4j.RollingFileAppender">   
    <param name="maxFileSize" value="10000kb" />   
    <param name="maxBackupIndex" value="20" />   
    <param name="file" value="@liferay.home@/ExceptionLog/1.log" />   
       <layout class="org.apache.log4j.PatternLayout">   
    <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n"/>   
    </layout>   
    <filter class="org.apache.log4j.varia.StringMatchFilter">   
         <param name="StringToMatch" value="properties" />   
         <param name="AcceptOnMatch" value="true" />   
        </filter>   
  </appender>   

For more information for filters as I have added to this snippet you can explore and make very useful rules by visiting below link.
Log4j Filters

Please check the version of the log4j before using the filters some may not be available, if you are using older version of log4j.

GOOD DAY...:)