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

# Root logger
log4j.rootLogger=INFO, out, debugFile, osgi:VmLogAppender
log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer

# CONSOLE appender not used by default
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %-5.5p %3.3X{bundle.id} %-30.30c{2} [%-16.16t] %m%n

# Info file appender
log4j.appender.out=org.apache.log4j.RollingFileAppender
log4j.appender.out.layout=org.apache.log4j.PatternLayout
log4j.appender.out.layout.ConversionPattern=%d{ABSOLUTE} %-5.5p %3.3X{bundle.id} %-30.30c{2} [%-16.16t] %m%n
log4j.appender.out.file=${karaf.home}/log/brooklyn.info.log
log4j.appender.out.Threshold=INFO
log4j.appender.out.append=true
log4j.appender.out.maxFileSize=100MB
log4j.appender.out.maxBackupIndex=10

# Debug file appender
log4j.appender.debugFile=org.apache.log4j.RollingFileAppender
log4j.appender.debugFile.layout=org.apache.log4j.PatternLayout
log4j.appender.debugFile.layout.ConversionPattern=%d{ABSOLUTE} %-5.5p %3.3X{bundle.id} %-30.30c{2} [%-16.16t] %m%n
log4j.appender.debugFile.file=${karaf.home}/log/brooklyn.debug.log
log4j.appender.debugFile.append=true
log4j.appender.debugFile.maxFileSize=100MB
log4j.appender.debugFile.maxBackupIndex=10

# Sift appender
log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
log4j.appender.sift.key=bundle.name
log4j.appender.sift.default=brooklyn
log4j.appender.sift.appender=org.apache.log4j.FileAppender
log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
log4j.appender.sift.appender.layout.ConversionPattern=%d{ABSOLUTE} %-5.5p %3.3X{bundle.id} %-30.30c{2} [%-16.16t] %m%n
log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log
log4j.appender.sift.appender.append=true


# Logger configuration

# The following properties turn on quite verbose DEBUG logging for Brooklyn-relevant loggers
log4j.logger.brooklyn=DEBUG
log4j.logger.org.apache.brooklyn=DEBUG
log4j.logger.org.jclouds=DEBUG
log4j.logger.jclouds=DEBUG
io.cloudsoft.winrm4j.winrm.WinRmTool=DEBUG

# If you're just going to have a few debug categories these are recommended;
# comment out the loggers above and leave these as-is
log4.logger.brooklyn.SSH=DEBUG
log4.logger.brooklyn.location.basic.jclouds=DEBUG
log4.logger.brooklyn.util.internal.ssh=DEBUG
log4.logger.org.apache.brooklyn.SSH=DEBUG
log4.logger.org.apache.brooklyn.location.basic.jclouds=DEBUG
log4.logger.org.apache.brooklyn.util.internal.ssh=DEBUG

# a bit noisy at INFO, but still, poss interesting
log4j.logger.org.reflections.Reflections=INFO
log4j.logger.com.sun.jersey.server.impl.application=INFO
log4j.logger.org.apache.whirr.service.ComputeCache=INFO
log4j.logger.jclouds.ssh=INFO
log4j.logger.org.apache.http.impl.client=INFO
log4j.logger.javax.management.remote=INFO

# some loggers are very noisy however, exclude them
log4j.logger.org.apache.cxf=WARN
log4j.logger.net.schmizz=WARN
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.mongodb.driver=WARN

#  Wordnik logs errors in a few places which aren't errors at all; ignore them altogether
# (Turn them back on if you need to see how API-doc gets generated, and also
# see https://github.com/wordnik/swagger-core/issues/58)
log4j.logger.com.wordnik.swagger=OFF

