<!--

 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.

-->

<html>
<head>
<title>Proposal for Logging Library Package</title>
</head>
<body bgcolor="white">

<div align="center">
<h1>Proposal for <em>Logging</em> Package</h1>
</div>

<h3>(0) Rationale</h3>

<p>There is a great need for debugging and logging information inside of
Commons components such as HTTPClient and dbcp.  However, there are many
logging APIs out there and it is difficult to choose among them.
</p>

<p>The Logging package will be an ultra-thin bridge between different logging
libraries.  Commons components may use the Logging JAR to remove
compile-time/runtime dependencies on any particular logging package,
and contributors may write Log implementations for the library of their choice.
</p>

<h3>(1) Scope of the Package</h3>

<p>The package shall create and maintain a package that provides extremely
basic logging functionality and bridges to other, more sophisticated logging
implementations.
</p>

<p>
The package should :
<ul>
<li>Have an API which should be as simple to use as possible</li>
<li>Provide support for log4j</li>
<li>Provide pluggable support for other logging APIs</li>
</ul>
</p>

<p>
Non-goals:
<ul>
<li>This package will not perform logging itself, except at the most basic
    level.</li>
<li>We do not seek to become a "standard" API.</li>
</ul>
</p>

<h3>(1.5) Interaction With Other Packages</h3>

<p><em>Logging</em> relies on:
</p>

<ul>
  <li>Java Development Kit (Version 1.1 or later)
  </li>
  <li>Avalon Framework (compile-time dependency only unless this Log
      implementation is selected at runtime)
  <li>Avalon LogKit (compile-time dependency only unless this Log
      implementation is selected at runtime)
  <li>JDK 1.4 (compile-time dependency only unless this log implementation
      is selected at runtime).
  <li>Log4J (compile-time dependency only unless this Log
      implementation is selected at runtime)</li>
  <li><a href="http://sourceforge.net/projects/lumberjack/">Lumberjack</a>
      (compile-time dependency only unless this Log
      implementation is selected at runtime)</li>
</ul>

<h3>(2) Required Jakarta-Commons Resources</h3>

<ul>
<li>CVS Repository - New directory <code>logging</code> in the 
<code>jakarta-commons</code> CVS repository.</li>

<li>Initial Committers - The list is provided below. </li>

<li>Mailing List - Discussions will take place on the general
<em>dev@commons.apache.org</em> mailing list. To help list
subscribers identify messages of interest, it is suggested that the
message subject of messages about this component be prefixed with
[Logging].</li>

<li>Bugzilla - New component "Logging" under the "Commons" product
category, with appropriate version identifiers as needed.</li>

<li>Jyve FAQ - New category "commons-logging" (when available).</li>
</ul>


<h3>(4) Initial Committers</h3>

<p>The initial committers on the Logging component shall be:</p>

<ul>
  <li>Morgan Delagrange</li>
  <li>Rodney Waldhoff</li>
  <li>Craig McClanahan</li>
</ul>

</body>
</html>
