On 29/04/2010 11:27, Jamie wrote: > Hi There > > We use multiple web applications running inside Tomcat and need a > painless way for each app to write to its own log file. > > In our scenario, each web application has its own log4j.xml file and the > corresponding log file for each instance is stored in a unique location > for that application, namely: > > WEBAPP/WEB-INF/logs
You're writing logs *inside* the webapp? Yikes!
> (so that each web application has its own log information)
>
> Our log4j.xml file has an appender that looks as follows:
>
> <appender name="debugAppender"
> class="org.apache.log4j.RollingFileAppender">
> <param name="File" value="${ROOT}/WEB-INF/logs/debug.log"/>
There are other variables you can use, e.g.
<param name="File" value="${catalina.base}/logs/debug.log"/>
${catalina.home} will also work.
p
> <param name="MaxFileSize" value="100MB"/>
> <param name="MaxBackupIndex" value="1"/>
> <layout class="org.apache.log4j.PatternLayout">
> <param name="ConversionPattern" value="%5p %d{MMM/dd HH:mm:ss} - %m%n"/>
> </layout>
> </appender>
>
> You'll notice above, we refer to the system property {$ROOT} in the
> log4j.xml file. This Java system variable
> is set when the web application is first initialized. The variable
> during startup as follows:
>
> public class AppServletContext implements ServletContextListener{
> ServletContext context;
>
> public void contextInitialized(ServletContextEvent event) {
> ServletContext context = event.getServletContext();
> String path = context.getRealPath(File.separator);
> if (path.endsWith(File.separator))
> path = path.substring(0,path.length()-1);
> int i = path.lastIndexOf(File.separator);
> String name = path.substring(i+1,path.length());
> System.setProperty(name,path);
> }
>
> public void contextDestroyed(ServletContextEvent event ) {
> }
> }
>
> The effect of the above is to set a Java System Property with the name
> of the instance (e.g. ROOT) and value of the context path on startup. In
> this way, we are able to refer to the context path, from within the
> log4j.xml file. Thus, if the name of the web application being loaded is
> appname... then the Java system system variable APPNAME will be set, and
> we would create a log4j.xml with the variable ${APPNAME} to refer to the
> application path.
>
> While this approach does work, it requires us to update the log4j.xml
> for each instance. We need to change ${ROOT} to ${webappname}. This is a
> pain when there are alot of web applications and each of their log4j.xml
> files need to be updated. Are there any other ideas on how to refer to
> the current Tomcat web application path from with the log4j.xml without
> having to customize a log4j.xml file for each web application. I need a
> simpler more generic way, such as
> <param name="File" value="./WEB-INF/logs/debug.log"/>. Perhaps, there is
> a simpler way that I missed.
>
> Thanks in advance for your consideration
>
> Jamie
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
signature.asc
Description: OpenPGP digital signature
