diff --git a/core/src/main/scala/kafka/utils/Logging.scala b/core/src/main/scala/kafka/utils/Logging.scala index cc51cdcc42295..9915e61c7f884 100755 --- a/core/src/main/scala/kafka/utils/Logging.scala +++ b/core/src/main/scala/kafka/utils/Logging.scala @@ -18,26 +18,9 @@ package kafka.utils import com.typesafe.scalalogging.Logger -import org.apache.kafka.common.utils.Utils -import org.apache.kafka.server.logger.LoggingController +import org.apache.kafka.server.logger.Log4jControllerRegistration import org.slf4j.{LoggerFactory, Marker, MarkerFactory} -object Log4jControllerRegistration { - private val logger = Logger(this.getClass.getName) - - private val loggingMBean = new LoggingController - registerMBean(loggingMBean, "kafka.Log4jController") - - private def registerMBean(mbean: LoggingController, typeAttr: String): Unit = { - try { - Utils.registerMBean(mbean, s"kafka:type=$typeAttr") - logger.info("Registered `kafka:type={}` MBean", typeAttr) - } catch { - case e: Exception => logger.warn("Couldn't register `kafka:type={}` MBean", typeAttr, e) - } - } -} - private object Logging { private val FatalMarker: Marker = MarkerFactory.getMarker("FATAL") } @@ -48,7 +31,7 @@ trait Logging { protected var logIdent: String = _ - Log4jControllerRegistration + Log4jControllerRegistration.register() protected def loggerName: String = getClass.getName diff --git a/server/src/main/java/org/apache/kafka/server/logger/Log4jControllerRegistration.java b/server/src/main/java/org/apache/kafka/server/logger/Log4jControllerRegistration.java new file mode 100644 index 0000000000000..a6a309f10c540 --- /dev/null +++ b/server/src/main/java/org/apache/kafka/server/logger/Log4jControllerRegistration.java @@ -0,0 +1,49 @@ +/* + * 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. + */ +package org.apache.kafka.server.logger; + +import org.apache.kafka.common.utils.Utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Registers the {@link LoggingController} MBean, which lets users dynamically alter log4j levels + * at runtime. The MBean is registered only once, on the first call to {@link #register()}. + */ +public final class Log4jControllerRegistration { + + private static final Logger LOGGER = LoggerFactory.getLogger(Log4jControllerRegistration.class); + + private static final AtomicBoolean REGISTERED = new AtomicBoolean(false); + + private static final String MBEAN_TYPE = "kafka.Log4jController"; + private static final String MBEAN_NAME = "kafka:type=" + MBEAN_TYPE; + + private Log4jControllerRegistration() { + } + + public static void register() { + if (REGISTERED.compareAndSet(false, true)) { + if (Utils.registerMBean(new LoggingController(), MBEAN_NAME)) { + LOGGER.info("Registered `{}` MBean", MBEAN_NAME); + } + } + } +} diff --git a/server/src/main/java/org/apache/kafka/server/logger/LoggingController.java b/server/src/main/java/org/apache/kafka/server/logger/LoggingController.java index fba75b10c07f8..8b531a42dd53a 100644 --- a/server/src/main/java/org/apache/kafka/server/logger/LoggingController.java +++ b/server/src/main/java/org/apache/kafka/server/logger/LoggingController.java @@ -25,9 +25,8 @@ /** * An MBean that allows the user to dynamically alter log4j levels at runtime. - * The companion object contains the singleton instance of this class and - * registers the MBean. The {@code kafka.utils.Logging} trait forces initialization - * of the companion object. + * {@link Log4jControllerRegistration} registers this MBean. The {@code kafka.utils.Logging} + * trait invokes the registration helper during initialization. */ public class LoggingController implements LoggingControllerMBean {