You can segment logging output by assigning log4j categories to specific appenders in
the conf/log4j.xml (or jboss-log4j.xml in 4.2) configuration. For example, the following
<appender name="App1Log" class="org.apache.log4j.FileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"></errorHandler>
<param name="Append" value="false"/>
<param name="File" value="${jboss.server.home.dir}/log/app1.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
...
<category name="com.app1">
<appender-ref ref="App1Log"></appender-ref>
</category>
<category name="com.util">
<appender-ref ref="App1Log"></appender-ref>
</category>
If you have multiple apps with shared classes/categories, and/or want the JBoss categories
to show up in your app log then this approach will not work. There is a new appender filter
called TCLFilter (attached) that will be in the 3.2.4 release that can help with this. You
add the filter to the appender and specify what deployment url should logging be restricted
to. For example, if your app1 deployment was app1.ear, you would use the following additions
to the conf/log4j.xml:
<appender name="App1Log" class="org.apache.log4j.FileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"></errorHandler>
<param name="Append" value="false"/>
<param name="File" value="${jboss.server.home.dir}/log/app1.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
<filter class="org.jboss.logging.filter.TCLFilter">
<param name="AcceptOnMatch" value="true"/>
<param name="DeployURL" value="app1.ear"/>
</filter>
</appender>
...
<root>
<appender-ref ref="CONSOLE"></appender-ref>
<appender-ref ref="FILE"></appender-ref>
<appender-ref ref="App1Log"></appender-ref>
</root>
(see JBCOMMON-27, JBAS-4413 and ASPATCH-236)
Starting with the above listed jboss-common.jar version, first introduced in JBoss 4.0.5_CP06, it is possible to add multiple TCLFilter definitions to an appender. This way, the logging of several applications can be routed to a single file.
Please note that in order to achieve this, the behavior of the TCLFilter has changed! By default, it will not end the filter chain any more, thus all logging events will also land in the filtered log. To get just the log events of one or more applications in a single log file, it is now necessary to end this chain by appending the DenyAllFilter after the last TCLFilter:
<appender name="App1Log" class="org.apache.log4j.FileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"></errorHandler>
<param name="Append" value="false"/>
<param name="File" value="${jboss.server.home.dir}/log/app1.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
<filter class="org.jboss.logging.filter.TCLFilter">
<param name="AcceptOnMatch" value="true"/>
<param name="DeployURL" value="app1.ear"/>
</filter>
<!-- end the filter chain here -->
<filter class="org.apache.log4j.varia.DenyAllFilter"></filter>
</appender>
*Referenced by:*
Note when application is deployed as .war file, it is expanded in a folder under ${jboss.server.home.dir}/temp/deploy directory name as "tmp-exp.war". The correct jboss-log4j.xml should be :
<param name="ConversionPattern" value="%d %-5p %c{1} %m%n"/>
There are no comments on this article