I just spent the better part of 3 hours trying to get my Rails application logging with Log4j. I've finally got it working, but I'm not sure if what I did is correct. I tried various methods to no avail until my very last attempt. So I'm really looking for some validation here, perhaps some pointers and tips as well -- anything would be appreciated to be honest. I've summarized all my feeble methods into three attempts below. I'm hoping for some enlightenment on where I went wrong with each attempt -- even if it means I get ripped up.
Thanks for the help in advance!
System Specs
- Rails 3.0
- Windows Server 2008
- Log4j 1.2
- Tomact 6.0.29
- Java 6
Attempt 1 - Configured Tomcat to Use Log4J
I basically followed the guide on the Apache Tomcat website here. The steps are:
- Create a
log4j.propertiesfile in$CATALINA_HOME/lib - Download and copy the
log4j-x.y.z.jarinto$CATALINA_HOME/lib - Replace
$CATALINA_HOME/bin/tomcat-juli.jarwith thetomcat-juli.jarfrom the Apache Tomcat Extras folder - Copy
tomcat-juli-adapters.jarfrom the Apache Tomcat Extras folder into$CATALINA_HOME/lib - Delete
$CATALINA_BASE/conf/logging.properties - Start Tomcat (as a service)
Expected Results According to the Guide
I should have seen a tomcat.log file in my $CATALINA_BASE/logs folder.
Actual Results
- No tomcat.log
- Saw three of the standard logs instead
jakarta_service_20101231.logstderr_20101231.logstdout_20101231.log
Question
- Shouldn't I have at least seen a
tomcat.logfile?
Attempt 2 - Use default Tomcat logging (commons-logging)
- Reverted all the changes from the previous setup
Modified
$CATALINA_BASE/conf/logging.propertiesby doing the following:- Adding a setting for my application in the
handlersline:5rails3.org.apache.juli.FileHandler Adding Handler specific properties
5rails3.org.apache.juli.FileHandler.level = FINE 5rails3.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 5rails3.org.apache.juli.FileHandler.prefix = rails3.Adding Facility specific properties
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/rails3].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/rails3].handlers = 4host-manager.org.apache.juli.FileHandler
- Adding a setting for my application in the
Modified my
web.xmlby adding the following context parameter as per the Logging section of the jruby-rack README (I also modified my warbler.rb accordingly, but I opted to change theweb.xmldirectly to test things faster).<context-param> <param-name>jruby.rack.logging</param-name> <param-value>commons_logging</param-value> </context-param>Restarted Tomcat
Results
- A log file was created (
rails3.log), however there was no log information in the file.
Attempt 2A - Use Log4j with existing set up
I decided to give Log4j another whirl with this new web.xml setting.
- Copied the
log4j.jarinto myWEB-INF/libfolder Created a
log4j.propertiesfile and put it intoWEB-INF/classeslog4j.rootLogger=INFO, R log4j.logger.javax.servlet=DEBUG log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=${catalina.base}/logs/rails3.log log4j.appender.R.MaxFileSize=5036KB log4j.appender.R.MaxBackupIndex=4 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss} [%t] %-5p %c %x - %m%nRestarted Tomcat
Results
Same as Attempt 2
NOTE: I used log4j.logger.javax.servlet=DEBUG because I read in the jruby-rack README that all logging output is automatically redirected to the javax.servlet.ServletContext#log method. So I thought this would capture it, but I was obviously wrong.
Question
- Why didn't this work?
- Isn't Log4J using the
commons_loggingAPI?
Attempt 3 - Tried out slf4j (WORKED)
A bit uncertain as to why Attempt 2A didn't work, I thought to myself, maybe I can't use commons_logging for the jruby.rack.logging parameter because it's probably not using commons_logging API... (but I was still not sure). I saw slf4j as an option. I have never heard of it and out of curiosity, I decided to look it up. After reading about it briefly, I thought it was as good of a shot as any and decided to try it out following the instructions here.
Continuing from the setup of Attempt 2A:
- Copied
slf4j-api-1.6.1.jarandslf4j-simple-1.6.1.jarinto myWEB-INF/libfolder - I also copied
slf4j-log4j12-1.6.1.jarinto myWEB-INF/libfolder - Restarted Tomcat
And VIOLA! I now have logging information going into my rails3.log file.
So the big question is:
WTF?
Even though logging seems to be working now, I'm really not sure if what I did is right. So like I said earlier, I'm really looking for some validation more or less. I'd also appreciate any pointers/tips/advice if you have any. Thanks!
We also did various experiments and finally settled with slf4j option. Coming from Java background we knew slf4j, so we didn't go further.
btw, there is no need to copy slf4j-simple-1.6.1.jar into tomcat/lib or WEB-INF/lib when using slf4j-log4jxxx.jar