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


# An example log4j configuration file that directs its logging output
# to a SocketAppender. The SocketAppender is configuted to send its
# output to a server running on the localhost port number 12345.

# To test this example, you must start a log4j server with the command
#
#
#  java org.apache.log4j.net.SocketServer 12345 configurationFile directory/
#
#

# For the general syntax of property based configuration files see
# the documenation of org.apache.log4j.PropertyConfigurator.

# The root logger uses the appender called A1. 

log4j.rootLogger=DEBUG, A1

# A1 is set to be a SocketAppender sending its output to the server
running on the local host, port 12345.

log4j.appender.A1=org.apache.log4j.net.SocketAppender
log4j.appender.A1.Port=12345
log4j.appender.A1.RemoteHost=localhost

# In this example, we are not interested in INNER loop or SWAP
# messages.  You might try to set INNER and SWAP to DEBUG for more
# verbose output.

log4j.logger.org.apache.log4j.examples.SortAlgo.INNER=INFO
log4j.logger.org.apache.log4j.examples.SortAlgo.SWAP=INFO
