This article shows how to use log4j for both tomcat and solr, besides that, I will also show you the steps to make your own customized log4j appender and use it in tomcat and solr. If you want more information than is found in this blogpost, feel free to visit our website or contact us.
Default Tomcat log mechanism
Tomcat by default uses a customized version of java logging api. The configuration is located at ${tomcat_home}/conf/logging.properties
. It follows the standard java logging configuration syntax plus some special tweaks(prefix property with a number) for identifying logs of different web apps.
An example is below:
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
Default Solr log mechanism
Solr uses slf4j logging, which is kind of wrapper for other logging mechanisms. By default, solr uses log4j syntax and wraps java logging api (which means that it looks like you are using log4j in the code, but it is actually using java logging underneath). It uses tomcat logging.properties as configuration file. If you want to define your own, it can be done by placing a logging.properties under ${tomcat_home}/webapps/solr/WEB-INF/classes/logging.properties
Switching to Log4j
Log4j is a very popular logging framework, which I believe is mostly due to its simplicity in both configuration and usage. It has richer logging features than java logging and it is not difficult to make an extension.
Log4j for tomcat
- Rename/remove
${tomcat_home}/conf/logging.properties
- Add
log4j.properties in ${tomcat_home}/lib
- Add
log4j-xxx.jar in ${tomcat_home}/lib
- Download
tomcat-juli-adapters.jar
from extras and put it into${tomcat_home}/lib
- Download
tomcat-juli.jar
from extras and replace the original version in${tomcat_home}/bin
(extras are the extra jar files for special tomcat installation, it can be found in the bin folder of a tomcat download location, fx. http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.33/bin/extras/)
Log4j for solr
- Add
log4j.properties
in${tomcat_home}/webapps/solr/WEB-INF/classes/
(create classes folder if not present) - Replace
slf4j-jdkxx-xxx.jar
withslf4j-log4jxx-xxx.jar
in${tomcat_home}/webapps/solr/WEB-INF/lib
(which means switching underneath implementation from java logging to log4j logging) - Add
log4jxxx.jar
to${tomcat_home}/webapps/solr/WEB-INF/lib
Make our own log4j file appender
Log4j has 2 types of common fileappender:
DailyRollingFileAppender
– rollover at certain time intervalRollingFileAppender
– rollover at certain size limit
And I found a nice customized file appender:
-
CustodianDailyRollingFileAppender
online.
I happen to need a file appender which should rollover at certain time interverl(each day) and backup earlier logs in backup folder and get zipped. Plus removing logs older than certain days. CustodianDailyRollingFileAppender
already has the rollover feature, so I decide to start with making a copy of this class,
Parameters
Besides the default parameters in DailyRollingFileAppender
, I need 2 more parameters,
Outdir
– backup directory
maxDaysToKeep
– the number of days to keep the log file
You only need to define these 2 parameters in the new class, and add get/set methods for them (no constructor involved). The rest will be handled by log4j framework.
Logging entry point
When there comes a log event, the subAppend(…)
function will be called, inside which a super.subAppend(event)
; will just do the log writing work. So before that function call, we can add the mechanism for back up and clean up.
Clean up old log
Use a file filter to find all log files start with the filename, delete those older than maxDaysToKeep
.
Backup log
Make a separate Thread for zipping the log file and delete original log file afterwards(I found CyclicBarrier very easy to use for this type of wait thread to complete task, and a thread is preferable for avoiding file lock/access ect. problems). Call the thread at the point where current log file needs to be rolled over to backup.
Deploy the customized file appender
Let’s say we make a new jar called log4jxxappender.jar
, we can deploy the appender by copying the jar file to ${tomcat_home}/lib
and in ${tomcat_home}/webapps/solr/WEB-INF/lib
Example configuration for solr,
log4j.rootLogger=INFO, solrlog
log4j.appender.solrlog=com.findwise.xx.log4j.fileappender.YyRollingFileAppender
log4j.appender.solrlog.File=${catalina.home}/logs/solr.log
log4j.appender.solrlog.Append=true
log4j.appender.solrlog.Encoding=UTF-8
log4j.appender.solrlog.DatePattern='.'yyyy-MM-dd
log4j.appender.solrlog.MaxDaysToKeep=10
log4j.appender.solrlog.Outdir=${catalina.base}/logs/backup
log4j.appender.solrlog.layout=org.apache.log4j.PatternLayout
log4j.appender.solrlog.layout.ConversionPattern = %d [%t] %-5p %c - %m%n
Solr.war
Last thing to remember about solr is to zip the deployment folder ${tomcat_home}/webapps/solr
and rename the zip file solr.zip to solr.war. Now you should have a log4j enabled solr.war
file with your customized fileappender.
Want more information, have further questions or need help? Stop by our website or contact us!