~~ 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.
 ------
Volunteering
 ------
 ------
 ------

On Volunteering

  If you want to volunteer and help with developing Apache log4php, you are highly encouraged to 
  read {{{https://www.apache.org/foundation/getinvolved.html}Apache getting involved}}. If you have
  questions on that document, we might be able to answer them on the developers mailinglist.

  The best way to contribute is to identify for yourself things that you think are broken, or could
  be improved, and then propose a patch.  A couple of ways to identify possible candidates:

  * Have you used Apache log4php, and wished it would do something a little more?  or a little 
    different?  In open source circles, people often get involved initially by "scratching your 
    own itch" as the saying goes.

  * Have a look at the {{{https://issues.apache.org/jira/browse/LOG4PHP}bug reports}} for the 
    log4php project, and seen any bugs that you can create a patch for.

  * Check out the project {{{https://cwiki.apache.org/confluence/display/LOGGINGLOG4PHP/TODO}todo list}} for things that
    have already been thought about, but just are not done yet.
    
  * If you are apt at graphic design, Apache log4php is 
    {{{http://wiki.apache.org/logging-log4php/LogoProposals}looking for a logo}}. Consider donating 
    one. 
   
  []
