# 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
# 
#     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 one 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 levels
org.apache.oodt.pcs.level = SEVERE
org.apache.oodt.pcs.util.level = SEVERE
org.apache.oodt.pcs.tools.level = SEVERE

# set logging levels for FM interface
org.apache.oodt.cas.filemgr.system.level = SEVERE
org.apache.oodt.cas.pge.util.level = OFF

# set logging levels for WM interface
org.apache.oodt.cas.workflow.system.level = OFF
org.apache.oodt.cas.workflow.instrepo.level = OFF

# control the underlying commons-httpclient transport layer for xmlrpc 
org.apache.commons.httpclient.level = OFF
httpclient.wire.header.level = OFF
httpclient.wire.level = OFF
sun.net.www.protocol.http.level = OFF

