#/**
# * 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.org.apache.distributedlog.util.MonitoredFuturePool=INFO, Executors
log4j.logger.org.apache.distributedlog.util.MonitoredScheduledThreadPoolExecutor=INFO, Executors
log4j.logger.org.apache.bookkeeper.util.SafeRunnable=INFO, Executors
log4j.additivity.org.apache.distributedlog.util.MonitoredFuturePool=false
log4j.additivity.org.apache.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
