////
    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 Scala 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 Scala API binary (tar.gz)
|https://www.apache.org/dyn/closer.lua/logging/log4j/scala/{project-version}/apache-log4j-scala-{project-version}-bin.tar.gz[apache-log4j-scala-{project-version}-bin.tar.gz]
|https://www.apache.org/dist/logging/log4j/scala/{project-version}/apache-log4j-scala-{project-version}-bin.tar.gz.asc[apache-log4j-scala-{project-version}-bin.tar.gz.asc]

|Apache Log4j Scala API binary (zip)
|https://www.apache.org/dyn/closer.lua/logging/log4j/scala/{project-version}/apache-log4j-scala-{project-version}-bin.zip[apache-log4j-scala-{project-version}-bin.zip]
|https://www.apache.org/dist/logging/log4j/scala/{project-version}/apache-log4j-scala-{project-version}-bin.zip.asc[apache-log4j-scala-{project-version}-bin.zip.asc]

|Apache Log4j Scala API source (tar.gz)
|https://www.apache.org/dyn/closer.lua/logging/log4j/scala/{project-version}/apache-log4j-scala-{project-version}-src.tar.gz[apache-log4j-scala-{project-version}-src.tar.gz]
|https://www.apache.org/dist/logging/log4j/scala/{project-version}/apache-log4j-scala-{project-version}-src.tar.gz.asc[apache-log4j-scala-{project-version}-src.tar.gz.asc]

|Apache Log4j Scala API source (zip)
|https://www.apache.org/dyn/closer.lua/logging/log4j/scala/{project-version}/apache-log4j-scala-{project-version}-src.zip[apache-log4j-scala-{project-version}-src.zip]
|https://www.apache.org/dist/logging/log4j/scala/{project-version}/apache-log4j-scala-{project-version}-src.zip.asc[apache-log4j-scala-{project-version}-src.zip.asc]
|===

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,sh,subs=attributes]
----
gpg --import KEYS
gpg --verify apache-log4j-scala-{project-version}-bin.tar.gz.asc apache-log4j-scala-{project-version}-bin.tar.gz
gpg --verify apache-log4j-scala-{project-version}-bin.zip.asc apache-log4j-scala-{project-version}-bin.zip
gpg --verify apache-log4j-scala-{project-version}-src.tar.gz.asc apache-log4j-scala-{project-version}-src.tar.gz
gpg --verify apache-log4j-scala-{project-version}-src.zip.asc apache-log4j-scala-{project-version}-src.zip
----

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

=== Using SBT

How to add Log4j Scala API to your project using Log4j 2:

.build.sbt
[source,scala,subs=attributes]
----
libraryDependencies ++= Seq(
  "org.apache.logging.log4j" %% "log4j-api-scala" % "{project-version}",
  "org.apache.logging.log4j" % "log4j-core" % "2.11.0" % Runtime
)
----
