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

# For messages from akka, you also need to configure the loglevel in akka configuration
# Please check http://doc.akka.io/docs/akka/snapshot/scala/logging.html for
# more information.

# The logger for all Gearpump daemon processes (including master, worker, local)
gearpump.root.logger=RollingFileAppender
# The log directory for all daemon processes.
# It will be overwritten by Gearpump using value from entry log.daemon.dir in gear.conf.
gearpump.log.dir=logs
# The log file name
# please DON'T modify it, please modify the log file name for each daemon process instead.
gearpump.log.file=gearpump.log

# Log file name for master daemon process
gearpump.master.log.file=gearpump-master-${JVM_NAME}.log
# Log file name for worker daemon process
gearpump.worker.log.file=gearpump-worker-${JVM_NAME}.log
# Log file name for local daemon process
gearpump.local.log.file=gearpump-local-${JVM_NAME}.log

# Log file name for UI daemon process
gearpump.ui.log.file=gearpump-ui-${JVM_NAME}.log

# The username of an application submitter, will be overwritten by Gearpump at runtime.
gearpump.username=user
# The application logger setting
gearpump.application.logger=ApplicationLogAppender
# The root dir for application log, will be overwritten by Gearpump using value from entry log.application.dir in gear.conf.
gearpump.application.log.rootdir=logs
# The log directory for application
gearpump.application.log.dir=${gearpump.application.log.rootdir}/applicationData/${gearpump.username}/${gearpump.master.starttime}/app${gearpump.applicationId}
# The log file name for each application container
gearpump.application.log.file=executor${gearpump.executorId}-${JVM_NAME}.log

# Define the root logger
# This property will be overwritten by system to using "gearpump.root.logger"
# Client side shell will use this log level.

log4j.rootLevel=INFO
log4j.rootAppender=console
log4j.rootLogger=${log4j.rootLevel},${log4j.rootAppender}

# Logging Threshold
log4j.threshhold=ALL

# =====================================================================
# Customize logger for a specific class
# For example, if you want to enable debug log for specific akka class
# akka.remote.RemoteWatcher, you can do like this:
# 1. configure akka.loglevel = "DEBUG" in gear.conf
# 2. set specific logger like this:
#  log4j.logger.akka.remote.RemoteWatcher=DEBUG,${log4j.rootAppender}
# =====================================================================
# log4j.logger.akka.remote.RemoteWatcher=DEBUG,${log4j.rootAppender}

# =====================================================================
# Appenders
# =====================================================================
#
# Rolling File Appender
#
log4j.appender.RollingFileAppender=org.apache.gearpump.util.RecreateRollingFileAppender
log4j.appender.RollingFileAppender.File=${gearpump.log.dir}/${gearpump.log.file}
log4j.appender.RollingFileAppender.checkFileInterval=60
log4j.appender.RollingFileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFileAppender.layout.ConversionPattern=%d{ISO8601} %p %c{1}: %m%n

# Logfile size and and backups
log4j.appender.RollingFileAppender.MaxFileSize=200MB
log4j.appender.RollingFileAppender.MaxBackupIndex=10

#
# console appender
# Add "console" to rootlogger above if you want to use this 
#
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c{1}] %m%n

#
# Application Log Appender
#
log4j.appender.ApplicationLogAppender=org.apache.gearpump.util.RecreateRollingFileAppender
log4j.appender.ApplicationLogAppender.File=${gearpump.application.log.dir}/${gearpump.application.log.file}
log4j.appender.ApplicationLogAppender.checkFileInterval=60

# Logfile size and and 30 backups
log4j.appender.ApplicationLogAppender.MaxFileSize=100MB
log4j.appender.ApplicationLogAppender.MaxBackupIndex=30
log4j.appender.ApplicationLogAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ApplicationLogAppender.layout.ConversionPattern=[%p] [%d{MM/dd/yyyy HH:mm:ss.SSS}] [%c{1}] %m%n

