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

= Migrating from SLF4J

{slf4j-url}[SLF4J] is a logging API whose reference implementation is {logback-url}[Logback], just like xref:manual/api.adoc[Log4j API] is a logging API whose reference implementation is Log4j Core.
In this page we will guide you through migrating from SLF4J to Log4j API as your logging API.

[TIP]
====
Instead of migrating your logging API, SLF4J, are you looking for migrating your logging implementation, Logback?
Please refer to xref:migrate-from-logback.adoc[].
====

.Struggling with the logging API, implementation, and bridge concepts? Click for an introduction.
[%collapsible]
====
include::partial$concepts.adoc[tag=!software-type]
====

[#migrating]
== Migrating

If your application or library logs using SLF4J, you can migrate it to Log4j API as follows:

. Remove `org.slf4j:slf4j-api` dependency

. Follow the instructions shared in the _"Getting started"_ page for xref:manual/getting-started.adoc#using-api[installing `log4j-api` and using it]

. Search for `org.slf4j` usages in your project and replace them with Log4j API equivalents
+
[IMPORTANT]
====
For an exhaustive list of code changes that need to be carried out, refer to https://docs.openrewrite.org/recipes/java/logging/log4j/slf4jtolog4j[the SLF4J to Log4j API migration OpenRewrite recipe].
This you can use to

. either manually follow the described migrations,
. or run OpenRewrite to automatically migrate the code.
====
+
{slf4j-url}/api/org/slf4j/LoggerFactory.html[`org.slf4j.LoggerFactory`]::
Replace its usages with link:javadoc/log4j-api/org/apache/logging/log4j/LogManager.html[`org.apache.logging.log4j.LogManager`].
Note that `LogManager.getLogger(Foo.class)` can be simplified as `LogManager.getLogger()`, if `Foo` is the enclosing class of the field.
+
{slf4j-url}/api/org/slf4j/Logger.html[`org.slf4j.Logger`]::
Replace its usages with link:javadoc/log4j-api/org/apache/logging/log4j/Logger.html[`org.apache.logging.log4j.Logger`].
Since SLF4J's `Logger` is almost a parent of Log4j's `Logger`, most methods should work without any changes.
+
{slf4j-url}/api/org/slf4j/MDC.html[`org.slf4j.MDC`]::
Replace its usages with link:javadoc/log4j-api/org/apache/logging/log4j/ThreadContext.html[`org.apache.logging.log4j.ThreadContext`].

. If you use https://projectlombok.org/features/log[`@Slf4j` from Lombok], you need to replace them with `@Log4j2` instead.

At this stage, you should have your application or library logging using Log4j API.

If it is a library that you migrated,::
then you don't need to take any extra steps.
Unlike applications, libraries should be logging implementation agnostic.
That is, libraries should log through a logging API, but leave the decision of the logging implementation to the application.

If it is an application that you migrated, and you are not using Log4j Core as your logging implementation,::
then you can consider doing so.
Certain xref:manual/api.adoc[Log4j API features] (e.g., xref:manual/garbagefree.adoc[garbage-free logging]) require an end-to-end setup which is mostly possible using Log4j API in combination with Log4j Core.
+
See xref:manual/installation.adoc[] for installing Log4j Core. +
If you are using Logback, refer to xref:migrate-from-logback.adoc[].
