# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE.txt 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
#
#     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.    
#

# Specify the handlers to create in the root logger
# (all loggers are children of the root logger)
# The following creates two handlers
handlers = java.util.logging.ConsoleHandler

# Set the default logging level for the root logger
.level = ALL
    
# Set the default logging level for new ConsoleHandler instances
java.util.logging.ConsoleHandler.level = ALL
        
# Set the default formatter for new ConsoleHandler instances
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# Set the default logging level for the subsystems

# batchmgr subsystem
org.apache.oodt.cas.resource.batchmgr.level = INFO

# monitor subsystem
org.apache.oodt.cas.resource.monitor.level = INFO

# jobqueue subsystem
org.apache.oodt.cas.resource.jobqueue.level = INFO

# scheduler subsystem
org.apache.oodt.cas.resource.scheduler.level = INFO

# system subsystem
org.apache.oodt.cas.resource.system.level = FINE

# control the underlying commons-httpclient transport layer for xmlrpc 
org.apache.commons.httpclient.level = INFO
httpclient.wire.header.level = INFO
httpclient.wire.level = INFO
