# ***************************************************************************************************************************
# * 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.                                              *
# ***************************************************************************************************************************

#=======================================================================================================================
# Basic configuration file for SaaS microservices
# Subprojects can use this as a starting point.
#=======================================================================================================================

# What to do when the config file is saved.
# Possible values:
# 	NOTHING - Don't do anything. (default)
#	RESTART_SERVER - Restart the Jetty server.
#	RESTART_SERVICE - Shutdown and exit with code '3'.
saveConfigAction = RESTART_SERVER

#=======================================================================================================================
# Jetty settings
#=======================================================================================================================
[Jetty]

# Path of the jetty.xml file used to configure the Jetty server.
config = jetty.xml

# Resolve Juneau variables in the jetty.xml file.
resolveVars = true

# Port to use for the jetty server.
# You can specify multiple ports.  The first available will be used.  '0' indicates to try a random port.
# The resulting available port gets set as the system property "availablePort" which can be referenced in the 
# jetty.xml file as "$S{availablePort}" (assuming resolveVars is enabled).
port = 10000,0,0,0

#=======================================================================================================================
# REST settings
#=======================================================================================================================
[REST]

# Stylesheet to use for HTML views.
# The default options are:
#  - servlet:/styles/juneau.css
#  - servlet:/styles/devops.css
# Other stylesheets can be referenced relative to the servlet package or working directory.
stylesheet = servlet:/styles/devops.css

#=======================================================================================================================
# Logger settings
#-----------------------------------------------------------------------------------------------------------------------
# See FileHandler Java class for details.
#=======================================================================================================================
[Logging]

# The directory where to create the log file.
# Default is "."
logDir = logs

# The name of the log file to create for the main logger.
# The logDir and logFile make up the pattern that's passed to the FileHandler
# constructor.
# If value is not specified, then logging to a file will not be set up.
logFile = microservice.%g.log

# Whether to append to the existing log file or create a new one.
# Default is false.
append = 

# The SimpleDateFormat format to use for dates.
# Default is "yyyy.MM.dd hh:mm:ss".
dateFormat = 

# The log message format.
# The value can contain any of the following variables:
# 	{date} - The date, formatted per dateFormat.
#	{class} - The class name.
#	{method} - The method name.
#	{logger} - The logger name.
#	{level} - The log level name.
#	{msg} - The log message.
#	{threadid} - The thread ID.
#	{exception} - The localized exception message.
# Default is "[{date} {level}] {msg}%n".
format =

# The maximum log file size.
# Suffixes available for numbers.
# See ConfigFile.getInt(String,int) for details.
# Default is 1M.
limit = 10M

# Max number of log files.
# Default is 1.
count = 5

# Default log levels.
# Format is lax-JSON.
# Keys are logger names.
# Values are serialized Level POJOs (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST)
levels = 
	{ 
		'': 'WARNING', 
		org.apache.juneau: 'WARNING', 
		org.eclipse.jetty: 'WARNING' 
	}

# Only print unique stack traces once and then refer to them by a simple 8 character hash identifier.
# Useful for preventing log files from filling up with duplicate stack traces.
# Default is false.
useStackTraceHashes = true

# The default level for the console logger.
# Values are serialized Level POJOs (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST)
# Default is WARNING.
consoleLevel = WARNING

# The default level for the file logger.
# Values are serialized Level POJOs (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST)
# Default is INFO.
fileLevel = INFO

#=======================================================================================================================
# System properties
#-----------------------------------------------------------------------------------------------------------------------
# These are arbitrary system properties that are set during startup.
#=======================================================================================================================
[SystemProperties]

# Configure Jetty for StdErrLog Logging
# org.eclipse.jetty.util.log.class = org.eclipse.jetty.util.log.StrErrLog

# Configure Jetty to log using java-util logging
org.eclipse.jetty.util.log.class = org.apache.juneau.microservice.JettyLogger

# Jetty logging level
# Possible values:  ALL, DEBUG, INFO, WARN, OFF
org.eclipse.jetty.LEVEL = WARN

derby.stream.error.file = $C{Logging/logDir}/derby-errors.log
