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

#
# BookKeeper CLI (experimental) log4j configuration (used by `bin/bookkeeper-cli.sh`)
#

# DEFAULT: console appender only
# Define some default values that can be overridden by system properties
bookkeeper.cli.root.logger=INFO,CONSOLE
bookkeeper.cli.log.dir=logs
bookkeeper.cli.log.file=bookkeeper-cli.log

log4j.rootLogger=${bookkeeper.cli.root.logger}

#
# Log INFO level and above messages to the console
#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p %m%n

# verbose console logging
log4j.appender.VERBOSECONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.VERBOSECONSOLE.Threshold=INFO
log4j.appender.VERBOSECONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.VERBOSECONSOLE.layout.ConversionPattern=%m%n

# file logging
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=INFO
log4j.appender.ROLLINGFILE.File=${bookkeeper.cli.log.dir}/${bookkeeper.cli.log.file}
log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n

log4j.logger.verbose=INFO,VERBOSECONSOLE
log4j.logger.org.apache.zookeeper=ERROR
log4j.logger.org.apache.bookkeeper=ERROR
log4j.logger.org.apache.bookkeeper.bookie.BookieShell=INFO
log4j.logger.org.apache.bookkeeper.client.BookKeeperAdmin=INFO
log4j.logger.org.apache.bookkeeper.bookie.InterleavedStorageRegenerateIndexOp=INFO
log4j.logger.org.apache.bookkeeper.tools.cli.commands.bookies.InstanceIdCommand=INFO

