#*
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
*#
##set($dollar = '$')
##macro (var $label)${dollar}{${label}}#end
# Turbine logging configuration
#
# If we don't know the logging facility, put it into the
# turbine.log
#
log4j.rootLogger = INFO, app

#
# App log
#
log4j.logger.${package} = DEBUG, app
log4j.additivity.${package} = false

#
# Avalon log
#
log4j.logger.avalon = DEBUG, app
log4j.additivity.avalon = false

#
# Scheduler Category
#
log4j.logger.scheduler = INFO, app
log4j.additivity.scheduler = false

#
# sql log
#
log4j.logger.org.apache.torque.util = DEBUG, sql, console
log4j.additivity.org.apache.torque.util = false

#
# Torque log
#
log4j.logger.org.apache.torque = DEBUG, torque
log4j.additivity.org.apache.torque = false

#
# Turbine goes into "turbine" loggers
#
log4j.logger.org.apache.turbine = INFO, turbine
log4j.additivity.org.apache.turbine = false

#
# Velocity log
#
log4j.logger.velocity = INFO, velocity
log4j.additivity.velocity = false

# #######################################################################
#
# Logfile definitions
#
# #######################################################################

#
# Application.log
#
log4j.appender.app = org.apache.log4j.RollingFileAppender
log4j.appender.app.MaxFileSize=5MB
log4j.appender.app.MaxBackupIndex=5
log4j.appender.app.file = #var("catalina.base")/logs/application.log
log4j.appender.app.layout = org.apache.log4j.PatternLayout
log4j.appender.app.layout.conversionPattern = %d [%t] %-5p %c - %m%n
log4j.appender.app.append = false

#
# turbine.log
#
log4j.appender.turbine = org.apache.log4j.RollingFileAppender
log4j.appender.turbine.MaxFileSize=5MB
log4j.appender.turbine.MaxBackupIndex=5
log4j.appender.turbine.file = #var("catalina.base")/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

#
# sql.log
#
log4j.appender.sql = org.apache.log4j.RollingFileAppender
log4j.appender.sql.file = #var("catalina.base")/logs/sql.log
log4j.appender.sql.MaxFileSize=5MB
log4j.appender.sql.MaxBackupIndex=5
log4j.appender.sql.layout = org.apache.log4j.PatternLayout
log4j.appender.sql.layout.conversionPattern = %d [%t] %-5p %c - %m%n
log4j.appender.sql.append = true

#
# console
#
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern = %d [%t] %-5p - %m%n

#
# torque.log
#
log4j.appender.torque = org.apache.log4j.RollingFileAppender
log4j.appender.torque.MaxFileSize=5MB
log4j.appender.torque.MaxBackupIndex=5
log4j.appender.torque.file = #var("catalina.base")/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

#
# Velocity gets configured to write its output onto the velocity
# category.
#
log4j.appender.velocity = org.apache.log4j.RollingFileAppender
log4j.appender.velocity.MaxFileSize=5MB
log4j.appender.velocity.MaxBackupIndex=5
log4j.appender.velocity.file = #var("catalina.base")/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
