Skip to content

Instantly share code, notes, and snippets.

@jverweijL
Last active July 16, 2024 09:25
Show Gist options
  • Save jverweijL/c3b57f57dbb8045857b1f12a55719977 to your computer and use it in GitHub Desktop.
Save jverweijL/c3b57f57dbb8045857b1f12a55719977 to your computer and use it in GitHub Desktop.
Overriding Liferay 7 portal-log4j.xml

While trying to create a poorman's auditing system with Liferay 7 I ran into some challenges. So to prevent you make the same mistakes you can learn from my mistakes.

First you need to create a portal-log4j-ext.xml that will be used to override portal-log4j.xml Mine looks like this but yours might be totally different:

<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="XML_FILE" class="org.apache.log4j.varia.NullAppender"/>

    <appender class="org.apache.log4j.ConsoleAppender" name="CONSOLE">
        <layout class="org.apache.log4j.EnhancedPatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t][%c{1}:%L] %m%n"/>
        </layout>
    </appender>

    <appender class="org.apache.log4j.rolling.RollingFileAppender" name="TEXT_FILE">
        <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
            <param name="FileNamePattern" value="@liferay.home@/logs/[email protected]@.%d{yyyy-MM-dd}.log"/>
        </rollingPolicy>

        <layout class="org.apache.log4j.EnhancedPatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t][%c{1}:%L] %m%n"/>
        </layout>
    </appender>

    <appender class="org.apache.log4j.rolling.RollingFileAppender" name="AUDIT_FILE">
        <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
            <param name="FileNamePattern" value="@liferay.home@/logs/[email protected]@.%d{yyyy-MM-dd}.log"/>
        </rollingPolicy>

        <layout class="org.apache.log4j.EnhancedPatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t][%c{1}:%L] %m%n"/>
        </layout>
    </appender>

    <category name="com.liferay.demo.googleauthenticator.portlet.action.audit">
        <priority value="ERROR"/>
        <appender-ref ref="AUDIT_FILE"/>
    </category> 

    <root>
        <priority value="INFO"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="TEXT_FILE"/>
        <!-- <appender-ref ref="XML_FILE" /> -->
    </root>

</log4j:configuration>

As you can see I turned off XML logging and added a custom AUDIT logfile for my specific use-case. If you quickly want to generate a file from the original portal-log4j.xml you can use:

cd tomcat/webapps/ROOT/WEB-INF
unzip -p lib/portal-impl.jar META-INF/portal-log4j.xml > /tmp/portal-log4j-ext.xml

Now, where it all went wrong. I tend to keep my custom files in separate directory or in the liferay-home. In my case this is /opt/liferay. To enable the override you must put the portal-log4j-ext.xml in tomcat/webapps/ROOT/WEB-INFclasses/META-INF/. And this is where it went wrong. I used a softlink from /opt/liferay in the META-INF directory but this didn't work. Turns out you can use a hardlink like ln /opt/liferay/portal-log4j-ext.xml /opt/liferay/tomcat/webapps/ROOT/WEB-INFclasses/META-INF/portal-log4j-ext.xml and when you restart it will pick up the override. Took me a while to understand why it didn't work but hey, you are the lucky one ;-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment