diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/SpringNativeConfiguration.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/SpringNativeConfiguration.java
index 60899d6ae6d55ebbb760f7bfd54f897f56d2df2d..7209006b8ae74602b72a9a1ef450c6191da8484e 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/SpringNativeConfiguration.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/SpringNativeConfiguration.java
@@ -36,10 +36,10 @@ import org.springframework.aot.hint.RuntimeHintsRegistrar;
 
 import io.fabric8.kubernetes.api.model.KubernetesResource;
 import io.fabric8.kubernetes.api.model.NamedCluster;
-import lombok.extern.slf4j.Slf4j;
+import lombok.extern.log4j.Log4j2;
 
-@Slf4j
-public class SpringNativeConfiguration {
+@Log4j2
+class SpringNativeConfiguration {
 
 	static class KuberenetesCLientImplHints implements RuntimeHintsRegistrar {
 
@@ -96,9 +96,7 @@ public class SpringNativeConfiguration {
 		}
 
 		private void register(RuntimeHints hints, Class<?> clazz) {
-			if (log.isDebugEnabled()) {
-				log.debug("trying to register " + clazz.getName() + " for reflection");
-			}
+			LOG.debug("trying to register {} for reflection.", clazz.getName());
 			hints.reflection().registerType(clazz, MemberCategory.values());
 		}
 	}
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
index 2888571133c3612e3b00179fc20f7e6e98fe332c..5dfe18e1829a508b98120f70fecea25c0fd82050 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakGenericRemoteService.java
@@ -1,31 +1,7 @@
 package de.ozgcloud.operator.keycloak;
 
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
 import java.util.Objects;
 import java.util.Optional;
-import java.util.logging.Level;
 
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.representations.idm.ClientRepresentation;
@@ -34,11 +10,11 @@ import org.keycloak.representations.idm.RoleRepresentation;
 import org.springframework.stereotype.Component;
 
 import lombok.RequiredArgsConstructor;
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
 @RequiredArgsConstructor
 @Component
-@Log
+@Log4j2
 public class KeycloakGenericRemoteService {
 
 	private final Keycloak keycloak;
@@ -61,7 +37,7 @@ public class KeycloakGenericRemoteService {
 	}
 
 	public Optional<RoleRepresentation> getClientRole(String roleName, String realClientId, String realm) {
-		log.log(Level.INFO, "Get role " + roleName + " from client with ID " + realClientId + " in realm " + realm);
+		LOG.info("Get role {} from client with ID {} in realm {}.", roleName, realClientId, realm);
 		return Optional.ofNullable(keycloak.realm(realm).clients().get(realClientId))
 				.orElseThrow(() -> new KeycloakException("Client with ID " + realClientId + " for realm " + realm + " not found."))
 				.roles()
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakResultParser.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakResultParser.java
index 70320488270f14ee88f82c14168a29561d0b576c..28e044c19a17e877843f687c1bdcfd2a6e212f71 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakResultParser.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakResultParser.java
@@ -26,15 +26,14 @@ package de.ozgcloud.operator.keycloak;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.logging.Level;
 
 import javax.ws.rs.core.Response;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
-@Log
+@Log4j2
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class KeycloakResultParser {
 
@@ -43,7 +42,7 @@ public class KeycloakResultParser {
 			String body = null;
 			if (response.hasEntity() && response.getEntity() instanceof InputStream inputStream) {
 				body = new String(inputStream.readNBytes(256), StandardCharsets.UTF_8);
-				log.info("Entity: " + body);
+				LOG.info("Entity: {}.", body);
 			}
 			if (!response.getStatusInfo().equals(Response.Status.CREATED)) {
 				Response.StatusType statusInfo = response.getStatusInfo();
@@ -52,7 +51,7 @@ public class KeycloakResultParser {
 						"expected status: Created (201) with Body: " + body);
 			}
 		} catch (IOException e) {
-			log.log(Level.SEVERE, "Could not parse Keycloak Response", e);
+			LOG.error("Could not parse Keycloak Response", e);
 		}
 	}
 }
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientPreconditionService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientPreconditionService.java
index 758ee2232fe9dfd838e53e9b7140558e2b2a71ce..7491e77768576a3fb8a39defccc618bc2b91ed68 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientPreconditionService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientPreconditionService.java
@@ -36,7 +36,7 @@ class KeycloakClientPreconditionService {
 
 	private final KeycloakGenericRemoteService keycloakGenericRemoteService;
 
-	Optional<String> getReconcilePreconditionErrors(OzgCloudKeycloakClient resource) {
+	public Optional<String> getReconcilePreconditionErrors(OzgCloudKeycloakClient resource) {
 
 		String namespace = resource.getMetadata().getNamespace();
 
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconciler.java
index b881373fe98be29ae2f5a83505793bd7699c7563..72db3ceb868d9d46fbe077cc2dd4437159270b9c 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientReconciler.java
@@ -24,7 +24,6 @@
 package de.ozgcloud.operator.keycloak.client;
 
 import java.util.Optional;
-import java.util.logging.Level;
 
 import org.springframework.stereotype.Component;
 
@@ -35,12 +34,12 @@ import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
 @RequiredArgsConstructor
 @ControllerConfiguration
 @Component
-@Log
+@Log4j2
 public class KeycloakClientReconciler implements Reconciler<OzgCloudKeycloakClient> {
 
 	private final KeycloakClientService service;
@@ -51,9 +50,7 @@ public class KeycloakClientReconciler implements Reconciler<OzgCloudKeycloakClie
 	public UpdateControl<OzgCloudKeycloakClient> reconcile(OzgCloudKeycloakClient resource, Context<OzgCloudKeycloakClient> context) {
 
 		try {
-			String crdName = resource.getMetadata().getName();
-
-			log.info("Reconcile KeycloakClient " + crdName);
+			LOG.info("Reconcile KeycloakClient {}.", resource.getMetadata().getName());
 
 			Optional<String> preconditionError = preconditionService.getReconcilePreconditionErrors(resource);
 			if (preconditionError.isPresent()) {
@@ -64,10 +61,8 @@ public class KeycloakClientReconciler implements Reconciler<OzgCloudKeycloakClie
 
 			return buildStatusOk(resource);
 		} catch (Exception e) {
-			log.log(Level.SEVERE,
-					"Could not reconcile client " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace() + ": "
-							+ e.getMessage(),
-					e);
+			LOG.error("Could not reconcile client {} in namespace {}: {}", resource.getMetadata().getName(), resource.getMetadata().getNamespace(),
+					e.getStackTrace());
 			resource.setStatus(OzgCloudKeycloakClientStatus.builder().status(OzgCloudCustomResourceStatus.ERROR).message(e.getMessage()).build());
 			return UpdateControl.updateStatus(resource).rescheduleAfter(Config.RECONCILER_RETRY_SECONDS);
 		}
@@ -79,9 +74,8 @@ public class KeycloakClientReconciler implements Reconciler<OzgCloudKeycloakClie
 	}
 
 	private UpdateControl<OzgCloudKeycloakClient> buildStatusInProgress(OzgCloudKeycloakClient resource, String errorMessage) {
-		log.log(Level.INFO,
-				"Could not yet reconcile client " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace() + ":"
-						+ errorMessage);
+		LOG.info("Could not yet reconcile client {} in namespace {}: {}", resource.getMetadata().getName(), resource.getMetadata().getNamespace(),
+				errorMessage);
 		resource.setStatus(OzgCloudKeycloakClientStatus.builder().status(OzgCloudCustomResourceStatus.IN_PROGRESS).message(errorMessage).build());
 		return UpdateControl.updateStatus(resource).rescheduleAfter(Config.RECONCILER_RETRY_SECONDS);
 	}
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java
index 7de2a8110af5f261118ca417d873686b32b265c3..c5e0e4f65d07e4dcf89e124ff1198569c861a786 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java
@@ -23,8 +23,6 @@
  */
 package de.ozgcloud.operator.keycloak.client;
 
-import java.util.logging.Level;
-
 import org.keycloak.admin.client.CreatedResponseUtil;
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.admin.client.resource.ClientResource;
@@ -35,11 +33,11 @@ import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakResultParser;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @RequiredArgsConstructor
 @Component
-@Log
 class KeycloakClientRemoteService {
 
 	private final Keycloak keycloak;
@@ -49,7 +47,7 @@ class KeycloakClientRemoteService {
 	}
 
 	public String createClient(ClientRepresentation client, String realm) {
-		log.log(Level.FINE, "Creating client {0} in realm {1}", new String[] { client.getId(), realm });
+		LOG.debug("Creating client {} in realm {}", client.getId(), realm);
 		var response = getRealm(realm).clients().create(client);
 		KeycloakResultParser.parseCreatedResponse(response);
 		return CreatedResponseUtil.getCreatedId(response);
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconciler.java
index 35bb8e31b9fbd8a7c81092ef2348c22d5eb976e5..ce913973a25728dc486ad8bb67d3e11b3d076365 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupReconciler.java
@@ -24,7 +24,6 @@
 package de.ozgcloud.operator.keycloak.group;
 
 import java.util.Optional;
-import java.util.logging.Level;
 
 import org.springframework.stereotype.Component;
 
@@ -35,12 +34,12 @@ import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @RequiredArgsConstructor
 @ControllerConfiguration
 @Component
-@Log
 public class KeycloakGroupReconciler implements Reconciler<OzgCloudKeycloakGroup> {
 
 	private final KeycloakGroupService service;
@@ -50,9 +49,7 @@ public class KeycloakGroupReconciler implements Reconciler<OzgCloudKeycloakGroup
 	@Override
 	public UpdateControl<OzgCloudKeycloakGroup> reconcile(OzgCloudKeycloakGroup resource, Context<OzgCloudKeycloakGroup> context) {
 		try {
-			var crdName = resource.getMetadata().getName();
-
-			log.info("Reconcile KeycloakGroup " + crdName);
+			LOG.info("Reconcile KeycloakGroup {}.", resource.getMetadata().getName());
 
 			Optional<String> preconditionError = preconditionService.getReconcilePreconditionErrors(resource);
 			if (preconditionError.isPresent()) {
@@ -63,10 +60,8 @@ public class KeycloakGroupReconciler implements Reconciler<OzgCloudKeycloakGroup
 
 			return buildStatusOk(resource);
 		} catch (Exception e) {
-			log.log(Level.SEVERE,
-					"Could not reconcile group " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace() + ": "
-							+ e.getMessage(),
-					e);
+			LOG.warn("Could not reconcile group {} in namespace {}: {}", resource.getMetadata().getName(), resource.getMetadata().getNamespace(),
+					e.getStackTrace());
 			resource.setStatus(OzgCloudKeycloakGroupStatus.builder().status(OzgCloudCustomResourceStatus.ERROR).message(e.getMessage()).build());
 			return UpdateControl.updateStatus(resource).rescheduleAfter(Config.RECONCILER_RETRY_SECONDS);
 		}
@@ -78,9 +73,8 @@ public class KeycloakGroupReconciler implements Reconciler<OzgCloudKeycloakGroup
 	}
 
 	private UpdateControl<OzgCloudKeycloakGroup> buildStatusInProgress(OzgCloudKeycloakGroup resource, String errorMessage) {
-		log.log(Level.INFO,
-				"Could not yet reconcile group " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace() + ": "
-						+ errorMessage);
+		LOG.warn("Could not yet reconcile group {} in namespace {}: {}", resource.getMetadata().getName(), resource.getMetadata().getNamespace(),
+				errorMessage);
 		resource.setStatus(OzgCloudKeycloakGroupStatus.builder().status(OzgCloudCustomResourceStatus.IN_PROGRESS).message(errorMessage).build());
 		return UpdateControl.updateStatus(resource).rescheduleAfter(Config.RECONCILER_RETRY_SECONDS);
 	}
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupRemoteService.java
index 842187a201a03bce649819f7c57fe6da34ad77b8..353727e163a313c7b9165f9efac0ea96f5f6faa8 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupRemoteService.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/group/KeycloakGroupRemoteService.java
@@ -25,7 +25,6 @@ package de.ozgcloud.operator.keycloak.group;
 
 import java.util.Objects;
 import java.util.Optional;
-import java.util.logging.Level;
 
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.representations.idm.GroupRepresentation;
@@ -33,11 +32,11 @@ import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakResultParser;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @RequiredArgsConstructor
 @Component
-@Log
 class KeycloakGroupRemoteService {
 
 	private final Keycloak keycloak;
@@ -49,7 +48,7 @@ class KeycloakGroupRemoteService {
 	}
 
 	public void createGroup(GroupRepresentation group, String realm) {
-		log.log(Level.FINE, "Creating group {0} in realm {1}", new Object[] { group.getName(), realm });
+		LOG.debug("Creating group {} in realm {}", group.getName(), realm);
 		var response = keycloak.realm(realm).groups().add(group);
 		KeycloakResultParser.parseCreatedResponse(response);
 	}
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
index 2524770ebc04adbee486a454682fe7af6ecf6f51..183120cc2554d0a5a320cd1c11b55d5889601290 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmReconciler.java
@@ -23,8 +23,6 @@
  */
 package de.ozgcloud.operator.keycloak.realm;
 
-import java.util.logging.Level;
-
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.Config;
@@ -36,23 +34,23 @@ import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @RequiredArgsConstructor
 @ControllerConfiguration
 @Component
-@Log
 public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm>, Cleaner<OzgCloudKeycloakRealm> {
 
 	private final KeycloakRealmService service;
 
 	@Override
 	public UpdateControl<OzgCloudKeycloakRealm> reconcile(OzgCloudKeycloakRealm resource, Context<OzgCloudKeycloakRealm> context) {
-		log.info("Realm reconciler reconcile, keep after delete is set to: " + resource.getSpec().isKeepAfterDelete());
+		LOG.info("Realm reconciler reconcile, keep after delete is set to: {}", resource.getSpec().isKeepAfterDelete());
 		try {
-			String realmName = resource.getMetadata().getNamespace();
+			var realmName = resource.getMetadata().getNamespace();
 
-			log.info("Reconcile KeycloakRealm " + realmName + " (crd name " + resource.getMetadata().getName() + ")");
+			LOG.info("Reconcile KeycloakRealm {} (crd name {} )", realmName, resource.getMetadata().getName());
 
 			service.createRealm(resource.getSpec(), realmName);
 
@@ -60,10 +58,8 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
 			return UpdateControl.updateStatus(resource);
 
 		} catch (Exception e) {
-			log.log(Level.SEVERE,
-					"Could not reconcile realm " + resource.getMetadata().getName() + " in namespace " + resource.getMetadata().getNamespace() + ": "
-							+ e.getMessage(),
-					e);
+			LOG.warn("Could not reconcile realm {} in namespace {}: {}", resource.getMetadata().getName(), resource.getMetadata().getNamespace(),
+					e.getStackTrace());
 			resource.setStatus(OzgCloudKeycloakRealmStatus.builder().status(OzgCloudCustomResourceStatus.ERROR).message(e.getMessage()).build());
 			return UpdateControl.updateStatus(resource).rescheduleAfter(Config.RECONCILER_RETRY_SECONDS);
 		}
@@ -71,7 +67,7 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
 
 	@Override
 	public DeleteControl cleanup(OzgCloudKeycloakRealm realm, Context<OzgCloudKeycloakRealm> context) {
-		log.info("Realm reconciler cleanup, keep after delete is set to: " + realm.getSpec().isKeepAfterDelete());
+		LOG.info("Realm reconciler cleanup, keep after delete is set to: {}.", realm.getSpec().isKeepAfterDelete());
 		if (realm.getSpec().isKeepAfterDelete()) {
 			return DeleteControl.defaultDelete();
 		}
@@ -80,12 +76,12 @@ public class KeycloakRealmReconciler implements Reconciler<OzgCloudKeycloakRealm
 
 	DeleteControl cleanup(OzgCloudKeycloakRealm realm) {
 		var realmName = realm.getMetadata().getNamespace();
-		log.info("Deleting KeycloakRealm " + realmName);
+		LOG.info("Deleting KeycloakRealm {}.", realmName);
 		try {
 			service.deleteRealm(realmName);
 			return DeleteControl.defaultDelete();
 		} catch (Exception e) {
-			log.log(Level.SEVERE, "Could not delete KeycloakRealm " + realmName, e);
+			LOG.warn("Could not delete KeycloakRealm {}: {}.", realmName, e.getStackTrace());
 			return DeleteControl.defaultDelete();
 		}
 	}
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
index 669a89799b91a60e32711dba575c0f507920745d..4a76731ab607819d13fa2c459da7b790c1d1b383 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/user/KeycloakUserReconciler.java
@@ -23,8 +23,6 @@
  */
 package de.ozgcloud.operator.keycloak.user;
 
-import java.util.logging.Level;
-
 import javax.ws.rs.NotFoundException;
 
 import org.springframework.stereotype.Component;
@@ -38,10 +36,10 @@ import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
 import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
 import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @RequiredArgsConstructor
-@Log
 @ControllerConfiguration
 @Component
 public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>, Cleaner<OzgCloudKeycloakUser> {
@@ -54,15 +52,15 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
 		var userName = resource.getMetadata().getName();
 		var namespace = resource.getMetadata().getNamespace();
 
-		log.info(String.format("Reconciling user %s...", userName));
-		log.info("User reconciler reconcile, keep after delete is set to: " + resource.getSpec().isKeepAfterDelete());
+		LOG.info("Reconciling user {}.--", userName);
+		LOG.info("User reconciler reconcile, keep after delete is set to: {}.", resource.getSpec().isKeepAfterDelete());
 
 		try {
 			var preconditionError = preconditionService.getPreconditionErrors(resource);
 			if (preconditionError.isPresent()) {
 				var errorMessage = preconditionError.get();
 
-				log.warning(String.format("Could not reconcile user %s in namespace %s: %s", userName, namespace, errorMessage));
+				LOG.warn("Could not reconcile user {} in namespace {}: {}.", userName, namespace, errorMessage);
 
 				return UserUpdateControlBuilder.fromResource(resource)
 						.withStatus(OzgCloudCustomResourceStatus.IN_PROGRESS)
@@ -78,7 +76,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
 		} catch (Exception e) {
 			var errorMessage = e.getMessage();
 
-			log.log(Level.SEVERE, String.format("Could not reconcile user %s for namespace %s: %s", userName, namespace, errorMessage), e);
+			LOG.warn("Could not reconcile user {} for namespace {}: {}. {}", userName, namespace, errorMessage, e.getStackTrace());
 
 			return UserUpdateControlBuilder.fromResource(resource)
 					.withStatus(OzgCloudCustomResourceStatus.ERROR)
@@ -90,7 +88,7 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
 
 	@Override
 	public DeleteControl cleanup(OzgCloudKeycloakUser user, Context<OzgCloudKeycloakUser> context) {
-		log.info("User reconciler cleanup, keep after delete is set to: " + user.getSpec().isKeepAfterDelete());
+		LOG.info("User reconciler cleanup, keep after delete is set to: {}.", user.getSpec().isKeepAfterDelete());
 		if (user.getSpec().isKeepAfterDelete()) {
 			return DeleteControl.defaultDelete();
 		}
@@ -100,15 +98,15 @@ public class KeycloakUserReconciler implements Reconciler<OzgCloudKeycloakUser>,
 	DeleteControl cleanup(OzgCloudKeycloakUser user) {
 		var userName = user.getMetadata().getName();
 		var namespace = user.getMetadata().getNamespace();
-		log.info(String.format("Deleting KeycloakUser %s", userName));
+		LOG.info("Deleting KeycloakUser {}.", userName);
 		try {
 			service.deleteUser(user.getSpec(), namespace);
 			return DeleteControl.defaultDelete();
 		} catch (NotFoundException e) {
-			log.log(Level.INFO, String.format("Could not delete user %s in namespace %s, user not found.", userName, namespace));
+			LOG.info("Could not delete user {} in namespace {}, user not found.", userName, namespace);
 			return DeleteControl.defaultDelete();
 		} catch (Exception e) {
-			log.log(Level.SEVERE, String.format("Could not delete user %s in namespace %s", userName, namespace), e);
+			LOG.warn("Could not delete user {} in namespace {}.", userName, namespace);
 			return DeleteControl.defaultDelete();
 		}
 	}
diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakLivelTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakLivelTest.java
index 91ccd1f7ba8e7805522aeaca4bce060169221114..0da2e64f31296badb50a8339acdc5484231880d3 100644
--- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakLivelTest.java
+++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/group/KeycloakLivelTest.java
@@ -35,13 +35,13 @@ import org.mockito.InjectMocks;
 import org.mockito.Spy;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-import lombok.extern.java.Log;
+import lombok.extern.log4j.Log4j2;
 
 @Disabled("Should only be used manually")
-@Log
+@Log4j2
 @ExtendWith(SpringExtension.class)
 class KeycloakLivelTest {
-	
+
 	private static final String NAMESPACE = "by-torsten-ozgcloud-keycloak-operator-dev";
 
 	@Spy
@@ -68,8 +68,8 @@ class KeycloakLivelTest {
 		FieldUtils.writeField(remoteService, "keycloak", kc, true);
 
 		remoteService.createGroup(createGroup(), NAMESPACE);
-		log.info("Hase: " + remoteService.getGroupByName("hase", NAMESPACE));
-		log.info("Maus: " + remoteService.getGroupByName("maus", NAMESPACE));
+		LOG.info("Hase: {}.", remoteService.getGroupByName("hase", NAMESPACE));
+		LOG.info("Maus: {}.", remoteService.getGroupByName("maus", NAMESPACE));
 
 		service.createGroup(OzgCloudKeycloakGroupSpec.builder().name("Fuchs").build(), NAMESPACE);
 	}