#
# 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
# 
#     https://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.

#
# This is a sample apache commons logging configuration file defining logging 
# properties for the JDO TCK. It defines what logging implementation 
# the apache commons logging API should use by specifying the property
# org.apache.commons.logging.Log (see below). Please note, that there are 
# separate property files for each logging implementation to set the log
# level of the loggers:
# - SimpleLog:      simplelog.properties 
# - JDK1.4 logging: logging.properties
#
# The JDO TCK test cases use the following logger instance:
# org.apache.jdo.tck
#

# Uncomment the next line if you want to use the apache simple logger
#org.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog

# Uncomment the next line if you want to use JDK 1.4 logging
#org.apache.commons.logging.Log = org.apache.jdo.tck.util.JDOJdk14Logger

# Uncomment the next line if you want to use Log4j logging
org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger
