////
    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 Chainsaw 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 Chainsaw 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 Chainsaw 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 Chainsaw 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.

