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

#This file should be deleted when deployed to server (workaround to leiningen classpath putting dev resources on path)
#This file is needed for tests

storm.root.logger=INFO, D

log4j.rootLogger=${storm.root.logger}
#log4j.rootLogger=INFO,stdout, D, jmonitor

### output to console ###
### In order to avoid dead lock, redirect supervisor out/err to /dev/null
### Stdout logger can't be used until manually start worker
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  [%p  %d{yyyy-MM-dd HH:mm:ss} %c{1}:%L %t] %m%n

### output to file ###
log4j.appender.D = org.apache.log4j.RollingFileAppender
log4j.appender.D.File = ${jstorm.log.dir}/${logfile.name}
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.MaxFileSize=1GB
log4j.appender.D.MaxBackupIndex=5
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = [%p  %d{yyyy-MM-dd HH:mm:ss} %c{1}:%L %t] %m%n

log4j.logger.com.alibaba.jstorm=INFO

### jstorm metrics ###
log4j.logger.com.alibaba.jstorm.daemon.worker.metrics= INFO, M
log4j.additivity.com.alibaba.jstorm.daemon.worker.metrics=false
log4j.logger.com.alibaba.jstorm.task.heartbeat= INFO, M
log4j.additivity.com.alibaba.jstorm.task.heartbeat=false
log4j.logger.com.alibaba.jstorm.daemon.worker.hearbeat= INFO, M
log4j.additivity.com.alibaba.jstorm.daemon.worker.hearbeat=false
log4j.logger.com.alibaba.jstorm.metric= INFO, M
log4j.additivity.com.alibaba.jstorm.metric=false

log4j.appender.M = org.apache.log4j.RollingFileAppender
log4j.appender.M.File = ${jstorm.log.dir}/${logfile.name}.metrics
log4j.appender.M.Append = true
log4j.appender.M.Threshold = INFO 
log4j.appender.M.MaxFileSize=100MB
log4j.appender.M.MaxBackupIndex=5
log4j.appender.M.layout = org.apache.log4j.PatternLayout
log4j.appender.M.layout.ConversionPattern = [%p  %d{yyyy-MM-dd HH:mm:ss} %c{1}:%L %t] %m%n

 
##################jmonitor appender ##########################
#log4j.appender.jmonitor=com.alibaba.alimonitor.jmonitor.plugin.log4j.JMonitorLog4jAppender
