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

############################################################
#   Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################

############################################################
#   Global properties
############################################################

# "handlers" specifies a comma separated list of log Handler
# classes.  These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.

handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
#handlers= java.util.logging.ConsoleHandler
#handlers= java.util.logging.FileHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level
# Note that every handler also has a separate level
# setting to limit messages printed to that handler.
# Possible log levels are:
# SEVERE (highest value)
# WARNING
# INFO
# CONFIG
# FINE
# FINER
# FINEST (lowest value)
# ALL

.level= INFO

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

# default file output is in user's home directory.

# file name pattern:
# "/" the local pathname separator
# "%t" the system temporary directory
# "%h" the value of the "user.home" system property
# "%g" the generation number to distinguish rotated logs
# "%u" a unique number to resolve conflicts
# "%%" translates to a single percent sign "%"
#java.util.logging.FileHandler.pattern = %h/uima%u.log

# output file name with pattern
java.util.logging.FileHandler.pattern = uima.log

# file limit is bytes
#java.util.logging.FileHandler.limit = 10000000

# specifies how many output files to cycle through
#java.util.logging.FileHandler.count = 1

# name of the character set encoding to use (defaults to the default platform encoding)
#java.util.logging.FileHandler.encoding = UTF-8

#specifies whether the FileHandler should append onto any existing files (defaults to false).
java.util.logging.FileHandler.append = false


############################################################
# Formatting the output
############################################################

# define output formatter for each handler
#java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.formatter = org.apache.uima.internal.util.UIMALogFormatter
#java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

#java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.formatter = org.apache.uima.internal.util.UIMALogFormatter

# set an additional message level for each handler
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.FileHandler.level = ALL


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# For example, set the com.xyz.foo logger to only log SEVERE messages:
# com.xyz.foo.level = SEVERE
# if you have a sample annotator in the package org.apache.uima.SampleAnnotator
# you can set the log level by specifying:
# org.apache.uima.SampleAnnotator.level = ALL
