#
# 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 properties file to configure apache commons logging SimpleLog
# implementation for the JDO TCK test cases. Below you find an entry for each of
# the JDO TCK logger instances. Please uncomment the line and adapt the log 
# level to your needs, in case to want to enable a particular logger.
#

######################
# Loggers
######################

# Root logger
org.apache.commons.logging.simplelog.defaultlog = error

# TCK logger
org.apache.commons.logging.simplelog.log.org.apache.jdo.tck = info

# SpringFramework loggers 
org.apache.commons.logging.simplelog.log.org.springframework = error
org.apache.commons.logging.simplelog.log.org.apache.jdo.tck.pc.company.CompanyModelReader = error
org.apache.commons.logging.simplelog.log.org.apache.jdo.tck.pc.mylib.MylibReader = error

# JDO vendor specific loggers 
#org.apache.commons.logging.simplelog.log.<vendor> = info
