////
    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.
////
== Download

Apache Log4j Kotlin API is distributed under the https://www.apache.org/licenses/LICENSE-2.0.html[Apache License, version 2.0].
The link in the Mirrors column should display a list of available mirrors with a default selection based on your inferred location.
If you do not see that page, try a different browser.
The checksum and signature are links to the originals on the main distribution server.

|===
|Distribution |Mirrors |Signature

|Apache Log4j Kotlin API binary (tar.gz)
|TODO
|TODO

|Apache Log4j Kotlin API binary (zip)
|TODO
|TODO

|Apache Log4j Kotlin API source (tar.gz)
|TODO
|TODO

|Apache Log4j Kotlin API source (zip)
|TODO
|TODO
|===

It is essential that you verify the integrity of the downloaded files using the PGP or MD5 signatures.
Please read https://httpd.apache.org/dev/verification.html[Verifying Apache HTTP Server Releases] for more information on why you should verify our releases.

The PGP signatures can be verified using PGP or GPG.
First download the https://www.apache.org/dist/logging/KEYS[KEYS] as well as the asc signature file for the relevant distribution.
Make sure you get these files from the https://www.apache.org/dist/logging/[main distribution directory], rather than from a mirror.
Then verify the signatures using:

[source,bash,subs=attributes]
----
gpg --import KEYS
gpg --verify apache-log4j-kotlin-{project-version}-bin.tar.gz.asc apache-log4j-kotlin-{project-version}-bin.tar.gz
gpg --verify apache-log4j-kotlin-{project-version}-bin.zip.asc apache-log4j-kotlin-{project-version}-bin.zip
gpg --verify apache-log4j-kotlin-{project-version}-src.tar.gz.asc apache-log4j-kotlin-{project-version}-src.tar.gz
gpg --verify apache-log4j-kotlin-{project-version}-src.zip.asc apache-log4j-kotlin-{project-version}-src.zip
----

Log4j Kotlin API requires https://logging.apache.org/log4j/2.x/download.html[Log4j API].

=== Using Gradle

TODO

=== Using Maven

TODO
