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

# Define some default values that can be overridden by system properties
webhcat.root.logger = DEBUG, standard
webhcat.log.dir = .
webhcat.log.file = webhcat.log

log4j.rootLogger = ${webhcat.root.logger}

# Logging Threshold
log4j.threshhold = DEBUG

log4j.appender.standard  =  org.apache.log4j.DailyRollingFileAppender
log4j.appender.standard.File = ${webhcat.log.dir}/${webhcat.log.file}

# Rollver at midnight
log4j.appender.DRFA.DatePattern = .yyyy-MM-dd

log4j.appender.DRFA.layout = org.apache.log4j.PatternLayout

log4j.appender.standard.layout = org.apache.log4j.PatternLayout
log4j.appender.standard.layout.conversionPattern = %-5p | %d{DATE} | %c | %m%n

# Class logging settings
log4j.logger.com.sun.jersey = DEBUG
log4j.logger.com.sun.jersey.spi.container.servlet.WebComponent = ERROR
log4j.logger.org.apache.hadoop = INFO
log4j.logger.org.apache.hadoop.conf = WARN
log4j.logger.org.apache.zookeeper = WARN
log4j.logger.org.eclipse.jetty = INFO
