#
# 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 JDO2 Implementation (FOStore) sources. 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 JDO2 Implementation (FOStore) sources use the following logger instances:
# org.apache.jdo.impl.fostore         File Object Store implementation
# Dependent projects:
# org.apache.jdo.util                 Utility classes
# 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.impl.jdoql           JDOQL query runtime
# org.apache.jdo.impl.jdoql.jdoqlc    JDOQL query compiler
#

# 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

