Turbine's logging service is exceptionally powerful. And it was proprietary. So we ripped it out post Turbine 2.2 and replaced it with commons-logging backed by Log4j. You configure the new logging with a Log4j.properties file which can be configured with the log4j.file property in TurbineResource.properties:
# ------------------------------------------------------------------- # # L O G 4 J - L O G G I N G # # ------------------------------------------------------------------- # Configure log4j from the log4j properties file log4j.file = WEB-INF/conf/Log4j.properties
If you use another logging system and don't want to configure
the log4j subsystem, you can use the empty string or "none" as
log4j.file
parameter to turn it off.
# ------------------------------------------------------------------- # # L O G 4 J - L O G G I N G # # ------------------------------------------------------------------- # Do not configure Log4J logging. log4j.file = none
To use the Logging system, all you need to do is configure some loggers in your Log4j.properties. This is an example how to do it:
# ------------------------------------------------------------------------ # # Logging Configuration # # $Id: logging-service.xml 581455 2007-10-03 01:05:16Z seade $ # # ------------------------------------------------------------------------ # # If we don't know the logging facility, put it into the # turbine.log # log4j.rootLogger = INFO, turbine # # Turbine goes into Turbine Log # log4j.category.org.apache.turbine = INFO, turbine log4j.additivity.org.apache.turbine = false # # Torque has its own log file # log4j.category.org.apache.torque = INFO, torque log4j.additivity.org.apache.torque = false # # Velocity Logfile # log4j.category.velocity = INFO, velocity log4j.additivity.velocity = false # # Scheduler Category # log4j.category.scheduler = INFO, scheduler log4j.additivity.scheduler = false ######################################################################## # # Logfile definitions # ######################################################################## # # turbine.log # log4j.appender.turbine = org.apache.log4j.FileAppender log4j.appender.turbine.file = ${applicationRoot}/logs/turbine.log log4j.appender.turbine.layout = org.apache.log4j.PatternLayout log4j.appender.turbine.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.turbine.append = false # # torque.log # log4j.appender.torque = org.apache.log4j.FileAppender log4j.appender.torque.file = ${applicationRoot}/logs/torque.log log4j.appender.torque.layout = org.apache.log4j.PatternLayout log4j.appender.torque.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.torque.append = false # # Scheduler Output # log4j.appender.scheduler = org.apache.log4j.FileAppender log4j.appender.scheduler.file = ${applicationRoot}/logs/scheduler.log log4j.appender.scheduler.layout = org.apache.log4j.PatternLayout log4j.appender.scheduler.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.scheduler.append = false # # Velocity gets configured to write its output onto the velocity # category. # log4j.appender.velocity = org.apache.log4j.FileAppender log4j.appender.velocity.file = ${applicationRoot}/logs/velocity.log log4j.appender.velocity.layout = org.apache.log4j.PatternLayout log4j.appender.velocity.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.velocity.append = false
Sub Projects like Torque and Velocity get either configured correctly by their Services (Velocity by the VelocityService) or already know about commons-logging (Torque).
You use the logging by accessing it via commons-logging. This is an example how to do it.
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; // Provide a logger with the class name as category. This // is recommended because you can split your log files // by packages in the Log4j.properties. You can provide // any other category name here, though. private Log log = LogFactory.getLog(this.getClass()); log.info("this message would go to any facility configured to use the " + this.getClass().getName() + " Facility");
It is recommended for performance reasons that you provide a class wide logger like this:
package foo; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class Bar { // Classwide static logger private static Log log = LogFactory.getLog(Bar.class); . . . }