////
    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 2 Javadoc API Documentation and TLD Documentation

== Javadoc API Documentation

The table below contains links to the Javadoc API Documentation for the components you are most likely to use
directly in code. You can also use the menu links on the left.

|===
|Component |Description

|link:log4j-api/apidocs/index.html[Log4j 2 API]
|The interface that applications should use and code against.

|link:log4j-core/apidocs/index.html[Implementation]
|The standard implementation, also called the Log4j 2 Core, that contains Appenders, Filters, and more.

|link:log4j-iostreams/apidocs/index.html[Log4j IO Streams]
|Extra classes for dealing with older APIs that expect classes from `java.io` for logging.

|link:log4j-taglib/apidocs/index.html[JSP Tag Library]
|The tag library that enables Java-free logging in JavaServer Pages™ using Log4j 2.

|link:log4j-taglib/tlddoc/index.html[JSP Tag Library (TLD Doc)]
|The special Javadoc-like Tag Library Documentation for the Log4j 2 JSP Tag Library.
|===

The table below contains links to the Javadoc API Documentation for all the other Log4j 2 components, which you
likely will not use directly in code but instead will only configure or include in your dependencies.

|===
|Component |Description

|link:log4j-jcl/apidocs/index.html[Commons Logging Bridge]
|A bridge that permits applications written against the Apache Commons Logging API to log using Log4j 2.

|link:log4j-slf4j-impl/apidocs/index.html[SLF4J Binding]
|A bridge that permits applications written against the SLF4J API to log using Log4j 2.

|link:log4j-jul/apidocs/index.html[Java Util Logging Adapter]
|A bridge that permits applications written against the `java.util.logging` API to log using Log4j 2.

|link:log4j-1.2-api/apidocs/index.html[Log4j 1.2 API Bridge]
|A bridge that permits applications written against the Log4j 1.2.x API to log using Log4j 2.

|link:log4j-to-slf4j/apidocs/index.html[Log4j 2 to SLF4J Adapter]
|An adapter that permits applications written against the Log4j 2 API to log using SLF4J.

|link:log4j-flume-ng/apidocs/index.html[Apache Flume Appender]
|An Appender that allows applications to send logging events to Apache Flume Agents.

|link:log4j-jmx-gui/apidocs/index.html[Log4j JMX GUI]
|A Java Swing-based client for remotely viewing the status logger and editing the Log4j configuration.

|link:log4j-jpa/apidocs/index.html[Log4j JPA]
|Apache Log4j Java Persistence API Appender.

|link:log4j-web/apidocs/index.html[Log4j Web Application Support]
|Additional classes that enable multiple configurations within a Servlet Container.

|link:log4j-couchdb/apidocs/index.html[Log4j CouchDB Support]
|Additional Appender for CouchDB.

|link:log4j-jdbc-dbcp2/apidocs/index.html[Log4j JDBC DBCP 2]
|Connection source for the JDBC Appender using Apache Commons DBCP2.

|link:log4j-liquibase/apidocs/index.html[Log4j Liquibase Binding]
|The Apache Log4j Liquibase binding to Log4j 2 Core.

|link:log4j-mongodb3/apidocs/index.html[Log4j MongoDB 3 Support]
|Additional Appender for MongoDB using the version 3 driver.

|link:log4j-mongodb4/apidocs/index.html[Log4j MongoDB 4 Support]
|Additional Appender for MongoDB using the version 4 driver.

|link:log4j-cassandra/apidocs/index.html[Log4j Cassandra Support]
|Additional Appender for Cassandra.
|===
