#
#    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 root logger level to WARN and its only appender to CONSOLE
log4j.rootLogger=WARN, CONSOLE, FILE

# log4j properties to work with commandline tools.
log4j.category.org.mortbay=ERROR
log4j.category.org.hibernate.type=WARN
log4j.category.org.objectweb=ERROR
log4j.category.org.apache.ode.axis2=DEBUG
log4j.category.org.apache.ode.bpel.engine=DEBUG
log4j.category.org.apache.ode.bpel.epr=INFO
log4j.category.org.apache.ode.bpel.extvar.jdbc=DEBUG
log4j.category.org.apache.ode.bpel.runtime=DEBUG
log4j.category.org.apache.ode.daohib.bpel.CorrelatorDaoImpl=DEBUG

# Console appender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%p - %C{1}.%M(%L) | %m%n

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=bpel-test.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{MM-dd@HH:mm:ss} %-5p (%13F:%L) %3x - %m%n
log4j.appender.FILE.append=false

