Change logging package to SLF4J/Log4J in tcServer/Tomcat
I really dislike the JULI logging package which is Tomcat's (and thusly tcServer's) default. Its configuration seems uncomfortable and the log files are almost unreadable without grepping out what you're looking for. In all my other applications I use SLF4J, powered by Log4J. This combination is powerful, easy to configure, and I like that it doesn't put the date of the filename on the log file until after its rotatated. There's been discussion on the Tomcat list recently about maybe changing this in the future, but I'm not very patient and I'd rather not spend the precious little time I do have mucking about with things that are difficult.
The documentation describing the switch from JULI to Log4J isn't very long or informative, though the process itself--to be fair--isn't very complicated. But I get the sense that not many Tomcat developers want to discuss switching from JULI to Log4J, hence the lack of documentation.
Making the switch for tcServer is really only one additional step, though the way tcServer structures its instance directories makes it slightly more complex to configure for use with Log4J.
Due Diligence
Please read the official documenatation on switching from Tomcat JULI to Log4J first. We'll be doing things a little bit differently, but you should understand where we're coming from before simply jumping into this.
Building Tomcat
In order to switch from the default Tomcat JULI package, you'll need to build Tomcat from source, then build the "extras" module. The official documentation leaves out that you have to build the whole server first, then build the extras. If you build only the extras, without building the whole server, you'll end up with ClassNotFound errors when you try to start Tomcat/tcServer.
UPDATE: You can build the extras module from source, but, come to find out, SpringSource has helpfully included the two jar files mentioned in "tomcat-6.0.20.C/bin/extras". You can simply copy those jar files to the locations discussed here rather than building the whole server from source.
Building Tomcat
- I'm using tcServer 6.0, so download the source tarball for Tomcat 6.0.20 and unzip it somewhere.
- "cd" into that directory.
- Copy the build.properties.default file to build.properties.
- "vi" build.properties and uncomment the "jdt.loc" property, which will allow the Ant build to download the JDT compiler, which is a requirement of the build process.
- Increase Ant's heap size: export ANT_OPTS=-Xmx256m
- Build the server: ant
- Once the Tomcat server has been successfully built, build the "extras" module: ant -f extras.xml
When that's finisehd:
- Copy ($TCSERVER_HOME/tomcat-6.0.20.C/bin | $TOMCAT_SRC/output)/extras/tomcat-juli.jar file to $TCSERVER_HOME/tomcat-6.0.20.C/bin/tomcat-juli.jar.
- Copy ($TCSERVER_HOME/tomcat-6.0.20.C/bin | $TOMCAT_SRC/output)/extras/tomcat-juli-adapters.jar to $TCSERVER_HOME/tomcat-6.0.20.C/lib/
- Delete $TCSERVER_INSTANCE_DIR/conf/logging.properties.
Now, copy the Log4J and SLF4J jars. I used the ones from my personal Maven repository (from the $TCSERVER_HOME directory):
cp ~/.m2/repository/log4j/log4j/1.2.15/log4j-1.2.15.jar tomcat-6.0.20.C/lib
cp ~/.m2/repository/org/slf4j/slf4j-api/1.5.8/slf4j-api-1.5.8.jar tomcat-6.0.20.C/lib
cp ~/.m2/repository/org/slf4j/slf4j-log4j12/1.5.8/slf4j-log4j12-1.5.8.jar tomcat-6.0.20.C/lib
cp ~/.m2/repository/org/slf4j/jcl-over-slf4j/1.5.8/jcl-over-slf4j-1.5.8.jar tomcat-6.0.20.C/lib
Configuration
When you've got all the dependencies copied over, you need to put a configuration file in one of two places, depending on how you want to configure logging for your instances. In my case, I use three identical instances (actually, the names of the instances are different, but other than that, they're identical) of tcServer, so I could put my log4j.xml file in tomcat-6.0.20C/lib/. In your case, though, assuming your instances are configured differently from one another, you might want to put your log4j.xml file in (assuming an instance name of "dev1") dev1/lib/.
NOTE: You also need to "vi" the tcServer start script (tcserver-ctl.sh) and comment out the lines that deal with a logging manager and a logging config file (lines 261-262 and 268-269). UPDATE: I actually don't think this is necessary now. I think my errors were caused by something else. I think it's safe to leave these be.
If you're already using Log4J and SLF4J, you've likely already got an example XML file lying around that you could use. Copy that file to one of the locations mentioned previously. Mine looks something like this:
<?xml version="1.0" encoding="UTF-8" ?>
<!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 %-5p %c{1} - %m%n"/>
</layout>
</appender>
<appender name="catalina" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${catalina.base}/logs/catalina.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c{1} - %m%n"/>
</layout>
</appender>
<appender name="vcloud" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${catalina.base}/logs/vcloud.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c{1} - %m%n"/>
</layout>
</appender>
<category name="org.springframework">
<level value="INFO"/>
</category>
<category name="org.quartz">
<level value="INFO"/>
</category>
<category name="org.apache.catalina">
<level value="INFO"/>
<appender-ref ref="catalina"/>
</category>
<category name="com.jbrisbin.vcloud">
<level value="DEBUG"/>
<appender-ref ref="vcloud"/>
</category>
<root>
<level value="INFO"/>
<appender-ref ref="console"/>
</root>
</log4j:configuration>
You can now add categories and appenders to suit your particular needs. You can also change the pattern to suit your tastes.