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

#
# DistributedLog Logging Configuration
#

# Default values
dlog.root.logger=INFO, R
dlog.log.dir=logs
dlog.log.file=dlog.log

log4j.rootLogger=${dlog.root.logger}
log4j.logger.org.apache.zookeeper=INFO
log4j.logger.org.apache.bookkeeper=INFO

# redirect executor output to executors.log since slow op warnings can be quite verbose
log4j.logger.com.twitter.distributedlog.util.MonitoredFuturePool=INFO, Executors
log4j.logger.com.twitter.distributedlog.util.MonitoredScheduledThreadPoolExecutor=INFO, Executors
log4j.logger.org.apache.bookkeeper.util.SafeRunnable=INFO, Executors
log4j.additivity.com.twitter.distributedlog.util.MonitoredFuturePool=false
log4j.additivity.com.twitter.distributedlog.util.MonitoredScheduledThreadPoolExecutor=false
log4j.additivity.org.apache.bookkeeper.util.SafeRunnable=false

log4j.appender.Executors=org.apache.log4j.RollingFileAppender
log4j.appender.Executors.Threshold=INFO
log4j.appender.Executors.File=${dlog.log.dir}/executors.log
log4j.appender.Executors.MaxFileSize=20MB
log4j.appender.Executors.MaxBackupIndex=5
log4j.appender.Executors.layout=org.apache.log4j.PatternLayout
log4j.appender.Executors.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.Threshold=INFO
log4j.appender.R.File=${dlog.log.dir}/${dlog.log.file}
log4j.appender.R.MaxFileSize=20MB
log4j.appender.R.MaxBackupIndex=50
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n

log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.Target=System.err
log4j.appender.stderr.Threshold=INFO
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n
