////
    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

        https://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.
////

= Log4j Support

The Apache Software Foundation does not employ individuals to develop and support any of its projects. The
individuals who contribute to Apache projects do it either as part of specific tasks assigned to them by their
employer, on their own initiative to benefit their employer, or on their own free time. While some projects
at the ASF have employees who are specifically paid to work on the project, none of the committers to any
of the Logging Services projects are directly paid to work on them.

The Log4j project uses https://issues.apache.org/jira/projects/LOG4J2[Jira] as its issue tracking system.
Issues get resolved in one of the following ways:

1. The reporter or another interested party provide a patch attached to the Jira issue, or (preferred) a pull request
is provided at the https://github.com/apache/logging-log4j2[Log4j GitHub site].
2. A committer is interested in the issue and decides to work on it.
3. The reporter or another interested party sponsors one or more of the people listed below to encourage them to
work on the issue.

== GitHub Sponsorship

The following are Log4j committers who accept sponsorship through GitHub. GitHub sponsorship can be used simply as
a way to say thank you for the work that has been done or as a way to encourage specific issues to be worked on. In either
case, while the Apache Logging Services Project thanks you for your support we cannot be responsible for any
promises and/or contributions made by an individual committer as individual commits must be reviewed and accepted
by the project team. While the Logging Services team has accepted the individuals listed below as committers to the
projects, we cannot recommend any particular individual for any specific issue.

==== Committers who accept GitHub Sponsorship

* https://github.com/garydgregory[Gary Gregory]
* https://github.com/rgoers[Ralph Goers]