#
# 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.
#
log4j.rootLogger=INFO, STDOUT

log4j.logger.org.apache.nemo.runtime.master.metric.MetricManagerMaster=INFO, METRIC
log4j.additivity.org.apache.nemo.runtime.master.metric.MetricManagerMaster=false

log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss,SSS} %C{1}:%L [%t] - %m%n

log4j.appender.METRIC=org.apache.log4j.FileAppender
log4j.appender.METRIC.File=metric.log
log4j.appender.METRIC.layout=org.apache.log4j.PatternLayout
log4j.appender.METRIC.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss,SSS} %C{1}:%L [%t] - %m%n


# Sample appender
#log4j.appender.file=org.apache.log4j.RollingFileAppender
#log4j.appender.file.File=.\\logging.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss,SSS} %C{1}:%L [%t] - %m%n
