Problem statement
As we know Grails application used its common configuration mechanism to
provide the settings for log4j so for this we just need to add the log4j setting in
grails-pp/conf/Config.groovy but when this application goes live as a part of war we can’t set the logging level until we deploy the new war by making change is log4j settings.So externalization allows you to change the logs with just a server restart.
Below are the steps I perform to externalize the grails log4j settings.
1) Crete the log4j.xml by referring the log4j block in Config.groovy
below is the xml representation of grails log4j block
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false" threshold="null">
<appender name="stacktraceLog" class="org.apache.log4j.FileAppender">
<param name="file" value="changeme/logs/stackTrace.log"/>
<param name="name" value="stackTraceLog"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%d [%t] %-5p %c{2} %x - %m%n"/>
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="changeme/logs/catalina.out" />
<param name="Threshold" value="INFO"/>
<param name="Append" value="true"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS Z} [Thread: %t ] level=%-5p %m%n"/>
</layout>
</appender>
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="name" value="stdout"/>
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS Z} level=%-5p class=%c %X{uniqueId} %X{hostname} %X{requestURI} %X{clientIP} %X{userId} %X{realmId} %X{sessionId} %X{locale} %X{callingHost} %X{uniqueIdCallingHost} %X{asyncUserId} %X{isAsync} %X{taskId} %m%n"/>
</layout>
</appender>
<!-- FOR STACKTRACE -->
<logger name="StackTrace" additivity="false">
<appender-ref ref="stacktraceLog"/>
</logger>
<!-- FROM GRAILS-->
<logger name="org.codehaus.groovy.grails.web.servlet">
<level value="ERROR"/>
</logger>
<logger name="org.codehaus.groovy.grails.web.pages">
<level value="ERROR"/>
</logger>
<logger name="org.codehaus.groovy.grails.web.sitemesh">
<level value="ERROR"/>
</logger>
<logger name="org.codehaus.groovy.grails.web.mapping.filter">
<level value="ERROR"/>
</logger>
<logger name="org.codehaus.groovy.grails.web.mapping">
<level value="ERROR"/>
</logger>
<logger name="org.codehaus.groovy.grails.commons">
<level value="ERROR"/>
</logger>
<logger name="org.codehaus.groovy.grails.plugins">
<level value="ERROR"/>
</logger>
<logger name="org.codehaus.groovy.grails.orm.hibernate">
<level value="ERROR"/>
</logger>
<logger name="org.springframework">
<level value="ERROR"/>
</logger>
<logger name="org.hibernate">
<level value="INFO"/>
</logger>
<logger name="org">
<level value="ERROR"/>
</logger>
<logger name="org.mortbay.log">
<level value="WARN"/>
</logger>
<logger name="com.opensymphony">
<level value="WARN"/>
</logger>
<!-- FROM GRAILS END -->
<category additivity="true" name="net.sf">
<priority value="INFO"/>
</category>
<category additivity="false" name="org.apache">
<priority value="INFO"/>
<appender-ref ref="FILE"/>
</category>
<root>
<level value="DEBUG"/>
<appender-ref ref="stdout"/>
<appender-ref ref="APPLOG"/>
<appender-ref ref="FILE"/>
</root>
</log4j:configuration>
2) Remove the log4j block from the Config.groovy i.e. log4j = { }
3) Add below log4jConfigurer bean in groovy class
/grails-app/conf/spring/resources.groovy and set the path of externalize log4j.xml
log4jConfigurer(org.springframework.beans.factory.config.
MethodInvokingFactoryBean){
targetClass = "org.springframework.util.Log4jConfigurer"
targetMethod = "initLogging"
arguments = "path/to/external/log4j/log4j.xml"
}
This will allow you to configure grails log externally !!!
No comments:
Post a Comment