~~ 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.
 ------
Issue Tracking
 ------
 ------
 ------

Overview

	This project uses {{{https://www.atlassian.com/software/jira}JIRA}}, a J2EE-based issue tracking
	and project management application.

Issue Tracking

	<<Bugs>> and <<feature requests>> should be submitted to the following issue tracking system
	for this project.

	{{{https://issues.apache.org/jira/browse/LOGCXX}https://issues.apache.org/jira/browse/LOGCXX}}

	<<Please don't just open bugs only because things don't work for you>>, some issues simply
	don't are bugs in the code base of the project or it's build tools, but may have a lot of
	different other reasons. If things don't work for you and you need some help, please subscribe
	to the {{{https://logging.apache.org/log4cxx/mail-lists.html}users mailing list}} and describe
	the issue you have, the more detailed the better. The mailing list is a far better place to
	discuss things than JIRA, besides that there are more users than developers of the project and
	issues created in JIRA are only forwarded to the latter. There's always the chance to create an
	issue in JIRA later, hopefully with a specific explanation of the problem and even a solution
	already.

	As a rule of thumb, if you already digged through the code and found a problem in it or its
	build tools, feel free to directly create a bug in {{{https://issues.apache.org/jira/browse/LOGCXX}JIRA}}.
	But if things really only don't work and you don't have any clue why, please use the {{{https://logging.apache.org/log4cxx/mail-lists.html}users mailing listt}}
	instead.

	Thanks!