# Copyright 2001-2008 The Apache Software Foundation.
# * 
# * Licensed 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.rootLogger=INFO, logfile

# in case any output is given to stdout, format it
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${catalina.home}/logs/juddi.log
log4j.appender.logfile.MaxFileSize=512MB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

#log4j.category.org.springframework.beans.property editors.CustomDateEditor=DEBUG

log4j.debug=false

# showing sql
#log4j.category.org.hibernate.hql.ast.QueryTranslatorImpl=DEBUG
#log4j.category.org.hibernate.SQL=DEBUG
#log4j.category.org.hibernate.loader.hql.QueryLoad er=DEBUG 
