#
#  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.
#

log4j.rootCategory=ERROR,logfile,stdout

log4j.logger.TRACE_LOGGER = TRACE,TRACE_APPENDER

# TRACE_LOGFILE is set to be a DailyRollingFileAppender using a PatternLayout.
log4j.appender.TRACE_APPENDER=org.apache.log4j.DailyRollingFileAppender
# Log file will be overridden by the configuration setting in the DB

log4j.appender.TRACE_APPENDER.File=logs/trace.log
log4j.appender.TRACE_APPENDER.Append=true
log4j.appender.TRACE_APPENDER.layout=org.apache.log4j.PatternLayout
log4j.appender.TRACE_APPENDER.layout.ConversionPattern=[%X{ip}] [%X{host}] [%t] %-5p %C{1} - %m %n

# Set the level to DEBUG if you want to log all Exceptions (some of them aren't errors)
#log4j.category.org.apache.axis2=INFO
log4j.category.org.apache.synapse=DEBUG
log4j.category.org.apache.axis2.transport.nhttp=DEBUG

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=[%t] %-5p %C{1} - %m %n

####  appender writes to a file
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=logs/logfile.log


# Control the maximum log file size
log4j.appender.logfile.MaxFileSize=1000KB
# Archive log files (one backup file here)
log4j.appender.logfile.MaxBackupIndex=10

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%6r [%t] %5p %C{1} (%F:%L) - %m%n
