# 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 1.2 file that configures logging for all Accumulo services (Master, TabletServer, GC, and Tracer) except Monitor
## The system properties referenced below are configured by accumulo-env.sh

## Define a console appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.Threshold=ALL
log4j.appender.console.layout.ConversionPattern=%d{ISO8601} [%-8c{2}] %-5p: %m%n
log4j.appender.console.layout=org.apache.log4j.PatternLayout

## Define an appender to send important logs to the the primary Accumulo Monitor
## The primary monitor is the one currently holding a shared lock in ZooKeeper,
## and is typically the one that started first.
log4j.appender.monitor=org.apache.accumulo.monitor.util.AccumuloMonitorAppender
log4j.appender.monitor.Threshold=WARN

## Change this log level from OFF to one of the following to enable audit logging:
##   INFO
##     enables audit logging (inherit appenders from root logger)
##   INFO, audit
##     enables audit logging using the audit log appender
##     (requires audit log file appender above to be uncommented)
log4j.logger.org.apache.accumulo.audit=OFF

## Append logs to the primary Accumulo Monitor
log4j.logger.org.apache.accumulo=INHERITED, monitor

## Constrain some particularly spammy loggers
log4j.logger.org.apache.accumulo.core.file.rfile.bcfile=INFO
log4j.logger.org.mortbay.log=WARN
log4j.logger.org.apache.zookeeper=ERROR

## Append most logs to console
log4j.rootLogger=INFO, console
