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

Apache Chainsaw 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 |Checksum |Signature

|Apache Log4j 2 binary (tar.gz)
|https://www.apache.org/dyn/closer.lua/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-bin.tar.gz[apache-chainsaw-{ChainsawReleaseVersion}-bin.tar.gz]
|https://www.apache.org/dist/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-bin.tar.gz.sha512[apache-chainsaw-{ChainsawReleaseVersion}-bin.tar.gz.sha512]
|https://www.apache.org/dist/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-bin.tar.gz.asc[apache-chainsaw-{ChainsawReleaseVersion}-bin.tar.gz.asc]

|Apache Log4j 2 binary (zip)
|https://www.apache.org/dyn/closer.lua/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-bin.zip[apache-chainsaw-{ChainsawReleaseVersion}-bin.zip]
|https://www.apache.org/dist/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-bin.zip.sha512[apache-chainsaw-{ChainsawReleaseVersion}-bin.zip.sha512]
|https://www.apache.org/dist/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-bin.zip.asc[apache-chainsaw-{ChainsawReleaseVersion}-bin.zip.asc]

|Apache Log4j 2 source (tar.gz)
|https://www.apache.org/dyn/closer.lua/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-src.tar.gz[apache-chainsaw-{ChainsawReleaseVersion}-src.tar.gz]
|https://www.apache.org/dist/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-src.tar.gz.sha512[apache-chainsaw-{ChainsawReleaseVersion}-src.tar.gz.sha512]
|https://www.apache.org/dist/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-src.tar.gz.asc[apache-chainsaw-{ChainsawReleaseVersion}-src.tar.gz.asc]

|Apache Log4j 2 source (zip)
|https://www.apache.org/dyn/closer.lua/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-src.zip[apache-chainsaw-{ChainsawReleaseVersion}-src.zip]
|https://www.apache.org/dist/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-src.zip.sha512[apache-chainsaw-{ChainsawReleaseVersion}-src.zip.sha512]
|https://www.apache.org/dist/logging/chainsaw/{ChainsawReleaseVersion}/apache-chainsaw-{ChainsawReleaseVersion}-src.zip.asc[apache-chainsaw-{ChainsawReleaseVersion}-src.zip.asc]
|===

It is essential that you verify the integrity of the downloaded files
using the PGP or SHA512 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,sh,subs=attributes]
----
gpg --import KEYS
gpg --verify apache-chainsaw-{ChainsawReleaseVersion}-bin.tar.gz.asc apache-chainsaw-{ChainsawReleaseVersion}-bin.tar.gz
gpg --verify apache-chainsaw-{ChainsawReleaseVersion}-bin.zip.asc apache-chainsaw-{ChainsawReleaseVersion}-bin.zip
gpg --verify apache-chainsaw-{ChainsawReleaseVersion}-src.tar.gz.asc apache-chainsaw-{ChainsawReleaseVersion}-src.tar.gz
gpg --verify apache-chainsaw-{ChainsawReleaseVersion}-src.zip.asc apache-chainsaw-{ChainsawReleaseVersion}-src.zip
----

Apache Chainsaw {ChainsawReleaseVersion} is signed by {ChainsawReleaseManager} ({ChainsawReleaseKey}).

Alternatively, you can verify the SHA512 signature on the files. A unix
program called sha512sum is included in many unix distributions.

