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

On Volunteering

  If you want to volunteer and help with developing Apache log4php, you are highly encouraged to 
  read {{{http://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 {{{http://wiki.apache.org/logging-log4php/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. 
   
  []
