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

#
# This is a sample apache commons logging configuration file defining logging 
# properties for the JDO RI sources and test cases. 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 RI sources use the following logger instances:
# org.apache.jdo.impl.fostore         File Object Store implementation
# org.apache.jdo.impl.jdoql           JDOQL query runtime
# org.apache.jdo.impl.jdoql.jdoqlc    JDOQL query compiler
# org.apache.jdo.impl.model.jdo       JDOModel implementation
# org.apache.jdo.impl.model.jdo.xml   XML parser for JDO metadata files
# org.apache.jdo.impl.pm              PM and PMF implementation
# org.apache.jdo.impl.sco             SCO implementation
# org.apache.jdo.impl.state           StateManager implementation
# org.apache.jdo.store                Generic StoreManager implementation
# org.apache.jdo.util                 Utility classes
#
# The JDO RI test cases use the following logger instance:
# org.apache.jdo.test
#

# 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 two lines if you want to use JDK 1.4 logging
#org.apache.commons.logging.Log = org.apache.jdo.util.JDOJdk14Logger
