#*
# 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, console

#
# 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
# allows TRACE
log4j.logger.org.apache.torque.util = DEBUG, sql, console
log4j.additivity.org.apache.torque.util = false

#
# Torque log
# allows TRACE
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 = ${applicationRoot}/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 = ${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

#
# sql.log
#
log4j.appender.sql = org.apache.log4j.RollingFileAppender
log4j.appender.sql.file = ${applicationRoot}/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 %C{1} - %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 = ${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

#
# 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 = ${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
