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

dlog.root.logger=INFO, R
dlog.log.dir=.
dlog.log.file=server.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.bookkeeper.util.SafeRunnable=INFO, Executors
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
