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

mumak.root.logger=INFO,console,mumak
mumak.log.dir=.
mumak.log.file=mumak.log
mumak.log.layout=org.apache.log4j.PatternLayout
mumak.log.layout.pattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

#
# null == NullAppender
#

log4j.appender.null=org.apache.log4j.varia.NullAppender

#
# console == ConsoleAppender
#

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=${mumak.log.layout}
log4j.appender.console.layout.ConversionPattern=${mumak.log.layout.pattern}

#
# general mumak output goes here
#
log4j.appender.mumak=org.apache.log4j.FileAppender
log4j.appender.mumak.File=${mumak.log.dir}/${mumak.log.file}
log4j.appender.mumak.layout=${mumak.log.layout}
log4j.appender.mumak.layout.ConversionPattern=${mumak.log.layout.pattern}

#
# job summary output (commenting/uncommenting the following block
# to disable/enable the separate output of such information)
#
mumak.jsa.log.dir=${mumak.log.dir}
mumak.jsa.log.file=mumak-jobs-summary.log
mumak.jsa.logger=INFO,jsa
log4j.appender.jsa=org.apache.log4j.FileAppender
log4j.appender.jsa.File=${mumak.jsa.log.dir}/${mumak.jsa.log.file}
log4j.appender.jsa.layout=org.apache.log4j.PatternLayout
log4j.appender.jsa.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
log4j.logger.org.apache.hadoop.mapred.JobInProgress$JobSummary=${mumak.jsa.logger}
log4j.additivity.org.apache.hadoop.mapred.JobInProgress$JobSummary=false

# Define the root logger to the system property "hadoop.root.logger".
log4j.rootLogger=${mumak.root.logger}

# Logging Threshold
log4j.threshhold=ALL

# Custom Logging levels tuned for mumak

log4j.logger.org.apache.hadoop.net.NetworkTopology=WARN
log4j.logger.org.apache.hadoop.mapred.JobTracker=WARN
log4j.logger.org.apache.hadoop.mapred.ResourceEstimator=WARN
log4j.logger.org.apache.hadoop.mapred.Counters=ERROR
log4j.logger.org.apache.hadoop.io.compress.CodecPool=WARN
log4j.logger.org.apache.hadoop.mapred.CompletedJobStatusStore=WARN
log4j.logger.org.apache.hadoop.mapred.EagerTaskInitializationListener=WARN
log4j.logger.org.apache.hadoop.util.HostsFileReader=WARN
# set the following level to WARN/ERROR to show/ignore situation where task
# info is  missing in the trace
log4j.logger.org.apache.hadoop.tools.rumen.ZombieJob=ERROR
# set the following level to WARN/ERROR to show/ignore false alarms where tasks
# complete after job failed.
log4j.logger.org.apache.hadoop.mapred.JobInProgress=ERROR
#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG
#log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG
