You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by aa...@apache.org on 2022/11/17 12:04:40 UTC

[rocketmq] branch develop updated: Revert "[ISSUE #5484] Replace Logging Module with Shaded Logback (#5524)" (#5537)

This is an automated email from the ASF dual-hosted git repository.

aaronai pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/rocketmq.git


The following commit(s) were added to refs/heads/develop by this push:
     new 506b563f5 Revert "[ISSUE #5484] Replace Logging Module with Shaded Logback (#5524)" (#5537)
506b563f5 is described below

commit 506b563f55b79a9a4f82e230c6b04f9462e1e311
Author: yukon <yu...@apache.org>
AuthorDate: Thu Nov 17 20:04:17 2022 +0800

    Revert "[ISSUE #5484] Replace Logging Module with Shaded Logback (#5524)" (#5537)
    
    This reverts commit 809ff6b3e045d6ccd0899f756822b2d7dd65f6c0.
---
 .gitignore                                         |    2 +-
 WORKSPACE                                          |    5 +-
 acl/BUILD.bazel                                    |    2 +-
 acl/pom.xml                                        |   26 +-
 .../org/apache/rocketmq/acl/common/AclSigner.java  |    6 +-
 .../org/apache/rocketmq/acl/common/AclUtils.java   |    6 +-
 .../rocketmq/acl/plain/PlainPermissionManager.java |    6 +-
 .../acl/plain/RemoteAddressStrategyFactory.java    |    6 +-
 .../src/test/resources/logback-test.xml            |   22 +-
 broker/BUILD.bazel                                 |    6 +-
 broker/pom.xml                                     |   22 +-
 .../apache/rocketmq/broker/BrokerController.java   |   10 +-
 .../rocketmq/broker/BrokerPreOnlineService.java    |    6 +-
 .../org/apache/rocketmq/broker/BrokerStartup.java  |   21 +-
 .../broker/client/ClientHousekeepingService.java   |    6 +-
 .../rocketmq/broker/client/ConsumerGroupInfo.java  |    6 +-
 .../rocketmq/broker/client/ConsumerManager.java    |    6 +-
 .../client/DefaultConsumerIdsChangeListener.java   |    6 +-
 .../rocketmq/broker/client/ProducerManager.java    |    6 +-
 .../rocketmq/broker/client/net/Broker2Client.java  |    6 +-
 .../client/rebalance/RebalanceLockManager.java     |    6 +-
 .../broker/controller/ReplicasManager.java         |    6 +-
 .../broker/dledger/DLedgerRoleChangeHandler.java   |    6 +-
 .../rocketmq/broker/failover/EscapeBridge.java     |    6 +-
 .../filter/CommitLogDispatcherCalcBitMap.java      |    6 +-
 .../broker/filter/ConsumerFilterManager.java       |    6 +-
 .../broker/filter/ExpressionMessageFilter.java     |    6 +-
 .../broker/filtersrv/FilterServerManager.java      |    6 +-
 .../broker/filtersrv/FilterServerUtil.java         |    4 +-
 .../rocketmq/broker/latency/BrokerFastFailure.java |    6 +-
 .../longpolling/LmqPullRequestHoldService.java     |    6 +-
 .../broker/longpolling/PullRequestHoldService.java |    6 +-
 .../broker/metrics/BrokerMetricsManager.java       |    6 +-
 .../broker/metrics/ConsumerLagCalculator.java      |    6 +-
 .../broker/offset/ConsumerOffsetManager.java       |    6 +-
 .../offset/ConsumerOrderInfoLockManager.java       |    6 +-
 .../broker/offset/ConsumerOrderInfoManager.java    |    6 +-
 .../apache/rocketmq/broker/out/BrokerOuterAPI.java |    6 +-
 .../processor/AbstractSendMessageProcessor.java    |    8 +-
 .../broker/processor/AckMessageProcessor.java      |    6 +-
 .../broker/processor/AdminBrokerProcessor.java     |    6 +-
 .../processor/ChangeInvisibleTimeProcessor.java    |    6 +-
 .../broker/processor/ClientManageProcessor.java    |    6 +-
 .../broker/processor/ConsumerManageProcessor.java  |    6 +-
 .../processor/DefaultPullMessageResultHandler.java |    6 +-
 .../broker/processor/EndTransactionProcessor.java  |    6 +-
 .../broker/processor/ForwardRequestProcessor.java  |    6 +-
 .../broker/processor/NotificationProcessor.java    |    6 +-
 .../broker/processor/PeekMessageProcessor.java     |    6 +-
 .../broker/processor/PollingInfoProcessor.java     |    6 +-
 .../broker/processor/PopBufferMergeService.java    |    6 +-
 .../broker/processor/PopMessageProcessor.java      |    8 +-
 .../broker/processor/PopReviveService.java         |    6 +-
 .../broker/processor/PullMessageProcessor.java     |    6 +-
 .../broker/processor/QueryAssignmentProcessor.java |   10 +-
 .../broker/processor/QueryMessageProcessor.java    |    6 +-
 .../broker/processor/ReplyMessageProcessor.java    |    6 +-
 .../broker/schedule/ScheduleMessageService.java    |    6 +-
 .../rocketmq/broker/slave/SlaveSynchronize.java    |    6 +-
 .../subscription/SubscriptionGroupManager.java     |    6 +-
 .../rocketmq/broker/topic/TopicConfigManager.java  |    6 +-
 .../topic/TopicQueueMappingCleanService.java       |    6 +-
 .../broker/topic/TopicQueueMappingManager.java     |    6 +-
 .../broker/topic/TopicRouteInfoManager.java        |    6 +-
 .../AbstractTransactionalMessageCheckListener.java |    6 +-
 .../TransactionalMessageCheckService.java          |    6 +-
 .../DefaultTransactionalMessageCheckListener.java  |    6 +-
 .../queue/TransactionalMessageBridge.java          |    6 +-
 .../queue/TransactionalMessageServiceImpl.java     |    6 +-
 .../queue/TransactionalOpBatchService.java         |    6 +-
 .../org/apache/rocketmq/broker/util/HookUtils.java |    6 +-
 .../util/TransactionalMessageServiceImpl.java      |    6 +-
 .../src/test/resources/logback-test.xml            |   24 +-
 client/BUILD.bazel                                 |    2 +-
 client/pom.xml                                     |    9 -
 .../java/org/apache/rocketmq/client/MQHelper.java  |   15 +-
 .../client/consumer/DefaultLitePullConsumer.java   |    6 +-
 .../client/consumer/DefaultMQPushConsumer.java     |    6 +-
 .../consumer/MQPullConsumerScheduleService.java    |    6 +-
 .../AbstractAllocateMessageQueueStrategy.java      |   14 +-
 .../rebalance/AllocateMessageQueueAveragely.java   |   10 +
 .../AllocateMessageQueueAveragelyByCircle.java     |   10 +
 .../consumer/store/LocalFileOffsetStore.java       |    6 +-
 .../consumer/store/RemoteBrokerOffsetStore.java    |    6 +-
 .../client/impl/ClientRemotingProcessor.java       |   26 +-
 .../apache/rocketmq/client/impl/MQAdminImpl.java   |    6 +-
 .../rocketmq/client/impl/MQClientAPIImpl.java      |    6 +-
 .../rocketmq/client/impl/MQClientManager.java      |    6 +-
 .../ConsumeMessageConcurrentlyService.java         |    6 +-
 .../consumer/ConsumeMessageOrderlyService.java     |    6 +-
 .../ConsumeMessagePopConcurrentlyService.java      |    6 +-
 .../consumer/ConsumeMessagePopOrderlyService.java  |    6 +-
 .../impl/consumer/DefaultLitePullConsumerImpl.java |    6 +-
 .../impl/consumer/DefaultMQPullConsumerImpl.java   |    6 +-
 .../impl/consumer/DefaultMQPushConsumerImpl.java   |    7 +-
 .../client/impl/consumer/ProcessQueue.java         |    6 +-
 .../client/impl/consumer/PullAPIWrapper.java       |    6 +-
 .../client/impl/consumer/PullMessageService.java   |   26 +-
 .../client/impl/consumer/RebalanceImpl.java        |    6 +-
 .../client/impl/consumer/RebalanceService.java     |    6 +-
 .../client/impl/factory/MQClientInstance.java      |    6 +-
 .../impl/producer/DefaultMQProducerImpl.java       |    6 +-
 .../rocketmq/client/latency/MQFaultStrategy.java   |    6 +-
 .../apache/rocketmq/client/log/ClientLogger.java   |  124 ++
 .../client/producer/DefaultMQProducer.java         |   10 +-
 .../client/producer/RequestFutureHolder.java       |    6 +-
 .../rocketmq/client/stat/ConsumerStatsManager.java |    6 +-
 .../client/trace/AsyncTraceDispatcher.java         |    7 +-
 client/src/main/resources/rmq.client.logback.xml   |   52 -
 client/src/test/resources/log4j2.xml               |   29 +
 common/BUILD.bazel                                 |    2 +-
 common/pom.xml                                     |   17 +-
 .../rocketmq/common/AbstractBrokerRunnable.java    |    4 +-
 .../org/apache/rocketmq/common/BrokerConfig.java   |    6 +-
 .../org/apache/rocketmq/common/BrokerIdentity.java |    9 +-
 .../org/apache/rocketmq/common/ConfigManager.java  |    6 +-
 .../java/org/apache/rocketmq/common/MixAll.java    |   10 +-
 .../org/apache/rocketmq/common/ServiceThread.java  |    6 +-
 .../apache/rocketmq/common/ThreadFactoryImpl.java  |    6 +-
 .../java/org/apache/rocketmq/common/UtilAll.java   |    8 +-
 .../rocketmq/common/compression/Lz4Compressor.java |    6 +-
 .../common/compression/ZlibCompressor.java         |    6 +-
 .../common/compression/ZstdCompressor.java         |    6 +-
 .../common/namesrv/DefaultTopAddressing.java       |    6 +-
 .../rocketmq/common/queue/ConcurrentTreeMap.java   |    6 +-
 .../common/statistics/StatisticsItemPrinter.java   |    8 +-
 .../rocketmq/common/stats/MomentStatsItem.java     |    6 +-
 .../rocketmq/common/stats/MomentStatsItemSet.java  |    6 +-
 .../apache/rocketmq/common/stats/RTStatsItem.java  |    8 +-
 .../apache/rocketmq/common/stats/StatsItem.java    |   17 +-
 .../apache/rocketmq/common/stats/StatsItemSet.java |   13 +-
 .../rocketmq/common/thread/ThreadPoolMonitor.java  |   10 +-
 .../apache/rocketmq/common/utils/NetworkUtil.java  |    6 +-
 .../rocketmq/common/utils/ServiceProvider.java     |    8 +-
 .../apache/rocketmq/common/utils/ThreadUtils.java  |    6 +-
 container/BUILD.bazel                              |    3 +-
 container/pom.xml                                  |    7 -
 .../apache/rocketmq/container/BrokerContainer.java |    6 +-
 .../container/BrokerContainerProcessor.java        |    6 +-
 .../rocketmq/container/BrokerContainerStartup.java |   27 +-
 .../logback/BrokerLogbackConfigurator.java         |  152 ++-
 container/src/test/resources/rmq.logback-test.xml  |   36 -
 controller/BUILD.bazel                             |    3 +-
 controller/pom.xml                                 |    7 +-
 .../controller/BrokerHousekeepingService.java      |    6 +-
 .../rocketmq/controller/ControllerManager.java     |    6 +-
 .../rocketmq/controller/ControllerStartup.java     |   20 +-
 .../controller/impl/DLedgerController.java         |    6 +-
 .../impl/DLedgerControllerStateMachine.java        |    6 +-
 .../impl/DefaultBrokerHeartbeatManager.java        |    6 +-
 .../impl/manager/ReplicasInfoManager.java          |    6 +-
 .../processor/ControllerRequestProcessor.java      |    6 +-
 controller/src/test/resources/logback-test.xml     |   33 +
 controller/src/test/resources/rmq.logback-test.xml |   36 -
 .../conf/logback_broker.xml                        |  108 +-
 .../conf/logback_controller.xml                    |   16 +-
 .../conf/logback_namesrv.xml                       |   24 +-
 .../conf/logback_proxy.xml                         |  116 +-
 .../conf/logback_tools.xml                         |   16 +-
 example/pom.xml                                    |   12 +-
 .../rocketmq/example/benchmark/BatchProducer.java  |   14 +-
 .../rocketmq/example/benchmark/Producer.java       |    8 +-
 .../example/benchmark/timer/TimerProducer.java     |   12 +-
 .../rocketmq/example/rpc/AsyncRequestProducer.java |    6 +-
 .../rocketmq/example/simple/PopPushConsumer.java   |   62 +
 filter/BUILD.bazel                                 |    1 +
 filter/pom.xml                                     |    2 -
 filter/src/test/resources/rmq.logback-test.xml     |   36 -
 logging/BUILD.bazel                                |   24 +
 {container => logging}/pom.xml                     |   22 +-
 .../rocketmq/logging/InnerLoggerFactory.java       |  482 ++++++++
 .../apache/rocketmq/logging/InternalLogger.java    |   63 +
 .../rocketmq/logging/InternalLoggerFactory.java    |  100 ++
 .../rocketmq/logging/Slf4jLoggerFactory.java       |  193 +++
 .../apache/rocketmq/logging/inner/Appender.java    |  228 ++++
 .../org/apache/rocketmq/logging/inner/Layout.java  |   35 +-
 .../org/apache/rocketmq/logging/inner/Level.java   |  152 +++
 .../org/apache/rocketmq/logging/inner/Logger.java  |  467 ++++++++
 .../rocketmq/logging/inner/LoggingBuilder.java     | 1231 ++++++++++++++++++++
 .../rocketmq/logging/inner/LoggingEvent.java       |  124 ++
 .../apache/rocketmq/logging/inner/SysLogger.java   |   89 ++
 .../org/apache/rocketmq/logging/package-info.java  |   37 +-
 .../apache/rocketmq/logging/BasicLoggerTest.java   |   69 ++
 .../rocketmq/logging/InnerLoggerFactoryTest.java   |   91 ++
 .../rocketmq/logging/InternalLoggerTest.java       |   68 ++
 .../rocketmq/logging/Slf4jLoggerFactoryTest.java   |   80 ++
 .../rocketmq/logging/inner/AppenderTest.java       |  158 +++
 .../apache/rocketmq/logging/inner/LayoutTest.java  |   52 +
 .../apache/rocketmq/logging/inner/LevelTest.java   |   31 +-
 .../logging/inner/LoggerRepositoryTest.java        |   49 +
 .../apache/rocketmq/logging/inner/LoggerTest.java  |  111 ++
 .../rocketmq/logging/inner/LoggingBuilderTest.java |  113 ++
 .../logging/inner/MessageFormatterTest.java        |   33 +-
 logging/src/test/resources/logback_test.xml        |   46 +
 namesrv/BUILD.bazel                                |    4 +-
 namesrv/pom.xml                                    |   16 +-
 .../apache/rocketmq/namesrv/NamesrvController.java |    8 +-
 .../apache/rocketmq/namesrv/NamesrvStartup.java    |   17 +-
 .../rocketmq/namesrv/kvconfig/KVConfigManager.java |    6 +-
 .../namesrv/processor/ClientRequestProcessor.java  |    6 +-
 .../processor/ClusterTestRequestProcessor.java     |    6 +-
 .../namesrv/processor/DefaultRequestProcessor.java |    6 +-
 .../routeinfo/BatchUnregistrationService.java      |    6 +-
 .../namesrv/routeinfo/RouteInfoManager.java        |    6 +-
 .../namesrv/processor/RequestProcessorTest.java    |    6 +-
 .../namesrv/routeinfo/GetRouteInfoBenchmark.java   |   12 +-
 .../namesrv/routeinfo/RegisterBrokerBenchmark.java |   13 +-
 namesrv/src/test/resources/rmq.logback-test.xml    |   36 -
 openmessaging/pom.xml                              |    5 +-
 .../rocketmq/consumer/LocalMessageCache.java       |    8 +-
 .../rocketmq/consumer/PullConsumerImpl.java        |    8 +-
 .../rocketmq/producer/AbstractOMSProducer.java     |    3 +
 .../rocketmq/producer/ProducerImpl.java            |    4 -
 .../rocketmq/promise/DefaultPromise.java           |    6 +-
 .../io/openmessaging/rocketmq/utils/BeanUtils.java |    6 +-
 .../src/test/resources/rmq.logback-test.xml        |   36 -
 pom.xml                                            |  144 ++-
 proxy/BUILD.bazel                                  |    4 +-
 proxy/pom.xml                                      |   15 +-
 .../org/apache/rocketmq/proxy/ProxyStartup.java    |   39 +-
 .../rocketmq/proxy/config/Configuration.java       |    4 +-
 .../apache/rocketmq/proxy/config/ProxyConfig.java  |    4 +-
 .../org/apache/rocketmq/proxy/grpc/GrpcServer.java |    6 +-
 .../rocketmq/proxy/grpc/GrpcServerBuilder.java     |    6 +-
 .../interceptor/GlobalExceptionInterceptor.java    |    6 +-
 .../proxy/grpc/v2/AbstractMessingActivity.java     |    6 +-
 .../proxy/grpc/v2/DefaultGrpcMessingActivity.java  |    6 +-
 .../proxy/grpc/v2/GrpcMessagingApplication.java    |    4 +-
 .../proxy/grpc/v2/channel/GrpcClientChannel.java   |    6 +-
 .../proxy/grpc/v2/client/ClientActivity.java       |    6 +-
 .../proxy/grpc/v2/common/GrpcConverter.java        |    6 +-
 .../proxy/grpc/v2/common/GrpcValidator.java        |    6 +-
 .../proxy/grpc/v2/common/ResponseBuilder.java      |    6 +-
 .../proxy/grpc/v2/common/ResponseWriter.java       |    6 +-
 .../ReceiveMessageResponseStreamWriter.java        |    6 +-
 .../proxy/metrics/ProxyMetricsManager.java         |    4 +-
 .../proxy/processor/ConsumerProcessor.java         |    6 +-
 .../proxy/processor/ProducerProcessor.java         |    6 +-
 .../proxy/processor/ReceiptHandleProcessor.java    |    4 +-
 .../proxy/service/ClusterServiceManager.java       |    6 +-
 .../proxy/service/channel/ChannelManager.java      |    4 +-
 .../proxy/service/channel/SimpleChannel.java       |    6 +-
 .../proxy/service/message/LocalMessageService.java |    4 +-
 .../service/metadata/ClusterMetadataService.java   |    6 +-
 .../proxy/service/mqclient/MQClientAPIExt.java     |    6 +-
 .../mqclient/ProxyClientRemotingProcessor.java     |    6 +-
 .../rocketmq/proxy/service/relay/ProxyChannel.java |    6 +-
 .../proxy/service/route/TopicRouteService.java     |    6 +-
 .../transaction/ClusterTransactionService.java     |    6 +-
 .../transaction/TransactionDataManager.java        |    6 +-
 .../apache/rocketmq/proxy/ProxyStartupTest.java    |   14 +-
 .../proxy/common/ReceiptHandleGroupTest.java       |    4 +-
 .../proxy/config/ConfigurationManagerTest.java     |    2 +-
 ...onfigTest.java => InitConfigAndLoggerTest.java} |   33 +-
 .../proxy/grpc/v2/AbstractMessingActivityTest.java |    4 +-
 .../rocketmq/proxy/grpc/v2/BaseActivityTest.java   |    4 +-
 .../grpc/v2/GrpcMessagingApplicationTest.java      |    4 +-
 .../proxy/processor/BaseProcessorTest.java         |    4 +-
 .../rocketmq/proxy/service/BaseServiceTest.java    |    4 +-
 .../service/message/LocalMessageServiceTest.java   |    4 +-
 .../AbstractTransactionServiceTest.java            |    4 +-
 .../transaction/TransactionDataManagerTest.java    |    4 +-
 proxy/src/test/resources/rmq.logback-test.xml      |   36 -
 remoting/BUILD.bazel                               |    2 +-
 remoting/pom.xml                                   |    5 +-
 .../apache/rocketmq/remoting/Configuration.java    |   10 +-
 .../rocketmq/remoting/common/RemotingHelper.java   |    6 +-
 .../rocketmq/remoting/common/ServiceThread.java    |    6 +-
 .../rocketmq/remoting/netty/NettyDecoder.java      |    6 +-
 .../rocketmq/remoting/netty/NettyEncoder.java      |    6 +-
 .../rocketmq/remoting/netty/NettyLogger.java       |    8 +-
 .../remoting/netty/NettyRemotingAbstract.java      |    6 +-
 .../remoting/netty/NettyRemotingClient.java        |    6 +-
 .../remoting/netty/NettyRemotingServer.java        |   10 +-
 .../apache/rocketmq/remoting/netty/TlsHelper.java  |    6 +-
 .../rocketmq/remoting/protocol/MQProtosHelper.java |    6 +-
 .../remoting/protocol/RemotingCommand.java         |    6 +-
 .../remoting/protocol/body/RegisterBrokerBody.java |    6 +-
 .../rocketmq/remoting/rpc/ClientMetadata.java      |    6 +-
 remoting/src/test/resources/rmq.logback-test.xml   |   36 -
 srvutil/BUILD.bazel                                |    2 +-
 srvutil/pom.xml                                    |    7 +-
 .../rocketmq/srvutil/AclFileWatchService.java      |    6 +-
 .../apache/rocketmq/srvutil/FileWatchService.java  |    6 +-
 .../rocketmq/srvutil/ShutdownHookThread.java       |    6 +-
 .../src/test/java/logback-test.xml                 |   20 +-
 srvutil/src/test/resources/rmq.logback-test.xml    |   36 -
 store/BUILD.bazel                                  |    6 +-
 store/pom.xml                                      |   13 +-
 .../rocketmq/store/AllocateMappedFileService.java  |    6 +-
 .../java/org/apache/rocketmq/store/CommitLog.java  |    6 +-
 .../org/apache/rocketmq/store/ConsumeQueue.java    |    8 +-
 .../org/apache/rocketmq/store/ConsumeQueueExt.java |    6 +-
 .../apache/rocketmq/store/DefaultMessageStore.java |    6 +-
 .../apache/rocketmq/store/FlushDiskWatcher.java    |    6 +-
 .../org/apache/rocketmq/store/MappedFileQueue.java |    8 +-
 .../apache/rocketmq/store/MessageExtEncoder.java   |    6 +-
 .../org/apache/rocketmq/store/StoreCheckpoint.java |    6 +-
 .../apache/rocketmq/store/StoreStatsService.java   |    6 +-
 .../java/org/apache/rocketmq/store/StoreUtil.java  |    6 +-
 .../apache/rocketmq/store/TransientStorePool.java  |    6 +-
 .../apache/rocketmq/store/ha/DefaultHAClient.java  |    6 +-
 .../rocketmq/store/ha/DefaultHAConnection.java     |    6 +-
 .../apache/rocketmq/store/ha/DefaultHAService.java |    6 +-
 .../rocketmq/store/ha/GroupTransferService.java    |    6 +-
 .../ha/HAConnectionStateNotificationService.java   |    6 +-
 .../apache/rocketmq/store/ha/WaitNotifyObject.java |    6 +-
 .../store/ha/autoswitch/AutoSwitchHAClient.java    |    6 +-
 .../ha/autoswitch/AutoSwitchHAConnection.java      |    6 +-
 .../store/ha/autoswitch/AutoSwitchHAService.java   |    6 +-
 .../store/ha/autoswitch/EpochFileCache.java        |    6 +-
 .../rocketmq/store/ha/io/AbstractHAReader.java     |    6 +-
 .../org/apache/rocketmq/store/ha/io/HAWriter.java  |    6 +-
 .../org/apache/rocketmq/store/index/IndexFile.java |    6 +-
 .../apache/rocketmq/store/index/IndexService.java  |    6 +-
 .../apache/rocketmq/store/kv/CompactionLog.java    |    6 +-
 .../rocketmq/store/kv/CompactionService.java       |    6 +-
 .../apache/rocketmq/store/kv/CompactionStore.java  |    6 +-
 .../apache/rocketmq/store/kv/MessageFetcher.java   |    6 +-
 .../rocketmq/store/logfile/DefaultMappedFile.java  |    6 +-
 .../rocketmq/store/queue/BatchConsumeQueue.java    |    6 +-
 .../rocketmq/store/queue/ConsumeQueueStore.java    |    6 +-
 .../rocketmq/store/queue/QueueOffsetAssigner.java  |    6 +-
 .../apache/rocketmq/store/stats/BrokerStats.java   |    6 +-
 .../rocketmq/store/stats/BrokerStatsManager.java   |   14 +-
 .../rocketmq/store/timer/TimerCheckpoint.java      |    6 +-
 .../org/apache/rocketmq/store/timer/TimerLog.java  |    6 +-
 .../rocketmq/store/timer/TimerMessageStore.java    |   11 +-
 .../apache/rocketmq/store/timer/TimerMetrics.java  |    6 +-
 .../apache/rocketmq/store/timer/TimerWheel.java    |    6 +-
 .../apache/rocketmq/store/util/PerfCounter.java    |   12 +-
 .../org/apache/rocketmq/store/StoreTestUtil.java   |    6 +-
 .../src/test/resources/logback-test.xml            |   21 +-
 store/src/test/resources/rmq.logback-test.xml      |   36 -
 test/BUILD.bazel                                   |    9 +-
 test/pom.xml                                       |   27 +-
 .../rocketmq/test/client/mq/MQAsyncProducer.java   |    6 +-
 .../test/client/rmq/RMQAsyncSendProducer.java      |    5 +-
 .../test/client/rmq/RMQBroadCastConsumer.java      |    5 +-
 .../test/client/rmq/RMQNormalConsumer.java         |    5 +-
 .../test/client/rmq/RMQNormalProducer.java         |   33 +-
 .../rocketmq/test/client/rmq/RMQPopConsumer.java   |    5 +-
 .../rocketmq/test/client/rmq/RMQSqlConsumer.java   |    5 +-
 .../test/client/rmq/RMQTransactionalProducer.java  |    9 +-
 .../rocketmq/test/listener/AbstractListener.java   |    7 +-
 .../listener/rmq/concurrent/RMQNormalListener.java |    2 +-
 .../test/listener/rmq/order/RMQOrderListener.java  |    2 +-
 .../rocketmq/test/lmq/benchmark/BenchLmqStore.java |    4 +-
 .../rocketmq/test/util/MQAdminTestUtils.java       |    5 +-
 .../java/org/apache/rocketmq/test/util/MQWait.java |    6 +-
 .../org/apache/rocketmq/test/util/StatUtil.java    |    5 +-
 .../org/apache/rocketmq/test/util/VerifyUtils.java |    5 +-
 .../org/apache/rocketmq/test/base/BaseConf.java    |    4 +-
 .../rocketmq/test/base/IntegrationTestBase.java    |    6 +-
 .../balance/NormalMsgDynamicBalanceIT.java         |    5 +-
 .../consumer/balance/NormalMsgStaticBalanceIT.java |    4 +-
 .../client/consumer/broadcast/BaseBroadcast.java   |    5 +-
 .../normal/BroadcastNormalMsgNotReceiveIT.java     |    5 +-
 .../normal/BroadcastNormalMsgRecvCrashIT.java      |    5 +-
 .../normal/BroadcastNormalMsgRecvFailIT.java       |    5 +-
 .../normal/BroadcastNormalMsgRecvStartLaterIT.java |    5 +-
 .../BroadcastNormalMsgTwoDiffGroupRecvIT.java      |    5 +-
 .../normal/NormalMsgTwoSameGroupConsumerIT.java    |    5 +-
 .../broadcast/order/OrderMsgBroadcastIT.java       |    5 +-
 .../tag/BroadcastTwoConsumerFilterIT.java          |    5 +-
 .../tag/BroadcastTwoConsumerSubDiffTagIT.java      |    5 +-
 .../tag/BroadcastTwoConsumerSubTagIT.java          |    5 +-
 .../consumer/cluster/DynamicAddAndCrashIT.java     |    5 +-
 .../consumer/cluster/DynamicAddConsumerIT.java     |    5 +-
 .../consumer/cluster/DynamicCrashConsumerIT.java   |    5 +-
 .../test/client/consumer/filter/SqlFilterIT.java   |    5 +-
 .../test/client/consumer/pop/PopSubCheckIT.java    |    9 +-
 .../test/client/consumer/tag/MulTagSubIT.java      |    6 +-
 .../consumer/tag/TagMessageWith1ConsumerIT.java    |    6 +-
 .../consumer/tag/TagMessageWithMulConsumerIT.java  |    6 +-
 .../tag/TagMessageWithSameGroupConsumerIT.java     |    5 +-
 .../producer/async/AsyncSendExceptionIT.java       |    5 +-
 .../async/AsyncSendWithMessageQueueIT.java         |    5 +-
 .../async/AsyncSendWithMessageQueueSelectorIT.java |    5 +-
 .../async/AsyncSendWithOnlySendCallBackIT.java     |    5 +-
 .../test/client/producer/batch/BatchSendIT.java    |    5 +-
 .../producer/exception/msg/MessageUserPropIT.java  |    5 +-
 .../ProducerGroupAndInstanceNameValidityIT.java    |    5 +-
 .../producer/oneway/OneWaySendExceptionIT.java     |    5 +-
 .../test/client/producer/oneway/OneWaySendIT.java  |    5 +-
 .../client/producer/oneway/OneWaySendWithMQIT.java |    5 +-
 .../producer/oneway/OneWaySendWithSelectorIT.java  |    5 +-
 .../producer/order/OrderMsgDynamicRebalanceIT.java |    5 +-
 .../test/client/producer/order/OrderMsgIT.java     |    5 +-
 .../client/producer/order/OrderMsgRebalanceIT.java |    5 +-
 .../client/producer/order/OrderMsgWithTagIT.java   |    5 +-
 .../producer/querymsg/QueryMsgByIdExceptionIT.java |    5 +-
 .../client/producer/querymsg/QueryMsgByIdIT.java   |    5 +-
 .../client/producer/querymsg/QueryMsgByKeyIT.java  |    5 +-
 .../producer/transaction/TransactionalMsgIT.java   |    5 +-
 .../container/ContainerIntegrationTestBase.java    |   19 +-
 .../rocketmq/test/delay/NormalMsgDelayIT.java      |    5 +-
 .../rocketmq/test/offset/OffsetResetForPopIT.java  |    5 +-
 .../apache/rocketmq/test/offset/OffsetResetIT.java |    5 +-
 .../test/smoke/NormalMessageSendAndRecvIT.java     |    4 +-
 .../rocketmq/test/statictopic/StaticTopicIT.java   |    5 +-
 test/src/test/resources/log4j.xml                  |   46 +
 test/src/test/resources/logback-test.xml           |   33 +
 test/src/test/resources/rmq.logback-test.xml       |   36 -
 tools/BUILD.bazel                                  |    5 +-
 tools/pom.xml                                      |    7 +-
 .../tools/admin/DefaultMQAdminExtImpl.java         |   52 +-
 .../rocketmq/tools/command/MQAdminStartup.java     |   19 +
 .../consumer/ConsumerProgressSubCommand.java       |    6 +-
 .../consumer/StartMonitoringSubCommand.java        |    3 +
 .../tools/monitor/DefaultMonitorListener.java      |   20 +-
 .../rocketmq/tools/monitor/MonitorService.java     |   10 +-
 .../DeleteExpiredCommitLogSubCommandTest.java      |    2 +-
 .../tools/command/server/ServerResponseMocker.java |    9 +-
 tools/src/test/resources/rmq.logback-test.xml      |   36 -
 415 files changed, 6156 insertions(+), 1981 deletions(-)

diff --git a/.gitignore b/.gitignore
index c20f4bf76..ad431b361 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,7 @@
 .settings/
 target/
 devenv
-*.log.*
+*.log*
 *.iml
 .idea/
 *.versionsBackup
diff --git a/WORKSPACE b/WORKSPACE
index 38e846a32..fe16f04b4 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -43,7 +43,7 @@ maven_install(
         "com.alibaba:fastjson:1.2.76",
         "org.hamcrest:hamcrest-library:1.3",
         "io.netty:netty-all:4.1.65.Final",
-        "org.slf4j:slf4j-api:1.7.33",
+        "org.slf4j:slf4j-api:1.7.7",
         "org.assertj:assertj-core:3.22.0",
         "org.mockito:mockito-core:3.10.0",
         "com.github.luben:zstd-jni:1.5.2-2",
@@ -64,6 +64,7 @@ maven_install(
         "org.yaml:snakeyaml:1.30",
         "commons-codec:commons-codec:1.13",
         "commons-io:commons-io:2.7",
+        "log4j:log4j:1.2.17",
         "com.google.truth:truth:0.30",
         "org.bouncycastle:bcpkix-jdk15on:1.69",
         "com.google.code.gson:gson:2.8.9",
@@ -93,8 +94,6 @@ maven_install(
         "io.opentelemetry:opentelemetry-api:1.19.0",
         "io.opentelemetry:opentelemetry-sdk-metrics:1.19.0",
         "io.opentelemetry:opentelemetry-sdk-common:1.19.0",
-        "io.github.aliyun-mq:rocketmq-slf4j-api:1.0.1",
-        "io.github.aliyun-mq:rocketmq-logback-classic:1.0.1",
     ],
     fetch_sources = True,
     repositories = [
diff --git a/acl/BUILD.bazel b/acl/BUILD.bazel
index fd9e45dd6..ca0517db7 100644
--- a/acl/BUILD.bazel
+++ b/acl/BUILD.bazel
@@ -22,6 +22,7 @@ java_library(
     visibility = ["//visibility:public"],
     deps = [
         "//common",
+        "//logging",
         "//remoting",
         "//srvutil",
         "@maven//:com_alibaba_fastjson",
@@ -35,7 +36,6 @@ java_library(
         "@maven//:org_apache_rocketmq_rocketmq_proto",
         "@maven//:org_lz4_lz4_java",
         "@maven//:org_yaml_snakeyaml",
-        "@maven//:io_github_aliyun_mq_rocketmq_slf4j_api",
     ],
 )
 
diff --git a/acl/pom.xml b/acl/pom.xml
index 9a3c12e28..90ce2c8be 100644
--- a/acl/pom.xml
+++ b/acl/pom.xml
@@ -30,25 +30,18 @@
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-remoting</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>rocketmq-common</artifactId>
-            <version>${project.version}</version>
+            <artifactId>rocketmq-logging</artifactId>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>rocketmq-srvutil</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.github.aliyun-mq</groupId>
-            <artifactId>rocketmq-slf4j-api</artifactId>
+            <artifactId>rocketmq-common</artifactId>
         </dependency>
         <dependency>
-            <groupId>io.github.aliyun-mq</groupId>
-            <artifactId>rocketmq-logback-classic</artifactId>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>rocketmq-srvutil</artifactId>
         </dependency>
         <dependency>
             <groupId>org.yaml</groupId>
@@ -62,6 +55,17 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>commons-validator</groupId>
             <artifactId>commons-validator</artifactId>
diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java
index 98964cde3..9953cca0f 100644
--- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java
+++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclSigner.java
@@ -22,13 +22,13 @@ import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class AclSigner {
     public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
     public static final SigningAlgorithm DEFAULT_ALGORITHM = SigningAlgorithm.HmacSHA1;
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.ROCKETMQ_AUTHORIZE_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_AUTHORIZE_LOGGER_NAME);
     private static final int CAL_SIGNATURE_FAILED = 10015;
     private static final String CAL_SIGNATURE_FAILED_MSG = "[%s:signature-failed] unable to calculate a request signature. error=%s";
 
diff --git a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java
index 230aba05e..0f31ab8bb 100644
--- a/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java
+++ b/acl/src/main/java/org/apache/rocketmq/acl/common/AclUtils.java
@@ -27,8 +27,8 @@ import java.util.SortedMap;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 import org.yaml.snakeyaml.Yaml;
@@ -37,7 +37,7 @@ import static org.apache.rocketmq.acl.common.SessionCredentials.CHARSET;
 
 public class AclUtils {
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     public static byte[] combineRequestContent(RemotingCommand request, SortedMap<String, String> fieldsMap) {
         try {
diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java
index a506b83fb..b41c34e69 100644
--- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java
+++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java
@@ -45,14 +45,14 @@ import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.PlainAccessConfig;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.DataVersion;
 import org.apache.rocketmq.srvutil.AclFileWatchService;
 
 public class PlainPermissionManager {
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     private String fileHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY,
         System.getenv(MixAll.ROCKETMQ_HOME_ENV));
diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java
index eb3a8c324..f2caf2431 100644
--- a/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java
+++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/RemoteAddressStrategyFactory.java
@@ -23,12 +23,12 @@ import org.apache.commons.validator.routines.InetAddressValidator;
 import org.apache.rocketmq.acl.common.AclException;
 import org.apache.rocketmq.acl.common.AclUtils;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class RemoteAddressStrategyFactory {
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     public static final NullRemoteAddressStrategy NULL_NET_ADDRESS_STRATEGY = new NullRemoteAddressStrategy();
 
diff --git a/common/src/test/resources/rmq.logback-test.xml b/acl/src/test/resources/logback-test.xml
similarity index 63%
rename from common/src/test/resources/rmq.logback-test.xml
rename to acl/src/test/resources/logback-test.xml
index c3ec0d1e8..e556c649e 100644
--- a/common/src/test/resources/rmq.logback-test.xml
+++ b/acl/src/test/resources/logback-test.xml
@@ -17,20 +17,18 @@
   -->
 <configuration>
 
-    <appender name="CONSOLE" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
-        <layout class="org.apache.rocketmq.shade.ch.qos.logback.classic.PatternLayout">
-            <Pattern>
-                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
-            </Pattern>
-        </layout>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
+            <charset class="java.nio.charset.Charset">UTF-8</charset>
+        </encoder>
     </appender>
 
-    <logger name="org.apache.rocketmq" level="error" additivity="false">
-        <appender-ref ref="CONSOLE"/>
+    <logger name="RocketmqCommon" level="INFO" additivity="false">
+        <appender-ref ref="STDOUT"/>
     </logger>
-
-    <root level="error">
-        <appender-ref ref="CONSOLE"/>
+    <root level="INFO">
+        <appender-ref ref="STDOUT"/>
     </root>
 
-</configuration>
\ No newline at end of file
+</configuration>
diff --git a/broker/BUILD.bazel b/broker/BUILD.bazel
index 75addf8bc..ea8dd9046 100644
--- a/broker/BUILD.bazel
+++ b/broker/BUILD.bazel
@@ -25,6 +25,7 @@ java_library(
         "//client",
         "//common",
         "//filter",
+        "//logging",
         "//remoting",
         "//srvutil",
         "//store",
@@ -49,7 +50,6 @@ java_library(
         "@maven//:org_apache_commons_commons_lang3",
         "@maven//:org_lz4_lz4_java",
         "@maven//:org_slf4j_slf4j_api",
-        "@maven//:io_github_aliyun_mq_rocketmq_slf4j_api",
     ],
 )
 
@@ -60,7 +60,7 @@ java_library(
         "src/test/resources/META-INF/service/org.apache.rocketmq.acl.AccessValidator",
         "src/test/resources/META-INF/service/org.apache.rocketmq.broker.transaction.AbstractTransactionalMessageCheckListener",
         "src/test/resources/META-INF/service/org.apache.rocketmq.broker.transaction.TransactionalMessageService",
-        "src/test/resources/rmq.logback-test.xml",
+        "src/test/resources/logback-test.xml",
     ],
     visibility = ["//visibility:public"],
     deps = [
@@ -70,13 +70,13 @@ java_library(
         "//client",
         "//common",
         "//filter",
+        "//logging",
         "//remoting",
         "//store",
         "@maven//:com_alibaba_fastjson",
         "@maven//:com_google_guava_guava",
         "@maven//:io_netty_netty_all",
         "@maven//:org_apache_commons_commons_lang3",
-        "@maven//:io_github_aliyun_mq_rocketmq_slf4j_api",
     ],
 )
 
diff --git a/broker/pom.xml b/broker/pom.xml
index ae79c64d9..45c8acfc9 100644
--- a/broker/pom.xml
+++ b/broker/pom.xml
@@ -29,45 +29,39 @@
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-remoting</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-store</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>io.github.aliyun-mq</groupId>
-            <artifactId>rocketmq-slf4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.github.aliyun-mq</groupId>
-            <artifactId>rocketmq-logback-classic</artifactId>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>rocketmq-remoting</artifactId>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-client</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-srvutil</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-filter</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-acl</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
         </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
@@ -76,6 +70,10 @@
             <groupId>org.javassist</groupId>
             <artifactId>javassist</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcpkix-jdk15on</artifactId>
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java
index e22f1b0a5..787c62dc8 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java
@@ -116,8 +116,8 @@ import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.stats.MomentStatsItem;
 import org.apache.rocketmq.common.utils.ServiceProvider;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.Configuration;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.RemotingServer;
@@ -159,9 +159,9 @@ import org.apache.rocketmq.store.timer.TimerMessageStore;
 import org.apache.rocketmq.store.timer.TimerMetrics;
 
 public class BrokerController {
-    protected static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
-    private static final Logger LOG_PROTECTION = LoggerFactory.getLogger(LoggerName.PROTECTION_LOGGER_NAME);
-    private static final Logger LOG_WATER_MARK = LoggerFactory.getLogger(LoggerName.WATER_MARK_LOGGER_NAME);
+    protected static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOG_PROTECTION = InternalLoggerFactory.getLogger(LoggerName.PROTECTION_LOGGER_NAME);
+    private static final InternalLogger LOG_WATER_MARK = InternalLoggerFactory.getLogger(LoggerName.WATER_MARK_LOGGER_NAME);
     protected static final int HA_ADDRESS_MIN_LENGTH = 6;
 
     protected final BrokerConfig brokerConfig;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerPreOnlineService.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerPreOnlineService.java
index 9916be660..394116930 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerPreOnlineService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerPreOnlineService.java
@@ -29,8 +29,8 @@ import org.apache.rocketmq.broker.schedule.DelayOffsetSerializeWrapper;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.ServiceThread;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.protocol.BrokerSyncInfo;
 import org.apache.rocketmq.remoting.protocol.body.BrokerMemberGroup;
@@ -41,7 +41,7 @@ import org.apache.rocketmq.store.ha.HAConnectionStateNotificationRequest;
 import org.apache.rocketmq.store.timer.TimerCheckpoint;
 
 public class BrokerPreOnlineService extends ServiceThread {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
 
     private int waitBrokerIndex = 0;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java
index f78a5a79c..46cbbf1c8 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java
@@ -16,6 +16,8 @@
  */
 package org.apache.rocketmq.broker;
 
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.joran.JoranConfigurator;
 import java.io.BufferedInputStream;
 import java.io.FileInputStream;
 import java.io.InputStream;
@@ -30,20 +32,22 @@ import org.apache.rocketmq.common.MQVersion;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.utils.NetworkUtil;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.netty.NettyClientConfig;
 import org.apache.rocketmq.remoting.netty.NettyServerConfig;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 import org.apache.rocketmq.srvutil.ServerUtil;
 import org.apache.rocketmq.store.config.BrokerRole;
 import org.apache.rocketmq.store.config.MessageStoreConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class BrokerStartup {
     public static Properties properties = null;
     public static CommandLine commandLine = null;
     public static String configFile = null;
-    public static Logger log;
+    public static InternalLogger log;
     public static final SystemConfigFileHelper CONFIG_FILE_HELPER = new SystemConfigFileHelper();
 
     public static void main(String[] args) {
@@ -165,6 +169,10 @@ public class BrokerStartup {
             }
 
             messageStoreConfig.setHaListenPort(nettyServerConfig.getListenPort() + 1);
+            LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
+            JoranConfigurator configurator = new JoranConfigurator();
+            configurator.setContext(lc);
+            lc.reset();
             System.setProperty("brokerLogDir", "");
             if (brokerConfig.isIsolateLogEnable()) {
                 System.setProperty("brokerLogDir", brokerConfig.getBrokerName() + "_" + brokerConfig.getBrokerId());
@@ -172,16 +180,17 @@ public class BrokerStartup {
             if (brokerConfig.isIsolateLogEnable() && messageStoreConfig.isEnableDLegerCommitLog()) {
                 System.setProperty("brokerLogDir", brokerConfig.getBrokerName() + "_" + messageStoreConfig.getdLegerSelfId());
             }
+            configurator.doConfigure(brokerConfig.getRocketmqHome() + "/conf/logback_broker.xml");
 
             if (commandLine.hasOption('p')) {
-                Logger console = LoggerFactory.getLogger(LoggerName.BROKER_CONSOLE_NAME);
+                InternalLogger console = InternalLoggerFactory.getLogger(LoggerName.BROKER_CONSOLE_NAME);
                 MixAll.printObjectProperties(console, brokerConfig);
                 MixAll.printObjectProperties(console, nettyServerConfig);
                 MixAll.printObjectProperties(console, nettyClientConfig);
                 MixAll.printObjectProperties(console, messageStoreConfig);
                 System.exit(0);
             } else if (commandLine.hasOption('m')) {
-                Logger console = LoggerFactory.getLogger(LoggerName.BROKER_CONSOLE_NAME);
+                InternalLogger console = InternalLoggerFactory.getLogger(LoggerName.BROKER_CONSOLE_NAME);
                 MixAll.printObjectProperties(console, brokerConfig, true);
                 MixAll.printObjectProperties(console, nettyServerConfig, true);
                 MixAll.printObjectProperties(console, nettyClientConfig, true);
@@ -189,7 +198,7 @@ public class BrokerStartup {
                 System.exit(0);
             }
 
-            log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+            log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
             MixAll.printObjectProperties(log, brokerConfig);
             MixAll.printObjectProperties(log, nettyServerConfig);
             MixAll.printObjectProperties(log, nettyClientConfig);
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java b/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java
index 98cf6ea19..28f2e92fd 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/client/ClientHousekeepingService.java
@@ -23,12 +23,12 @@ import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.ChannelEventListener;
 
 public class ClientHousekeepingService implements ChannelEventListener {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
 
     private ScheduledExecutorService scheduledExecutorService;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/ConsumerGroupInfo.java b/broker/src/main/java/org/apache/rocketmq/broker/client/ConsumerGroupInfo.java
index c31d952a7..c320d786f 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/client/ConsumerGroupInfo.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/client/ConsumerGroupInfo.java
@@ -26,14 +26,14 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.heartbeat.ConsumeType;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 
 public class ConsumerGroupInfo {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final String groupName;
     private final ConcurrentMap<String/* Topic */, SubscriptionData> subscriptionTable =
         new ConcurrentHashMap<>();
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/ConsumerManager.java b/broker/src/main/java/org/apache/rocketmq/broker/client/ConsumerManager.java
index 5412fe744..bf36078e8 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/client/ConsumerManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/client/ConsumerManager.java
@@ -28,8 +28,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.protocol.heartbeat.ConsumeType;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
@@ -37,7 +37,7 @@ import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 import org.apache.rocketmq.store.stats.BrokerStatsManager;
 
 public class ConsumerManager {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private static final long CHANNEL_EXPIRED_TIMEOUT = 1000 * 120;
     private final ConcurrentMap<String, ConsumerGroupInfo> consumerTable =
         new ConcurrentHashMap<>(1024);
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/DefaultConsumerIdsChangeListener.java b/broker/src/main/java/org/apache/rocketmq/broker/client/DefaultConsumerIdsChangeListener.java
index 344ad40b3..40df2dc02 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/client/DefaultConsumerIdsChangeListener.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/client/DefaultConsumerIdsChangeListener.java
@@ -28,12 +28,12 @@ import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.AbstractBrokerRunnable;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.utils.ThreadUtils;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 
 public class DefaultConsumerIdsChangeListener implements ConsumerIdsChangeListener {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
     private final int cacheSize = 8096;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/ProducerManager.java b/broker/src/main/java/org/apache/rocketmq/broker/client/ProducerManager.java
index 3f12c294e..d8a36e8d9 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/client/ProducerManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/client/ProducerManager.java
@@ -28,15 +28,15 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import org.apache.rocketmq.broker.util.PositiveAtomicCounter;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.protocol.body.ProducerInfo;
 import org.apache.rocketmq.remoting.protocol.body.ProducerTableInfo;
 import org.apache.rocketmq.store.stats.BrokerStatsManager;
 
 public class ProducerManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private static final long CHANNEL_EXPIRED_TIMEOUT = 1000 * 120;
     private static final int GET_AVAILABLE_CHANNEL_RETRY_COUNT = 3;
     private final ConcurrentHashMap<String /* group name */, ConcurrentHashMap<Channel, ClientChannelInfo>> groupChannelTable =
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/net/Broker2Client.java b/broker/src/main/java/org/apache/rocketmq/broker/client/net/Broker2Client.java
index 6e1f063e1..8668761ed 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/client/net/Broker2Client.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/client/net/Broker2Client.java
@@ -34,8 +34,8 @@ import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.message.MessageQueueForC;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingSendRequestException;
 import org.apache.rocketmq.remoting.exception.RemotingTimeoutException;
@@ -51,7 +51,7 @@ import org.apache.rocketmq.remoting.protocol.header.NotifyConsumerIdsChangedRequ
 import org.apache.rocketmq.remoting.protocol.header.ResetOffsetRequestHeader;
 
 public class Broker2Client {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
 
     public Broker2Client(BrokerController brokerController) {
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/client/rebalance/RebalanceLockManager.java b/broker/src/main/java/org/apache/rocketmq/broker/client/rebalance/RebalanceLockManager.java
index 31fa53c25..b4942e827 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/client/rebalance/RebalanceLockManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/client/rebalance/RebalanceLockManager.java
@@ -18,8 +18,8 @@ package org.apache.rocketmq.broker.client.rebalance;
 
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.message.MessageQueue;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -29,7 +29,7 @@ import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
 public class RebalanceLockManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.REBALANCE_LOCK_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.REBALANCE_LOCK_LOGGER_NAME);
     private final static long REBALANCE_LOCK_MAX_LIVE_TIME = Long.parseLong(System.getProperty(
         "rocketmq.broker.rebalance.lockMaxLiveTime", "60000"));
     private final Lock lock = new ReentrantLock();
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/controller/ReplicasManager.java b/broker/src/main/java/org/apache/rocketmq/broker/controller/ReplicasManager.java
index 6754a50f5..4bfb9fdf1 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/controller/ReplicasManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/controller/ReplicasManager.java
@@ -36,8 +36,8 @@ import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.Pair;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.EpochEntry;
 import org.apache.rocketmq.remoting.protocol.body.SyncStateSet;
 import org.apache.rocketmq.remoting.protocol.header.namesrv.controller.GetMetaDataResponseHeader;
@@ -55,7 +55,7 @@ import static org.apache.rocketmq.remoting.protocol.ResponseCode.CONTROLLER_BROK
  * syncStateSet, only master will start this timed task.
  */
 public class ReplicasManager {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private static final int RETRY_INTERVAL_SECOND = 5;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/dledger/DLedgerRoleChangeHandler.java b/broker/src/main/java/org/apache/rocketmq/broker/dledger/DLedgerRoleChangeHandler.java
index bafdf8ec6..5bfe49671 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/dledger/DLedgerRoleChangeHandler.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/dledger/DLedgerRoleChangeHandler.java
@@ -27,15 +27,15 @@ import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.store.DefaultMessageStore;
 import org.apache.rocketmq.store.config.BrokerRole;
 import org.apache.rocketmq.store.dledger.DLedgerCommitLog;
 
 public class DLedgerRoleChangeHandler implements DLedgerLeaderElector.RoleChangeHandler {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private ExecutorService executorService;
     private BrokerController brokerController;
     private DefaultMessageStore messageStore;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/failover/EscapeBridge.java b/broker/src/main/java/org/apache/rocketmq/broker/failover/EscapeBridge.java
index ff5e4d938..913c7a3d5 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/failover/EscapeBridge.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/failover/EscapeBridge.java
@@ -44,8 +44,8 @@ import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.message.MessageQueue;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.store.GetMessageResult;
 import org.apache.rocketmq.store.MessageStore;
@@ -53,7 +53,7 @@ import org.apache.rocketmq.store.PutMessageResult;
 import org.apache.rocketmq.store.PutMessageStatus;
 
 public class EscapeBridge {
-    protected static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    protected static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private static final long SEND_TIMEOUT = 3000L;
     private static final long DEFAULT_PULL_TIMEOUT_MILLIS = 1000 * 10L;
     private final String innerProducerGroupName;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/filter/CommitLogDispatcherCalcBitMap.java b/broker/src/main/java/org/apache/rocketmq/broker/filter/CommitLogDispatcherCalcBitMap.java
index 6df9b010b..d82c53fd9 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/filter/CommitLogDispatcherCalcBitMap.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/filter/CommitLogDispatcherCalcBitMap.java
@@ -20,8 +20,8 @@ package org.apache.rocketmq.broker.filter;
 import org.apache.rocketmq.common.BrokerConfig;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.filter.util.BitsArray;
 import org.apache.rocketmq.store.CommitLogDispatcher;
 import org.apache.rocketmq.store.DispatchRequest;
@@ -34,7 +34,7 @@ import java.util.Iterator;
  */
 public class CommitLogDispatcherCalcBitMap implements CommitLogDispatcher {
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.FILTER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.FILTER_LOGGER_NAME);
 
     protected final BrokerConfig brokerConfig;
     protected final ConsumerFilterManager consumerFilterManager;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/filter/ConsumerFilterManager.java b/broker/src/main/java/org/apache/rocketmq/broker/filter/ConsumerFilterManager.java
index 84d9558b4..533cd52e0 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/filter/ConsumerFilterManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/filter/ConsumerFilterManager.java
@@ -32,8 +32,8 @@ import org.apache.rocketmq.common.filter.ExpressionType;
 import org.apache.rocketmq.filter.FilterFactory;
 import org.apache.rocketmq.filter.util.BloomFilter;
 import org.apache.rocketmq.filter.util.BloomFilterData;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.RemotingSerializable;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 
@@ -42,7 +42,7 @@ import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
  */
 public class ConsumerFilterManager extends ConfigManager {
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.FILTER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.FILTER_LOGGER_NAME);
 
     private static final long MS_24_HOUR = 24 * 3600 * 1000;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/filter/ExpressionMessageFilter.java b/broker/src/main/java/org/apache/rocketmq/broker/filter/ExpressionMessageFilter.java
index 9fe887e37..1e900f3fe 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/filter/ExpressionMessageFilter.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/filter/ExpressionMessageFilter.java
@@ -24,15 +24,15 @@ import org.apache.rocketmq.common.filter.ExpressionType;
 import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.filter.util.BitsArray;
 import org.apache.rocketmq.filter.util.BloomFilter;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 import org.apache.rocketmq.store.ConsumeQueueExt;
 import org.apache.rocketmq.store.MessageFilter;
 
 public class ExpressionMessageFilter implements MessageFilter {
 
-    protected static final Logger log = LoggerFactory.getLogger(LoggerName.FILTER_LOGGER_NAME);
+    protected static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.FILTER_LOGGER_NAME);
 
     protected final SubscriptionData subscriptionData;
     protected final ConsumerFilterData consumerFilterData;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/filtersrv/FilterServerManager.java b/broker/src/main/java/org/apache/rocketmq/broker/filtersrv/FilterServerManager.java
index 6f3ff3432..af06e2a00 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/filtersrv/FilterServerManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/filtersrv/FilterServerManager.java
@@ -33,14 +33,14 @@ import org.apache.rocketmq.common.AbstractBrokerRunnable;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.utils.NetworkUtil;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 
 public class FilterServerManager {
 
     public static final long FILTER_SERVER_MAX_IDLE_TIME_MILLS = 30000;
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final ConcurrentMap<Channel, FilterServerInfo> filterServerTable =
         new ConcurrentHashMap<>(16);
     private final BrokerController brokerController;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/filtersrv/FilterServerUtil.java b/broker/src/main/java/org/apache/rocketmq/broker/filtersrv/FilterServerUtil.java
index 84cc7f641..3f4d24d06 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/filtersrv/FilterServerUtil.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/filtersrv/FilterServerUtil.java
@@ -18,10 +18,10 @@
 package org.apache.rocketmq.broker.filtersrv;
 
 
-import org.apache.rocketmq.shade.org.slf4j.Logger;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class FilterServerUtil {
-    public static void callShell(final String shellString, final Logger log) {
+    public static void callShell(final String shellString, final InternalLogger log) {
         Process process = null;
         try {
             String[] cmdArray = splitShellString(shellString);
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/latency/BrokerFastFailure.java b/broker/src/main/java/org/apache/rocketmq/broker/latency/BrokerFastFailure.java
index 7df67d83b..6269a5535 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/latency/BrokerFastFailure.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/latency/BrokerFastFailure.java
@@ -25,8 +25,8 @@ import org.apache.rocketmq.common.AbstractBrokerRunnable;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.netty.RequestTask;
 import org.apache.rocketmq.remoting.protocol.RemotingSysResponseCode;
 
@@ -35,7 +35,7 @@ import org.apache.rocketmq.remoting.protocol.RemotingSysResponseCode;
  * BrokerController#getPullThreadPoolQueue()}
  */
 public class BrokerFastFailure {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final ScheduledExecutorService scheduledExecutorService;
     private final BrokerController brokerController;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/longpolling/LmqPullRequestHoldService.java b/broker/src/main/java/org/apache/rocketmq/broker/longpolling/LmqPullRequestHoldService.java
index 075f321dd..b3eeea276 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/longpolling/LmqPullRequestHoldService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/longpolling/LmqPullRequestHoldService.java
@@ -19,12 +19,12 @@ package org.apache.rocketmq.broker.longpolling;
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 
 public class LmqPullRequestHoldService extends PullRequestHoldService {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     public LmqPullRequestHoldService(BrokerController brokerController) {
         super(brokerController);
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/longpolling/PullRequestHoldService.java b/broker/src/main/java/org/apache/rocketmq/broker/longpolling/PullRequestHoldService.java
index c2677769d..59b884324 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/longpolling/PullRequestHoldService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/longpolling/PullRequestHoldService.java
@@ -25,12 +25,12 @@ import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.ServiceThread;
 import org.apache.rocketmq.common.SystemClock;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.store.ConsumeQueueExt;
 
 public class PullRequestHoldService extends ServiceThread {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     protected static final String TOPIC_QUEUEID_SEPARATOR = "@";
     protected final BrokerController brokerController;
     private final SystemClock systemClock = new SystemClock();
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java b/broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java
index adb3a8496..4dd0ebaaf 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/metrics/BrokerMetricsManager.java
@@ -56,8 +56,8 @@ import org.apache.rocketmq.common.metrics.NopLongCounter;
 import org.apache.rocketmq.common.metrics.NopLongHistogram;
 import org.apache.rocketmq.common.metrics.NopObservableLongGauge;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.metrics.RemotingMetricsManager;
 import org.apache.rocketmq.remoting.protocol.header.SendMessageRequestHeader;
 import org.apache.rocketmq.store.DefaultMessageStore;
@@ -97,7 +97,7 @@ import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.LABEL
 import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.PROTOCOL_TYPE_REMOTING;
 
 public class BrokerMetricsManager {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private final BrokerConfig brokerConfig;
     private final MessageStore messageStore;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/metrics/ConsumerLagCalculator.java b/broker/src/main/java/org/apache/rocketmq/broker/metrics/ConsumerLagCalculator.java
index 51af5f36b..5a6cdda5a 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/metrics/ConsumerLagCalculator.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/metrics/ConsumerLagCalculator.java
@@ -33,8 +33,8 @@ import org.apache.rocketmq.common.Pair;
 import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.constant.PermName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.subscription.SubscriptionGroupConfig;
 import org.apache.rocketmq.store.MessageStore;
 import org.apache.rocketmq.store.queue.ConsumeQueueInterface;
@@ -49,7 +49,7 @@ public class ConsumerLagCalculator {
     private final MessageStore messageStore;
     private final PopBufferMergeService popBufferMergeService;
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     public ConsumerLagCalculator(BrokerController brokerController) {
         this.brokerConfig = brokerController.getBrokerConfig();
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOffsetManager.java b/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOffsetManager.java
index 70f862506..06fdde862 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOffsetManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOffsetManager.java
@@ -31,13 +31,13 @@ import org.apache.rocketmq.broker.BrokerPathConfigHelper;
 import org.apache.rocketmq.common.ConfigManager;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.DataVersion;
 import org.apache.rocketmq.remoting.protocol.RemotingSerializable;
 
 public class ConsumerOffsetManager extends ConfigManager {
-    private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     public static final String TOPIC_GROUP_SEPARATOR = "@";
 
     private DataVersion dataVersion = new DataVersion();
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOrderInfoLockManager.java b/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOrderInfoLockManager.java
index 194c361c4..3cd8dcdb1 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOrderInfoLockManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOrderInfoLockManager.java
@@ -29,11 +29,11 @@ import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class ConsumerOrderInfoLockManager {
-    private static final Logger POP_LOGGER = LoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
+    private static final InternalLogger POP_LOGGER = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
     private final BrokerController brokerController;
     private final Map<Key, Timeout> timeoutMap = new ConcurrentHashMap<>();
     private final Timer timer;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOrderInfoManager.java b/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOrderInfoManager.java
index 3a496b920..f80949230 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOrderInfoManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/offset/ConsumerOrderInfoManager.java
@@ -32,14 +32,14 @@ import org.apache.rocketmq.broker.BrokerPathConfigHelper;
 import org.apache.rocketmq.common.ConfigManager;
 import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.RemotingSerializable;
 import org.apache.rocketmq.remoting.protocol.header.ExtraInfoUtil;
 
 public class ConsumerOrderInfoManager extends ConfigManager {
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private static final String TOPIC_GROUP_SEPARATOR = "@";
     private static final long CLEAN_SPAN_FROM_LAST = 24 * 3600 * 1000;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/out/BrokerOuterAPI.java b/broker/src/main/java/org/apache/rocketmq/broker/out/BrokerOuterAPI.java
index 80f670fd0..96def3f57 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/out/BrokerOuterAPI.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/out/BrokerOuterAPI.java
@@ -58,8 +58,8 @@ import org.apache.rocketmq.common.namesrv.DefaultTopAddressing;
 import org.apache.rocketmq.common.namesrv.TopAddressing;
 import org.apache.rocketmq.common.sysflag.PullSysFlag;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.InvokeCallback;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.RemotingClient;
@@ -132,7 +132,7 @@ import static org.apache.rocketmq.remoting.protocol.ResponseCode.CONTROLLER_BROK
 import static org.apache.rocketmq.remoting.protocol.ResponseCode.CONTROLLER_NOT_LEADER;
 
 public class BrokerOuterAPI {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final RemotingClient remotingClient;
     private final TopAddressing topAddressing = new DefaultTopAddressing(MixAll.getWSAddr());
     private String nameSrvAddr = null;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java
index aa075e6dd..84d9ab785 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java
@@ -47,8 +47,8 @@ import org.apache.rocketmq.common.message.MessageType;
 import org.apache.rocketmq.common.sysflag.MessageSysFlag;
 import org.apache.rocketmq.common.sysflag.TopicSysFlag;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRemotingAbstract;
@@ -64,8 +64,8 @@ import org.apache.rocketmq.store.PutMessageResult;
 import org.apache.rocketmq.store.stats.BrokerStatsManager;
 
 public abstract class AbstractSendMessageProcessor implements NettyRequestProcessor {
-    protected static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
-    protected static final Logger DLQ_LOG = LoggerFactory.getLogger(LoggerName.DLQ_LOGGER_NAME);
+    protected static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    protected static final InternalLogger DLQ_LOG = InternalLoggerFactory.getLogger(LoggerName.DLQ_LOGGER_NAME);
 
     protected List<ConsumeMessageHook> consumeMessageHookList;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AckMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AckMessageProcessor.java
index 586c46155..6c5ec933c 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AckMessageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AckMessageProcessor.java
@@ -29,8 +29,8 @@ import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.utils.DataConverter;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -43,7 +43,7 @@ import org.apache.rocketmq.store.PutMessageStatus;
 import org.apache.rocketmq.store.pop.AckMsg;
 
 public class AckMessageProcessor implements NettyRequestProcessor {
-    private static final Logger POP_LOGGER = LoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
+    private static final InternalLogger POP_LOGGER = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
     private final BrokerController brokerController;
     private String reviveTopic;
     private PopReviveService[] popReviveServices;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java
index 7415075d6..60cc9c7ea 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java
@@ -72,8 +72,8 @@ import org.apache.rocketmq.common.stats.StatsItem;
 import org.apache.rocketmq.common.stats.StatsSnapshot;
 import org.apache.rocketmq.common.topic.TopicValidator;
 import org.apache.rocketmq.filter.util.BitsArray;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.exception.RemotingTimeoutException;
@@ -189,7 +189,7 @@ import org.apache.rocketmq.store.timer.TimerMessageStore;
 import static org.apache.rocketmq.remoting.protocol.RemotingCommand.buildErrorResponse;
 
 public class AdminBrokerProcessor implements NettyRequestProcessor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     protected final BrokerController brokerController;
 
     public AdminBrokerProcessor(final BrokerController brokerController) {
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/ChangeInvisibleTimeProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/ChangeInvisibleTimeProcessor.java
index 7494bdd7c..6f4853f27 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/ChangeInvisibleTimeProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/ChangeInvisibleTimeProcessor.java
@@ -28,8 +28,8 @@ import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.utils.DataConverter;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -44,7 +44,7 @@ import org.apache.rocketmq.store.pop.AckMsg;
 import org.apache.rocketmq.store.pop.PopCheckPoint;
 
 public class ChangeInvisibleTimeProcessor implements NettyRequestProcessor {
-    private static final Logger POP_LOGGER = LoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
+    private static final InternalLogger POP_LOGGER = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
     private final BrokerController brokerController;
     private final String reviveTopic;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/ClientManageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/ClientManageProcessor.java
index 07807a22f..468ab86f9 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/ClientManageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/ClientManageProcessor.java
@@ -25,8 +25,8 @@ import org.apache.rocketmq.common.constant.PermName;
 import org.apache.rocketmq.common.filter.ExpressionType;
 import org.apache.rocketmq.common.sysflag.TopicSysFlag;
 import org.apache.rocketmq.filter.FilterFactory;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -44,7 +44,7 @@ import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 import org.apache.rocketmq.remoting.protocol.subscription.SubscriptionGroupConfig;
 
 public class ClientManageProcessor implements NettyRequestProcessor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
 
     public ClientManageProcessor(final BrokerController brokerController) {
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/ConsumerManageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/ConsumerManageProcessor.java
index 0af003827..0363aca1e 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/ConsumerManageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/ConsumerManageProcessor.java
@@ -22,8 +22,8 @@ import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.broker.client.ConsumerGroupInfo;
 import org.apache.rocketmq.broker.offset.ConsumerOffsetManager;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -48,7 +48,7 @@ import org.apache.rocketmq.remoting.rpc.RpcResponse;
 import static org.apache.rocketmq.remoting.protocol.RemotingCommand.buildErrorResponse;
 
 public class ConsumerManageProcessor implements NettyRequestProcessor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
 
     public ConsumerManageProcessor(final BrokerController brokerController) {
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/DefaultPullMessageResultHandler.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/DefaultPullMessageResultHandler.java
index af0c81ec2..bd59d42c6 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/DefaultPullMessageResultHandler.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/DefaultPullMessageResultHandler.java
@@ -39,8 +39,8 @@ import org.apache.rocketmq.common.sysflag.MessageSysFlag;
 import org.apache.rocketmq.common.sysflag.PullSysFlag;
 import org.apache.rocketmq.common.topic.TopicValidator;
 import org.apache.rocketmq.common.utils.NetworkUtil;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.metrics.RemotingMetricsManager;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 import org.apache.rocketmq.remoting.protocol.ResponseCode;
@@ -63,7 +63,7 @@ import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.LABEL
 
 public class DefaultPullMessageResultHandler implements PullMessageResultHandler {
 
-    protected static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    protected static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     protected final BrokerController brokerController;
 
     public DefaultPullMessageResultHandler(final BrokerController brokerController) {
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/EndTransactionProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/EndTransactionProcessor.java
index 960023508..dfaa473e3 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/EndTransactionProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/EndTransactionProcessor.java
@@ -27,8 +27,8 @@ import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.sysflag.MessageSysFlag;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -42,7 +42,7 @@ import org.apache.rocketmq.store.config.BrokerRole;
  * EndTransaction processor: process commit and rollback message
  */
 public class EndTransactionProcessor implements NettyRequestProcessor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
     private final BrokerController brokerController;
 
     public EndTransactionProcessor(final BrokerController brokerController) {
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/ForwardRequestProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/ForwardRequestProcessor.java
index 7af75d3af..b0f0a0545 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/ForwardRequestProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/ForwardRequestProcessor.java
@@ -19,13 +19,13 @@ package org.apache.rocketmq.broker.processor;
 import io.netty.channel.ChannelHandlerContext;
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 
 public class ForwardRequestProcessor implements NettyRequestProcessor {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private final BrokerController brokerController;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/NotificationProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/NotificationProcessor.java
index 6c9205a00..1db223068 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/NotificationProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/NotificationProcessor.java
@@ -32,8 +32,8 @@ import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.constant.PermName;
 import org.apache.rocketmq.common.help.FAQUrl;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRemotingAbstract;
@@ -46,7 +46,7 @@ import org.apache.rocketmq.remoting.protocol.header.NotificationResponseHeader;
 import org.apache.rocketmq.remoting.protocol.subscription.SubscriptionGroupConfig;
 
 public class NotificationProcessor implements NettyRequestProcessor {
-    private static final Logger POP_LOGGER = LoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
+    private static final InternalLogger POP_LOGGER = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
     private final BrokerController brokerController;
     private Random random = new Random(System.currentTimeMillis());
     private static final String BORN_TIME = "bornTime";
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/PeekMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/PeekMessageProcessor.java
index 9bf19d807..22863825c 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/PeekMessageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/PeekMessageProcessor.java
@@ -36,8 +36,8 @@ import org.apache.rocketmq.common.constant.PermName;
 import org.apache.rocketmq.common.help.FAQUrl;
 import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.metrics.RemotingMetricsManager;
@@ -59,7 +59,7 @@ import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.LABEL
 import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.LABEL_RESULT;
 
 public class PeekMessageProcessor implements NettyRequestProcessor {
-    private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
     private Random random = new Random(System.currentTimeMillis());
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/PollingInfoProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/PollingInfoProcessor.java
index 8d2703d01..bd3bf6278 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/PollingInfoProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/PollingInfoProcessor.java
@@ -26,8 +26,8 @@ import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.constant.PermName;
 import org.apache.rocketmq.common.help.FAQUrl;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -38,7 +38,7 @@ import org.apache.rocketmq.remoting.protocol.header.PollingInfoResponseHeader;
 import org.apache.rocketmq.remoting.protocol.subscription.SubscriptionGroupConfig;
 
 public class PollingInfoProcessor implements NettyRequestProcessor {
-    private static final Logger POP_LOGGER = LoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
+    private static final InternalLogger POP_LOGGER = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
     private final BrokerController brokerController;
 
     public PollingInfoProcessor(final BrokerController brokerController) {
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/PopBufferMergeService.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/PopBufferMergeService.java
index 40ea99b2e..3a1d8baea 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/PopBufferMergeService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/PopBufferMergeService.java
@@ -31,8 +31,8 @@ import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.utils.DataConverter;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.store.PutMessageResult;
 import org.apache.rocketmq.store.PutMessageStatus;
@@ -41,7 +41,7 @@ import org.apache.rocketmq.store.pop.AckMsg;
 import org.apache.rocketmq.store.pop.PopCheckPoint;
 
 public class PopBufferMergeService extends ServiceThread {
-    private static final Logger POP_LOGGER = LoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
+    private static final InternalLogger POP_LOGGER = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
     ConcurrentHashMap<String/*mergeKey*/, PopCheckPointWrapper>
         buffer = new ConcurrentHashMap<>(1024 * 16);
     ConcurrentHashMap<String/*topic@cid@queueId*/, QueueWithTime<PopCheckPointWrapper>> commitOffsets =
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/PopMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/PopMessageProcessor.java
index 7251c616b..f0f23e75e 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/PopMessageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/PopMessageProcessor.java
@@ -55,8 +55,8 @@ import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.topic.TopicValidator;
 import org.apache.rocketmq.common.utils.DataConverter;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.metrics.RemotingMetricsManager;
@@ -85,8 +85,8 @@ import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.LABEL
 import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.LABEL_RESULT;
 
 public class PopMessageProcessor implements NettyRequestProcessor {
-    private static final Logger POP_LOGGER =
-        LoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
+    private static final InternalLogger POP_LOGGER =
+        InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
     private final BrokerController brokerController;
     private Random random = new Random(System.currentTimeMillis());
     String reviveTopic;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/PopReviveService.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/PopReviveService.java
index 50489e230..96ea64aa9 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/PopReviveService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/PopReviveService.java
@@ -42,8 +42,8 @@ import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.topic.TopicValidator;
 import org.apache.rocketmq.common.utils.DataConverter;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.store.AppendMessageStatus;
 import org.apache.rocketmq.store.GetMessageResult;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
@@ -56,7 +56,7 @@ import static org.apache.rocketmq.broker.metrics.BrokerMetricsConstant.LABEL_IS_
 import static org.apache.rocketmq.broker.metrics.BrokerMetricsConstant.LABEL_TOPIC;
 
 public class PopReviveService extends ServiceThread {
-    private static final Logger POP_LOGGER = LoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
+    private static final InternalLogger POP_LOGGER = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_POP_LOGGER_NAME);
 
     private int queueId;
     private BrokerController brokerController;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/PullMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/PullMessageProcessor.java
index 6d595e46f..5fa604111 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/PullMessageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/PullMessageProcessor.java
@@ -38,8 +38,8 @@ import org.apache.rocketmq.common.constant.PermName;
 import org.apache.rocketmq.common.filter.ExpressionType;
 import org.apache.rocketmq.common.help.FAQUrl;
 import org.apache.rocketmq.common.sysflag.PullSysFlag;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRemotingAbstract;
@@ -75,7 +75,7 @@ import org.apache.rocketmq.store.stats.BrokerStatsManager;
 import static org.apache.rocketmq.remoting.protocol.RemotingCommand.buildErrorResponse;
 
 public class PullMessageProcessor implements NettyRequestProcessor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private List<ConsumeMessageHook> consumeMessageHookList;
     private PullMessageResultHandler pullMessageResultHandler;
     private final BrokerController brokerController;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/QueryAssignmentProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/QueryAssignmentProcessor.java
index 8ecc3f0f5..28c32ad62 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/QueryAssignmentProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/QueryAssignmentProcessor.java
@@ -37,8 +37,8 @@ import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.message.MessageQueueAssignment;
 import org.apache.rocketmq.common.message.MessageRequestMode;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -51,7 +51,7 @@ import org.apache.rocketmq.remoting.protocol.body.SetMessageRequestModeRequestBo
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
 
 public class QueryAssignmentProcessor implements NettyRequestProcessor {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private final BrokerController brokerController;
 
@@ -64,9 +64,9 @@ public class QueryAssignmentProcessor implements NettyRequestProcessor {
 
         //register strategy
         //NOTE: init with broker's log instead of init with ClientLogger.getLog();
-        AllocateMessageQueueAveragely allocateMessageQueueAveragely = new AllocateMessageQueueAveragely();
+        AllocateMessageQueueAveragely allocateMessageQueueAveragely = new AllocateMessageQueueAveragely(log);
         name2LoadStrategy.put(allocateMessageQueueAveragely.getName(), allocateMessageQueueAveragely);
-        AllocateMessageQueueAveragelyByCircle allocateMessageQueueAveragelyByCircle = new AllocateMessageQueueAveragelyByCircle();
+        AllocateMessageQueueAveragelyByCircle allocateMessageQueueAveragelyByCircle = new AllocateMessageQueueAveragelyByCircle(log);
         name2LoadStrategy.put(allocateMessageQueueAveragelyByCircle.getName(), allocateMessageQueueAveragelyByCircle);
 
         this.messageRequestModeManager = new MessageRequestModeManager(brokerController);
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/QueryMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/QueryMessageProcessor.java
index 1a271cfb0..f027a687d 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/QueryMessageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/QueryMessageProcessor.java
@@ -26,8 +26,8 @@ import org.apache.rocketmq.broker.pagecache.OneMessageTransfer;
 import org.apache.rocketmq.broker.pagecache.QueryMessageTransfer;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.metrics.RemotingMetricsManager;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -45,7 +45,7 @@ import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.LABEL
 import static org.apache.rocketmq.remoting.metrics.RemotingMetricsConstant.LABEL_RESULT;
 
 public class QueryMessageProcessor implements NettyRequestProcessor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
 
     public QueryMessageProcessor(final BrokerController brokerController) {
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/ReplyMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/ReplyMessageProcessor.java
index d16a9a69a..91d3bb784 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/processor/ReplyMessageProcessor.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/ReplyMessageProcessor.java
@@ -36,8 +36,8 @@ import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
@@ -55,7 +55,7 @@ import static org.apache.rocketmq.broker.metrics.BrokerMetricsConstant.LABEL_MES
 import static org.apache.rocketmq.broker.metrics.BrokerMetricsConstant.LABEL_TOPIC;
 
 public class ReplyMessageProcessor extends AbstractSendMessageProcessor {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     public ReplyMessageProcessor(final BrokerController brokerController) {
         super(brokerController);
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/schedule/ScheduleMessageService.java b/broker/src/main/java/org/apache/rocketmq/broker/schedule/ScheduleMessageService.java
index bb7db9ea7..4bf09b8b6 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/schedule/ScheduleMessageService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/schedule/ScheduleMessageService.java
@@ -50,8 +50,8 @@ import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.running.RunningStats;
 import org.apache.rocketmq.common.topic.TopicValidator;
 import org.apache.rocketmq.common.utils.ThreadUtils;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.DataVersion;
 import org.apache.rocketmq.store.PutMessageResult;
 import org.apache.rocketmq.store.PutMessageStatus;
@@ -66,7 +66,7 @@ import static org.apache.rocketmq.broker.metrics.BrokerMetricsConstant.LABEL_MES
 import static org.apache.rocketmq.broker.metrics.BrokerMetricsConstant.LABEL_TOPIC;
 
 public class ScheduleMessageService extends ConfigManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private static final long FIRST_DELAY_TIME = 1000L;
     private static final long DELAY_FOR_A_WHILE = 100L;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/slave/SlaveSynchronize.java b/broker/src/main/java/org/apache/rocketmq/broker/slave/SlaveSynchronize.java
index 7a4a17c41..750b17426 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/slave/SlaveSynchronize.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/slave/SlaveSynchronize.java
@@ -23,8 +23,8 @@ import org.apache.rocketmq.broker.loadbalance.MessageRequestModeManager;
 import org.apache.rocketmq.broker.subscription.SubscriptionGroupManager;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.body.ConsumerOffsetSerializeWrapper;
 import org.apache.rocketmq.remoting.protocol.body.MessageRequestModeSerializeWrapper;
 import org.apache.rocketmq.remoting.protocol.body.SubscriptionGroupWrapper;
@@ -34,7 +34,7 @@ import org.apache.rocketmq.store.timer.TimerCheckpoint;
 import org.apache.rocketmq.store.timer.TimerMetrics;
 
 public class SlaveSynchronize {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerController brokerController;
     private volatile String masterAddr = null;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java b/broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java
index 4a097546b..3b153ef2d 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java
@@ -26,14 +26,14 @@ import org.apache.rocketmq.broker.BrokerPathConfigHelper;
 import org.apache.rocketmq.common.ConfigManager;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.DataVersion;
 import org.apache.rocketmq.remoting.protocol.RemotingSerializable;
 import org.apache.rocketmq.remoting.protocol.subscription.SubscriptionGroupConfig;
 
 public class SubscriptionGroupManager extends ConfigManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private final ConcurrentMap<String, SubscriptionGroupConfig> subscriptionGroupTable =
         new ConcurrentHashMap<>(1024);
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java
index 90c029bae..6eb10f592 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java
@@ -42,8 +42,8 @@ import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.constant.PermName;
 import org.apache.rocketmq.common.sysflag.TopicSysFlag;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.DataVersion;
 import org.apache.rocketmq.remoting.protocol.body.KVTable;
 import org.apache.rocketmq.remoting.protocol.body.TopicConfigSerializeWrapper;
@@ -51,7 +51,7 @@ import org.apache.rocketmq.remoting.protocol.body.TopicConfigSerializeWrapper;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 public class TopicConfigManager extends ConfigManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private static final long LOCK_TIMEOUT_MILLIS = 3000;
     private static final int SCHEDULE_TOPIC_QUEUE_NUM = 18;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicQueueMappingCleanService.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicQueueMappingCleanService.java
index 98e50d42a..e08adbcb6 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicQueueMappingCleanService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicQueueMappingCleanService.java
@@ -30,8 +30,8 @@ import org.apache.rocketmq.common.ServiceThread;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.message.MessageQueue;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.RequestCode;
 import org.apache.rocketmq.remoting.protocol.admin.TopicOffset;
 import org.apache.rocketmq.remoting.protocol.admin.TopicStatsTable;
@@ -49,7 +49,7 @@ import org.apache.rocketmq.remoting.rpc.RpcResponse;
 import org.apache.rocketmq.store.config.MessageStoreConfig;
 
 public class TopicQueueMappingCleanService extends ServiceThread {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private TopicQueueMappingManager topicQueueMappingManager;
     private BrokerOuterAPI brokerOuterAPI;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicQueueMappingManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicQueueMappingManager.java
index 65600e033..7a8ab7cca 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicQueueMappingManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicQueueMappingManager.java
@@ -27,8 +27,8 @@ import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.broker.BrokerPathConfigHelper;
 import org.apache.rocketmq.common.ConfigManager;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.DataVersion;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 import org.apache.rocketmq.remoting.protocol.ResponseCode;
@@ -43,7 +43,7 @@ import org.apache.rocketmq.remoting.rpc.TopicRequestHeader;
 import static org.apache.rocketmq.remoting.protocol.RemotingCommand.buildErrorResponse;
 
 public class TopicQueueMappingManager extends ConfigManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private static final long LOCK_TIMEOUT_MILLIS = 3000;
     private transient final Lock lock = new ReentrantLock();
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicRouteInfoManager.java b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicRouteInfoManager.java
index a5788738d..715c8493a 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicRouteInfoManager.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/topic/TopicRouteInfoManager.java
@@ -36,8 +36,8 @@ import org.apache.rocketmq.client.impl.producer.TopicPublishInfo;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.message.MessageQueue;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.NamespaceUtil;
 import org.apache.rocketmq.remoting.protocol.ResponseCode;
@@ -48,7 +48,7 @@ public class TopicRouteInfoManager {
 
     private static final long GET_TOPIC_ROUTE_TIMEOUT = 3000L;
     private static final long LOCK_TIMEOUT_MILLIS = 3000L;
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private final Lock lockNamesrv = new ReentrantLock();
     private final ConcurrentMap<String/* Topic */, TopicRouteData> topicRouteTable = new ConcurrentHashMap<>();
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/transaction/AbstractTransactionalMessageCheckListener.java b/broker/src/main/java/org/apache/rocketmq/broker/transaction/AbstractTransactionalMessageCheckListener.java
index 6549615ea..91a80f0b8 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/transaction/AbstractTransactionalMessageCheckListener.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/transaction/AbstractTransactionalMessageCheckListener.java
@@ -27,12 +27,12 @@ import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageExt;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.header.CheckTransactionStateRequestHeader;
 
 public abstract class AbstractTransactionalMessageCheckListener {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
 
     private BrokerController brokerController;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/transaction/TransactionalMessageCheckService.java b/broker/src/main/java/org/apache/rocketmq/broker/transaction/TransactionalMessageCheckService.java
index 2cbf060f0..6a3c2d2b2 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/transaction/TransactionalMessageCheckService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/transaction/TransactionalMessageCheckService.java
@@ -19,11 +19,11 @@ package org.apache.rocketmq.broker.transaction;
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.ServiceThread;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class TransactionalMessageCheckService extends ServiceThread {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
 
     private BrokerController brokerController;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/DefaultTransactionalMessageCheckListener.java b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/DefaultTransactionalMessageCheckListener.java
index 53080cab2..a66709a16 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/DefaultTransactionalMessageCheckListener.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/DefaultTransactionalMessageCheckListener.java
@@ -24,8 +24,8 @@ import org.apache.rocketmq.common.message.MessageAccessor;
 import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExt;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.store.PutMessageResult;
 import org.apache.rocketmq.store.PutMessageStatus;
@@ -33,7 +33,7 @@ import org.apache.rocketmq.store.PutMessageStatus;
 import java.util.concurrent.ThreadLocalRandom;
 
 public class DefaultTransactionalMessageCheckListener extends AbstractTransactionalMessageCheckListener {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
 
     public DefaultTransactionalMessageCheckListener() {
         super();
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageBridge.java b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageBridge.java
index 3abbc9ced..21ba11951 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageBridge.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageBridge.java
@@ -44,10 +44,10 @@ import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.sysflag.MessageSysFlag;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
+import org.apache.rocketmq.logging.InnerLoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 import org.apache.rocketmq.store.GetMessageResult;
 import org.apache.rocketmq.store.MessageStore;
 import org.apache.rocketmq.store.PutMessageResult;
@@ -58,7 +58,7 @@ import static org.apache.rocketmq.broker.metrics.BrokerMetricsConstant.LABEL_IS_
 import static org.apache.rocketmq.broker.metrics.BrokerMetricsConstant.LABEL_TOPIC;
 
 public class TransactionalMessageBridge {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InnerLoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
 
     private final ConcurrentHashMap<Integer, MessageQueue> opQueueMap = new ConcurrentHashMap<>();
     private final BrokerController brokerController;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageServiceImpl.java b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageServiceImpl.java
index 1a65f97b3..2ec501633 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageServiceImpl.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalMessageServiceImpl.java
@@ -40,8 +40,8 @@ import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.topic.TopicValidator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.ResponseCode;
 import org.apache.rocketmq.remoting.protocol.header.EndTransactionRequestHeader;
 import org.apache.rocketmq.store.PutMessageResult;
@@ -49,7 +49,7 @@ import org.apache.rocketmq.store.PutMessageStatus;
 import org.apache.rocketmq.store.config.BrokerRole;
 
 public class TransactionalMessageServiceImpl implements TransactionalMessageService {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
 
     private TransactionalMessageBridge transactionalMessageBridge;
 
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalOpBatchService.java b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalOpBatchService.java
index 411a2cf43..dfd0474e4 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalOpBatchService.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/transaction/queue/TransactionalOpBatchService.java
@@ -19,11 +19,11 @@ package org.apache.rocketmq.broker.transaction.queue;
 import org.apache.rocketmq.broker.BrokerController;
 import org.apache.rocketmq.common.ServiceThread;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class TransactionalOpBatchService extends ServiceThread {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
 
     private BrokerController brokerController;
     private TransactionalMessageServiceImpl transactionalMessageService;
diff --git a/broker/src/main/java/org/apache/rocketmq/broker/util/HookUtils.java b/broker/src/main/java/org/apache/rocketmq/broker/util/HookUtils.java
index 72eb086db..c6f7bfa38 100644
--- a/broker/src/main/java/org/apache/rocketmq/broker/util/HookUtils.java
+++ b/broker/src/main/java/org/apache/rocketmq/broker/util/HookUtils.java
@@ -32,8 +32,8 @@ import org.apache.rocketmq.common.message.MessageExtBrokerInner;
 import org.apache.rocketmq.common.sysflag.MessageSysFlag;
 import org.apache.rocketmq.common.topic.TopicValidator;
 import org.apache.rocketmq.common.utils.QueueTypeUtils;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.store.PutMessageResult;
 import org.apache.rocketmq.store.PutMessageStatus;
 import org.apache.rocketmq.store.config.BrokerRole;
@@ -41,7 +41,7 @@ import org.apache.rocketmq.store.timer.TimerMessageStore;
 
 public class HookUtils {
 
-    protected static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    protected static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private static AtomicLong printTimes = new AtomicLong(0);
 
diff --git a/broker/src/test/java/org/apache/rocketmq/broker/util/TransactionalMessageServiceImpl.java b/broker/src/test/java/org/apache/rocketmq/broker/util/TransactionalMessageServiceImpl.java
index 8b2d7f1b2..0f7cc4f70 100644
--- a/broker/src/test/java/org/apache/rocketmq/broker/util/TransactionalMessageServiceImpl.java
+++ b/broker/src/test/java/org/apache/rocketmq/broker/util/TransactionalMessageServiceImpl.java
@@ -23,13 +23,13 @@ import org.apache.rocketmq.broker.transaction.TransactionalMessageService;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageExtBrokerInner;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.header.EndTransactionRequestHeader;
 import org.apache.rocketmq.store.PutMessageResult;
 
 public class TransactionalMessageServiceImpl implements TransactionalMessageService {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.TRANSACTION_LOGGER_NAME);
 
     @Override
     public PutMessageResult prepareMessage(MessageExtBrokerInner messageInner) {
diff --git a/client/src/test/resources/rmq.logback-test.xml b/broker/src/test/resources/logback-test.xml
similarity index 62%
rename from client/src/test/resources/rmq.logback-test.xml
rename to broker/src/test/resources/logback-test.xml
index c3ec0d1e8..7718d4a33 100644
--- a/client/src/test/resources/rmq.logback-test.xml
+++ b/broker/src/test/resources/logback-test.xml
@@ -15,22 +15,18 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
+
 <configuration>
 
-    <appender name="CONSOLE" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
-        <layout class="org.apache.rocketmq.shade.ch.qos.logback.classic.PatternLayout">
-            <Pattern>
-                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
-            </Pattern>
-        </layout>
+    <appender name="DefaultAppender" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n</pattern>
+            <charset class="java.nio.charset.Charset">UTF-8</charset>
+        </encoder>
     </appender>
 
-    <logger name="org.apache.rocketmq" level="error" additivity="false">
-        <appender-ref ref="CONSOLE"/>
-    </logger>
-
-    <root level="error">
-        <appender-ref ref="CONSOLE"/>
+    <root>
+        <level value="OFF"/>
+        <appender-ref ref="DefaultAppender"/>
     </root>
-
-</configuration>
\ No newline at end of file
+</configuration>
diff --git a/client/BUILD.bazel b/client/BUILD.bazel
index 353fc0bc5..8637a2316 100644
--- a/client/BUILD.bazel
+++ b/client/BUILD.bazel
@@ -23,6 +23,7 @@ java_library(
     deps = [
         "//common",
         "//remoting",
+        "//logging",        
         "@maven//:org_apache_commons_commons_lang3",
         "@maven//:commons_validator_commons_validator",
         "@maven//:com_github_luben_zstd_jni",
@@ -31,7 +32,6 @@ java_library(
         "@maven//:io_netty_netty_all",
         "@maven//:io_opentracing_opentracing_api",
         "@maven//:commons_collections_commons_collections",
-        "@maven//:io_github_aliyun_mq_rocketmq_slf4j_api",
     ],
 )
 
diff --git a/client/pom.xml b/client/pom.xml
index 9d0dd30fc..d572eafc2 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -35,7 +35,6 @@
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-remoting</artifactId>
-            <version>${project.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>io.netty</groupId>
@@ -59,13 +58,5 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
-        <dependency>
-            <groupId>io.github.aliyun-mq</groupId>
-            <artifactId>rocketmq-slf4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.github.aliyun-mq</groupId>
-            <artifactId>rocketmq-logback-classic</artifactId>
-        </dependency>
     </dependencies>
 </project>
diff --git a/client/src/main/java/org/apache/rocketmq/client/MQHelper.java b/client/src/main/java/org/apache/rocketmq/client/MQHelper.java
index 6c35cd131..610d2ebcf 100644
--- a/client/src/main/java/org/apache/rocketmq/client/MQHelper.java
+++ b/client/src/main/java/org/apache/rocketmq/client/MQHelper.java
@@ -19,14 +19,12 @@ package org.apache.rocketmq.client;
 import java.util.Set;
 import java.util.TreeSet;
 import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.message.MessageQueue;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class MQHelper {
-    private static final Logger log = LoggerFactory.getLogger(MQHelper.class);
-
     @Deprecated
     public static void resetOffsetByTimestamp(
         final MessageModel messageModel,
@@ -39,11 +37,11 @@ public class MQHelper {
     /**
      * Reset consumer topic offset according to time
      *
-     * @param messageModel  which model
-     * @param instanceName  which instance
+     * @param messageModel which model
+     * @param instanceName which instance
      * @param consumerGroup consumer group
-     * @param topic         topic
-     * @param timestamp     time
+     * @param topic topic
+     * @param timestamp time
      */
     public static void resetOffsetByTimestamp(
         final MessageModel messageModel,
@@ -51,6 +49,7 @@ public class MQHelper {
         final String consumerGroup,
         final String topic,
         final long timestamp) throws Exception {
+        final InternalLogger log = ClientLogger.getLog();
 
         DefaultMQPullConsumer consumer = new DefaultMQPullConsumer(consumerGroup);
         consumer.setInstanceName(instanceName);
diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultLitePullConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultLitePullConsumer.java
index 5de860494..4e03fd62f 100644
--- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultLitePullConsumer.java
+++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultLitePullConsumer.java
@@ -25,6 +25,7 @@ import org.apache.rocketmq.client.consumer.rebalance.AllocateMessageQueueAverage
 import org.apache.rocketmq.client.consumer.store.OffsetStore;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.impl.consumer.DefaultLitePullConsumerImpl;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.trace.AsyncTraceDispatcher;
 import org.apache.rocketmq.client.trace.TraceDispatcher;
 import org.apache.rocketmq.client.trace.hook.ConsumeMessageTraceHookImpl;
@@ -33,15 +34,14 @@ import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.protocol.NamespaceUtil;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class DefaultLitePullConsumer extends ClientConfig implements LitePullConsumer {
 
-    private static final Logger log = LoggerFactory.getLogger(DefaultLitePullConsumer.class);
+    private final InternalLogger log = ClientLogger.getLog();
 
     private final DefaultLitePullConsumerImpl defaultLitePullConsumerImpl;
 
diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java
index 71920986d..2c82835bb 100644
--- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java
+++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java
@@ -30,6 +30,7 @@ import org.apache.rocketmq.client.consumer.store.OffsetStore;
 import org.apache.rocketmq.client.exception.MQBrokerException;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.trace.AsyncTraceDispatcher;
 import org.apache.rocketmq.client.trace.TraceDispatcher;
 import org.apache.rocketmq.client.trace.hook.ConsumeMessageTraceHookImpl;
@@ -39,12 +40,11 @@ import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
 import org.apache.rocketmq.common.message.MessageDecoder;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.NamespaceUtil;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 /**
  * In most scenarios, this is the mostly recommended class to consume messages.
@@ -63,7 +63,7 @@ import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
  */
 public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsumer {
 
-    private final Logger log = LoggerFactory.getLogger(DefaultMQPushConsumer.class);
+    private final InternalLogger log = ClientLogger.getLog();
 
     /**
      * Internal implementation. Most of the functions herein are delegated to it.
diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumerScheduleService.java b/client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumerScheduleService.java
index 45eb0db70..f53dd31cc 100644
--- a/client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumerScheduleService.java
+++ b/client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumerScheduleService.java
@@ -24,13 +24,13 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.message.MessageQueue;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.protocol.NamespaceUtil;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 /**
  * Schedule service for pull consumer.
@@ -38,7 +38,7 @@ import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
  * DefaultLitePullConsumer} is recommend to use in the scenario of actively pulling messages.
  */
 public class MQPullConsumerScheduleService {
-    private final Logger log = LoggerFactory.getLogger(MQPullConsumerScheduleService.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final MessageQueueListener messageQueueListener = new MessageQueueListenerImpl();
     private final ConcurrentMap<MessageQueue, PullTaskImpl> taskTable =
         new ConcurrentHashMap<>();
diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AbstractAllocateMessageQueueStrategy.java b/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AbstractAllocateMessageQueueStrategy.java
index a550f7e01..39b44e5e0 100644
--- a/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AbstractAllocateMessageQueueStrategy.java
+++ b/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AbstractAllocateMessageQueueStrategy.java
@@ -21,13 +21,21 @@ import java.util.List;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.client.consumer.AllocateMessageQueueStrategy;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.message.MessageQueue;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public abstract class AbstractAllocateMessageQueueStrategy implements AllocateMessageQueueStrategy {
 
-    private static final Logger log = LoggerFactory.getLogger(AbstractAllocateMessageQueueStrategy.class);
+    protected InternalLogger log;
+
+    AbstractAllocateMessageQueueStrategy() {
+        this.log = ClientLogger.getLog();
+    }
+
+    public AbstractAllocateMessageQueueStrategy(InternalLogger log) {
+        this.log = log;
+    }
 
     public boolean check(String consumerGroup, String currentCID, List<MessageQueue> mqAll,
         List<String> cidAll) {
diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AllocateMessageQueueAveragely.java b/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AllocateMessageQueueAveragely.java
index 75e5d1c21..c3d3dbcd4 100644
--- a/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AllocateMessageQueueAveragely.java
+++ b/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AllocateMessageQueueAveragely.java
@@ -18,6 +18,8 @@ package org.apache.rocketmq.client.consumer.rebalance;
 
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.rocketmq.client.log.ClientLogger;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.common.message.MessageQueue;
 
 /**
@@ -25,6 +27,14 @@ import org.apache.rocketmq.common.message.MessageQueue;
  */
 public class AllocateMessageQueueAveragely extends AbstractAllocateMessageQueueStrategy {
 
+    public AllocateMessageQueueAveragely() {
+        log = ClientLogger.getLog();
+    }
+
+    public AllocateMessageQueueAveragely(InternalLogger log) {
+        super(log);
+    }
+
     @Override
     public List<MessageQueue> allocate(String consumerGroup, String currentCID, List<MessageQueue> mqAll,
         List<String> cidAll) {
diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AllocateMessageQueueAveragelyByCircle.java b/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AllocateMessageQueueAveragelyByCircle.java
index cc618a81a..10f8c9de1 100644
--- a/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AllocateMessageQueueAveragelyByCircle.java
+++ b/client/src/main/java/org/apache/rocketmq/client/consumer/rebalance/AllocateMessageQueueAveragelyByCircle.java
@@ -18,6 +18,8 @@ package org.apache.rocketmq.client.consumer.rebalance;
 
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.rocketmq.client.log.ClientLogger;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.common.message.MessageQueue;
 
 /**
@@ -25,6 +27,14 @@ import org.apache.rocketmq.common.message.MessageQueue;
  */
 public class AllocateMessageQueueAveragelyByCircle extends AbstractAllocateMessageQueueStrategy {
 
+    public AllocateMessageQueueAveragelyByCircle() {
+        log = ClientLogger.getLog();
+    }
+
+    public AllocateMessageQueueAveragelyByCircle(InternalLogger log) {
+        super(log);
+    }
+
     @Override
     public List<MessageQueue> allocate(String consumerGroup, String currentCID, List<MessageQueue> mqAll,
         List<String> cidAll) {
diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/store/LocalFileOffsetStore.java b/client/src/main/java/org/apache/rocketmq/client/consumer/store/LocalFileOffsetStore.java
index d24478a1b..108130d51 100644
--- a/client/src/main/java/org/apache/rocketmq/client/consumer/store/LocalFileOffsetStore.java
+++ b/client/src/main/java/org/apache/rocketmq/client/consumer/store/LocalFileOffsetStore.java
@@ -28,13 +28,13 @@ import java.util.concurrent.atomic.AtomicLong;
 import org.apache.rocketmq.client.exception.MQBrokerException;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.help.FAQUrl;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.remoting.exception.RemotingException;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 /**
  * Local storage implementation
@@ -43,7 +43,7 @@ public class LocalFileOffsetStore implements OffsetStore {
     public final static String LOCAL_OFFSET_STORE_DIR = System.getProperty(
         "rocketmq.client.localOffsetStoreDir",
         System.getProperty("user.home") + File.separator + ".rocketmq_offsets");
-    private final static Logger log = LoggerFactory.getLogger(LocalFileOffsetStore.class);
+    private final static InternalLogger log = ClientLogger.getLog();
     private final MQClientInstance mQClientFactory;
     private final String groupName;
     private final String storePath;
diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/store/RemoteBrokerOffsetStore.java b/client/src/main/java/org/apache/rocketmq/client/consumer/store/RemoteBrokerOffsetStore.java
index 3a597361e..98e6c7672 100644
--- a/client/src/main/java/org/apache/rocketmq/client/consumer/store/RemoteBrokerOffsetStore.java
+++ b/client/src/main/java/org/apache/rocketmq/client/consumer/store/RemoteBrokerOffsetStore.java
@@ -28,20 +28,20 @@ import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.exception.OffsetNotFoundException;
 import org.apache.rocketmq.client.impl.FindBrokerResult;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.message.MessageQueue;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.header.QueryConsumerOffsetRequestHeader;
 import org.apache.rocketmq.remoting.protocol.header.UpdateConsumerOffsetRequestHeader;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 /**
  * Remote storage implementation
  */
 public class RemoteBrokerOffsetStore implements OffsetStore {
-    private final static Logger log = LoggerFactory.getLogger(RemoteBrokerOffsetStore.class);
+    private final static InternalLogger log = ClientLogger.getLog();
     private final MQClientInstance mQClientFactory;
     private final String groupName;
     private ConcurrentMap<MessageQueue, AtomicLong> offsetTable =
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/ClientRemotingProcessor.java b/client/src/main/java/org/apache/rocketmq/client/impl/ClientRemotingProcessor.java
index 263b9e1d4..501ad4c20 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/ClientRemotingProcessor.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/ClientRemotingProcessor.java
@@ -24,6 +24,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
 import org.apache.rocketmq.client.impl.producer.MQProducerInner;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.RequestFutureHolder;
 import org.apache.rocketmq.client.producer.RequestResponseFuture;
 import org.apache.rocketmq.common.UtilAll;
@@ -36,6 +37,7 @@ import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.sysflag.MessageSysFlag;
 import org.apache.rocketmq.common.utils.NetworkUtil;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -54,11 +56,9 @@ import org.apache.rocketmq.remoting.protocol.header.GetConsumerStatusRequestHead
 import org.apache.rocketmq.remoting.protocol.header.NotifyConsumerIdsChangedRequestHeader;
 import org.apache.rocketmq.remoting.protocol.header.ReplyMessageRequestHeader;
 import org.apache.rocketmq.remoting.protocol.header.ResetOffsetRequestHeader;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class ClientRemotingProcessor implements NettyRequestProcessor {
-    private final Logger logger = LoggerFactory.getLogger(ClientRemotingProcessor.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final MQClientInstance mqClientFactory;
 
     public ClientRemotingProcessor(final MQClientInstance mqClientFactory) {
@@ -119,13 +119,13 @@ public class ClientRemotingProcessor implements NettyRequestProcessor {
                     final String addr = RemotingHelper.parseChannelRemoteAddr(ctx.channel());
                     producer.checkTransactionState(addr, messageExt, requestHeader);
                 } else {
-                    logger.debug("checkTransactionState, pick producer by group[{}] failed", group);
+                    log.debug("checkTransactionState, pick producer by group[{}] failed", group);
                 }
             } else {
-                logger.warn("checkTransactionState, pick producer group failed");
+                log.warn("checkTransactionState, pick producer group failed");
             }
         } else {
-            logger.warn("checkTransactionState, decode message failed");
+            log.warn("checkTransactionState, decode message failed");
         }
 
         return null;
@@ -136,12 +136,12 @@ public class ClientRemotingProcessor implements NettyRequestProcessor {
         try {
             final NotifyConsumerIdsChangedRequestHeader requestHeader =
                 (NotifyConsumerIdsChangedRequestHeader) request.decodeCommandCustomHeader(NotifyConsumerIdsChangedRequestHeader.class);
-            logger.info("receive broker's notification[{}], the consumer group: {} changed, rebalance immediately",
+            log.info("receive broker's notification[{}], the consumer group: {} changed, rebalance immediately",
                 RemotingHelper.parseChannelRemoteAddr(ctx.channel()),
                 requestHeader.getConsumerGroup());
             this.mqClientFactory.rebalanceImmediately();
         } catch (Exception e) {
-            logger.error("notifyConsumerIdsChanged exception", UtilAll.exceptionSimpleDesc(e));
+            log.error("notifyConsumerIdsChanged exception", UtilAll.exceptionSimpleDesc(e));
         }
         return null;
     }
@@ -150,7 +150,7 @@ public class ClientRemotingProcessor implements NettyRequestProcessor {
         RemotingCommand request) throws RemotingCommandException {
         final ResetOffsetRequestHeader requestHeader =
             (ResetOffsetRequestHeader) request.decodeCommandCustomHeader(ResetOffsetRequestHeader.class);
-        logger.info("invoke reset offset operation from broker. brokerAddr={}, topic={}, group={}, timestamp={}",
+        log.info("invoke reset offset operation from broker. brokerAddr={}, topic={}, group={}, timestamp={}",
             RemotingHelper.parseChannelRemoteAddr(ctx.channel()), requestHeader.getTopic(), requestHeader.getGroup(),
             requestHeader.getTimestamp());
         Map<MessageQueue, Long> offsetTable = new HashMap<>();
@@ -252,7 +252,7 @@ public class ClientRemotingProcessor implements NettyRequestProcessor {
                     Compressor compressor = CompressorFactory.getCompressor(MessageSysFlag.getCompressionType(sysFlag));
                     body = compressor.decompress(body);
                 } catch (IOException e) {
-                    logger.warn("err when uncompress constant", e);
+                    log.warn("err when uncompress constant", e);
                 }
             }
             msg.setBody(body);
@@ -261,14 +261,14 @@ public class ClientRemotingProcessor implements NettyRequestProcessor {
             MessageAccessor.putProperty(msg, MessageConst.PROPERTY_REPLY_MESSAGE_ARRIVE_TIME, String.valueOf(receiveTime));
             msg.setBornTimestamp(requestHeader.getBornTimestamp());
             msg.setReconsumeTimes(requestHeader.getReconsumeTimes() == null ? 0 : requestHeader.getReconsumeTimes());
-            logger.debug("receive reply message :{}", msg);
+            log.debug("receive reply message :{}", msg);
 
             processReplyMessage(msg);
 
             response.setCode(ResponseCode.SUCCESS);
             response.setRemark(null);
         } catch (Exception e) {
-            logger.warn("unknown err when receiveReplyMsg", e);
+            log.warn("unknown err when receiveReplyMsg", e);
             response.setCode(ResponseCode.SYSTEM_ERROR);
             response.setRemark("process reply message fail");
         }
@@ -288,7 +288,7 @@ public class ClientRemotingProcessor implements NettyRequestProcessor {
             }
         } else {
             String bornHost = replyMsg.getBornHostString();
-            logger.warn(String.format("receive reply message, but not matched any request, CorrelationId: %s , reply from host: %s",
+            log.warn(String.format("receive reply message, but not matched any request, CorrelationId: %s , reply from host: %s",
                 correlationId, bornHost));
         }
     }
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/MQAdminImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/MQAdminImpl.java
index 598672255..11247981b 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/MQAdminImpl.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/MQAdminImpl.java
@@ -34,6 +34,7 @@ import org.apache.rocketmq.client.exception.MQBrokerException;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
 import org.apache.rocketmq.client.impl.producer.TopicPublishInfo;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.TopicConfig;
 import org.apache.rocketmq.common.help.FAQUrl;
@@ -43,6 +44,7 @@ import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageId;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.utils.NetworkUtil;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.InvokeCallback;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.exception.RemotingException;
@@ -54,12 +56,10 @@ import org.apache.rocketmq.remoting.protocol.header.QueryMessageRequestHeader;
 import org.apache.rocketmq.remoting.protocol.header.QueryMessageResponseHeader;
 import org.apache.rocketmq.remoting.protocol.route.BrokerData;
 import org.apache.rocketmq.remoting.protocol.route.TopicRouteData;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class MQAdminImpl {
 
-    private static final Logger log = LoggerFactory.getLogger(MQAdminImpl.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final MQClientInstance mQClientFactory;
     private long timeoutMillis = 6000;
 
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/MQClientAPIImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/MQClientAPIImpl.java
index 138fc9a02..f0d6f8dc9 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/MQClientAPIImpl.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/MQClientAPIImpl.java
@@ -50,6 +50,7 @@ import org.apache.rocketmq.client.impl.consumer.PullResultExt;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
 import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl;
 import org.apache.rocketmq.client.impl.producer.TopicPublishInfo;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.SendCallback;
 import org.apache.rocketmq.client.producer.SendResult;
 import org.apache.rocketmq.client.producer.SendStatus;
@@ -73,6 +74,7 @@ import org.apache.rocketmq.common.namesrv.DefaultTopAddressing;
 import org.apache.rocketmq.common.namesrv.NameServerUpdateCallback;
 import org.apache.rocketmq.common.namesrv.TopAddressing;
 import org.apache.rocketmq.common.sysflag.PullSysFlag;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.CommandCustomHeader;
 import org.apache.rocketmq.remoting.InvokeCallback;
 import org.apache.rocketmq.remoting.RPCHook;
@@ -217,13 +219,11 @@ import org.apache.rocketmq.remoting.protocol.subscription.GroupForbidden;
 import org.apache.rocketmq.remoting.protocol.subscription.SubscriptionGroupConfig;
 import org.apache.rocketmq.remoting.rpchook.DynamicalExtFieldRPCHook;
 import org.apache.rocketmq.remoting.rpchook.StreamTypeRPCHook;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 import static org.apache.rocketmq.remoting.protocol.RemotingSysResponseCode.SUCCESS;
 
 public class MQClientAPIImpl implements NameServerUpdateCallback {
-    private final static Logger log = LoggerFactory.getLogger(MQClientAPIImpl.class);
+    private final static InternalLogger log = ClientLogger.getLog();
     private static boolean sendSmartMsg =
         Boolean.parseBoolean(System.getProperty("org.apache.rocketmq.client.sendSmartMsg", "true"));
 
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/MQClientManager.java b/client/src/main/java/org/apache/rocketmq/client/impl/MQClientManager.java
index cb52180df..3f4bda7cc 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/MQClientManager.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/MQClientManager.java
@@ -21,12 +21,12 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.rocketmq.client.ClientConfig;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class MQClientManager {
-    private final static Logger log = LoggerFactory.getLogger(MQClientManager.class);
+    private final static InternalLogger log = ClientLogger.getLog();
     private static MQClientManager instance = new MQClientManager();
     private AtomicInteger factoryIndexGenerator = new AtomicInteger();
     private ConcurrentMap<String/* clientId */, MQClientInstance> factoryTable =
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java
index b7eddb2a6..9dc2cbef2 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java
@@ -35,6 +35,7 @@ import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
 import org.apache.rocketmq.client.consumer.listener.ConsumeReturnType;
 import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
 import org.apache.rocketmq.client.hook.ConsumeMessageContext;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.stat.ConsumerStatsManager;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
@@ -43,13 +44,12 @@ import org.apache.rocketmq.common.message.MessageAccessor;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.utils.ThreadUtils;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.protocol.body.CMResult;
 import org.apache.rocketmq.remoting.protocol.body.ConsumeMessageDirectlyResult;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class ConsumeMessageConcurrentlyService implements ConsumeMessageService {
-    private static final Logger log = LoggerFactory.getLogger(ConsumeMessageConcurrentlyService.class);
+    private static final InternalLogger log = ClientLogger.getLog();
     private final DefaultMQPushConsumerImpl defaultMQPushConsumerImpl;
     private final DefaultMQPushConsumer defaultMQPushConsumer;
     private final MessageListenerConcurrently messageListener;
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java
index eb6def1d9..5750263e1 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java
@@ -33,6 +33,7 @@ import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
 import org.apache.rocketmq.client.consumer.listener.ConsumeReturnType;
 import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
 import org.apache.rocketmq.client.hook.ConsumeMessageContext;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.stat.ConsumerStatsManager;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
@@ -43,15 +44,14 @@ import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.utils.ThreadUtils;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.protocol.NamespaceUtil;
 import org.apache.rocketmq.remoting.protocol.body.CMResult;
 import org.apache.rocketmq.remoting.protocol.body.ConsumeMessageDirectlyResult;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class ConsumeMessageOrderlyService implements ConsumeMessageService {
-    private static final Logger log = LoggerFactory.getLogger(ConsumeMessageOrderlyService.class);
+    private static final InternalLogger log = ClientLogger.getLog();
     private final static long MAX_TIME_CONSUME_CONTINUOUSLY =
         Long.parseLong(System.getProperty("rocketmq.client.maxTimeConsumeContinuously", "60000"));
     private final DefaultMQPushConsumerImpl defaultMQPushConsumerImpl;
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessagePopConcurrentlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessagePopConcurrentlyService.java
index 96c0bca3f..f22efc148 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessagePopConcurrentlyService.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessagePopConcurrentlyService.java
@@ -35,6 +35,7 @@ import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
 import org.apache.rocketmq.client.consumer.listener.ConsumeReturnType;
 import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
 import org.apache.rocketmq.client.hook.ConsumeMessageContext;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.stat.ConsumerStatsManager;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
@@ -44,14 +45,13 @@ import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.utils.ThreadUtils;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.protocol.body.CMResult;
 import org.apache.rocketmq.remoting.protocol.body.ConsumeMessageDirectlyResult;
 import org.apache.rocketmq.remoting.protocol.header.ExtraInfoUtil;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class ConsumeMessagePopConcurrentlyService implements ConsumeMessageService {
-    private static final Logger log = LoggerFactory.getLogger(ConsumeMessagePopConcurrentlyService.class);
+    private static final InternalLogger log = ClientLogger.getLog();
     private final DefaultMQPushConsumerImpl defaultMQPushConsumerImpl;
     private final DefaultMQPushConsumer defaultMQPushConsumer;
     private final MessageListenerConcurrently messageListener;
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessagePopOrderlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessagePopOrderlyService.java
index d84a164b3..bd4adc8dd 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessagePopOrderlyService.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessagePopOrderlyService.java
@@ -30,6 +30,7 @@ import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
 import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
 import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
 import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.stat.ConsumerStatsManager;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
@@ -40,15 +41,14 @@ import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.utils.ThreadUtils;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.protocol.NamespaceUtil;
 import org.apache.rocketmq.remoting.protocol.body.CMResult;
 import org.apache.rocketmq.remoting.protocol.body.ConsumeMessageDirectlyResult;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class ConsumeMessagePopOrderlyService implements ConsumeMessageService {
-    private static final Logger log = LoggerFactory.getLogger(ConsumeMessagePopOrderlyService.class);
+    private static final InternalLogger log = ClientLogger.getLog();
     private final DefaultMQPushConsumerImpl defaultMQPushConsumerImpl;
     private final DefaultMQPushConsumer defaultMQPushConsumer;
     private final MessageListenerOrderly messageListener;
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java
index 9a6cab1f0..f8763e049 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java
@@ -55,6 +55,7 @@ import org.apache.rocketmq.client.hook.FilterMessageHook;
 import org.apache.rocketmq.client.impl.CommunicationMode;
 import org.apache.rocketmq.client.impl.MQClientManager;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.ServiceState;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
@@ -64,6 +65,7 @@ import org.apache.rocketmq.common.help.FAQUrl;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.sysflag.PullSysFlag;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.NamespaceUtil;
@@ -72,12 +74,10 @@ import org.apache.rocketmq.remoting.protocol.filter.FilterAPI;
 import org.apache.rocketmq.remoting.protocol.heartbeat.ConsumeType;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class DefaultLitePullConsumerImpl implements MQConsumerInner {
 
-    private static final Logger log = LoggerFactory.getLogger(DefaultLitePullConsumerImpl.class);
+    private final InternalLogger log = ClientLogger.getLog();
 
     private final long consumerStartTimestamp = System.currentTimeMillis();
 
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java
index b5c854a9c..1b41499a9 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java
@@ -42,6 +42,7 @@ import org.apache.rocketmq.client.hook.FilterMessageHook;
 import org.apache.rocketmq.client.impl.CommunicationMode;
 import org.apache.rocketmq.client.impl.MQClientManager;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.ServiceState;
 import org.apache.rocketmq.common.UtilAll;
@@ -54,6 +55,7 @@ import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.sysflag.PullSysFlag;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingException;
@@ -63,8 +65,6 @@ import org.apache.rocketmq.remoting.protocol.filter.FilterAPI;
 import org.apache.rocketmq.remoting.protocol.heartbeat.ConsumeType;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 /**
  * This class will be removed in 2022, and a better implementation {@link DefaultLitePullConsumerImpl} is recommend to use
@@ -72,7 +72,7 @@ import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
  */
 @Deprecated
 public class DefaultMQPullConsumerImpl implements MQConsumerInner {
-    private static final Logger log = LoggerFactory.getLogger(DefaultMQPullConsumerImpl.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final DefaultMQPullConsumer defaultMQPullConsumer;
     private final long consumerStartTimestamp = System.currentTimeMillis();
     private final RPCHook rpcHook;
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java
index 353f4de01..53262d63c 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java
@@ -58,6 +58,7 @@ import org.apache.rocketmq.client.impl.CommunicationMode;
 import org.apache.rocketmq.client.impl.FindBrokerResult;
 import org.apache.rocketmq.client.impl.MQClientManager;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.stat.ConsumerStatsManager;
 import org.apache.rocketmq.common.KeyBuilder;
 import org.apache.rocketmq.common.MixAll;
@@ -71,6 +72,7 @@ import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.sysflag.PullSysFlag;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingException;
@@ -90,8 +92,7 @@ import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 import org.apache.rocketmq.remoting.protocol.route.BrokerData;
 import org.apache.rocketmq.remoting.protocol.route.TopicRouteData;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+
 
 public class DefaultMQPushConsumerImpl implements MQConsumerInner {
     /**
@@ -108,7 +109,7 @@ public class DefaultMQPushConsumerImpl implements MQConsumerInner {
     private static final long PULL_TIME_DELAY_MILLS_WHEN_SUSPEND = 1000;
     private static final long BROKER_SUSPEND_MAX_TIME_MILLIS = 1000 * 15;
     private static final long CONSUMER_TIMEOUT_MILLIS_WHEN_SUSPEND = 1000 * 30;
-    private static final Logger log = LoggerFactory.getLogger(DefaultMQPushConsumerImpl.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final DefaultMQPushConsumer defaultMQPushConsumer;
     private final RebalanceImpl rebalanceImpl = new RebalancePushImpl(this);
     private final ArrayList<FilterMessageHook> filterMessageHookList = new ArrayList<>();
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ProcessQueue.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ProcessQueue.java
index 7857d4a2d..da2832591 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ProcessQueue.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ProcessQueue.java
@@ -28,12 +28,12 @@ import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.message.MessageAccessor;
 import org.apache.rocketmq.common.message.MessageConst;
 import org.apache.rocketmq.common.message.MessageExt;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.protocol.body.ProcessQueueInfo;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 /**
  * Queue consumption snapshot
@@ -43,7 +43,7 @@ public class ProcessQueue {
         Long.parseLong(System.getProperty("rocketmq.client.rebalance.lockMaxLiveTime", "30000"));
     public final static long REBALANCE_LOCK_INTERVAL = Long.parseLong(System.getProperty("rocketmq.client.rebalance.lockInterval", "20000"));
     private final static long PULL_MAX_IDLE_TIME = Long.parseLong(System.getProperty("rocketmq.client.pull.pullMaxIdleTime", "120000"));
-    private final Logger log = LoggerFactory.getLogger(ProcessQueue.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final ReadWriteLock treeMapLock = new ReentrantReadWriteLock();
     private final TreeMap<Long, MessageExt> msgTreeMap = new TreeMap<>();
     private final AtomicLong msgCount = new AtomicLong();
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java
index a4fbf367f..dd7b9af85 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullAPIWrapper.java
@@ -34,6 +34,7 @@ import org.apache.rocketmq.client.hook.FilterMessageHook;
 import org.apache.rocketmq.client.impl.CommunicationMode;
 import org.apache.rocketmq.client.impl.FindBrokerResult;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.MQVersion;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.filter.ExpressionType;
@@ -44,16 +45,15 @@ import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.sysflag.MessageSysFlag;
 import org.apache.rocketmq.common.sysflag.PullSysFlag;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.header.PopMessageRequestHeader;
 import org.apache.rocketmq.remoting.protocol.header.PullMessageRequestHeader;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 import org.apache.rocketmq.remoting.protocol.route.TopicRouteData;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class PullAPIWrapper {
-    private static final Logger log = LoggerFactory.getLogger(PullAPIWrapper.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final MQClientInstance mQClientFactory;
     private final String consumerGroup;
     private final boolean unitMode;
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullMessageService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullMessageService.java
index 5adb3663a..a5f3379f9 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullMessageService.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/PullMessageService.java
@@ -22,14 +22,14 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.ServiceThread;
 import org.apache.rocketmq.common.message.MessageRequestMode;
 import org.apache.rocketmq.common.utils.ThreadUtils;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class PullMessageService extends ServiceThread {
-    private final Logger logger = LoggerFactory.getLogger(PullMessageService.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final LinkedBlockingQueue<MessageRequest> messageRequestQueue = new LinkedBlockingQueue<>();
 
     private final MQClientInstance mQClientFactory;
@@ -54,7 +54,7 @@ public class PullMessageService extends ServiceThread {
                 }
             }, timeDelay, TimeUnit.MILLISECONDS);
         } else {
-            logger.warn("PullMessageServiceScheduledThread has shutdown");
+            log.warn("PullMessageServiceScheduledThread has shutdown");
         }
     }
 
@@ -62,7 +62,7 @@ public class PullMessageService extends ServiceThread {
         try {
             this.messageRequestQueue.put(pullRequest);
         } catch (InterruptedException e) {
-            logger.error("executePullRequestImmediately pullRequestQueue.put", e);
+            log.error("executePullRequestImmediately pullRequestQueue.put", e);
         }
     }
 
@@ -75,7 +75,7 @@ public class PullMessageService extends ServiceThread {
                 }
             }, timeDelay, TimeUnit.MILLISECONDS);
         } else {
-            logger.warn("PullMessageServiceScheduledThread has shutdown");
+            log.warn("PullMessageServiceScheduledThread has shutdown");
         }
     }
 
@@ -83,7 +83,7 @@ public class PullMessageService extends ServiceThread {
         try {
             this.messageRequestQueue.put(pullRequest);
         } catch (InterruptedException e) {
-            logger.error("executePullRequestImmediately pullRequestQueue.put", e);
+            log.error("executePullRequestImmediately pullRequestQueue.put", e);
         }
     }
 
@@ -91,7 +91,7 @@ public class PullMessageService extends ServiceThread {
         if (!isStopped()) {
             this.scheduledExecutorService.schedule(r, timeDelay, TimeUnit.MILLISECONDS);
         } else {
-            logger.warn("PullMessageServiceScheduledThread has shutdown");
+            log.warn("PullMessageServiceScheduledThread has shutdown");
         }
     }
 
@@ -105,7 +105,7 @@ public class PullMessageService extends ServiceThread {
             DefaultMQPushConsumerImpl impl = (DefaultMQPushConsumerImpl) consumer;
             impl.pullMessage(pullRequest);
         } else {
-            logger.warn("No matched consumer for the PullRequest {}, drop it", pullRequest);
+            log.warn("No matched consumer for the PullRequest {}, drop it", pullRequest);
         }
     }
 
@@ -115,13 +115,13 @@ public class PullMessageService extends ServiceThread {
             DefaultMQPushConsumerImpl impl = (DefaultMQPushConsumerImpl) consumer;
             impl.popMessage(popRequest);
         } else {
-            logger.warn("No matched consumer for the PopRequest {}, drop it", popRequest);
+            log.warn("No matched consumer for the PopRequest {}, drop it", popRequest);
         }
     }
 
     @Override
     public void run() {
-        logger.info(this.getServiceName() + " service started");
+        log.info(this.getServiceName() + " service started");
 
         while (!this.isStopped()) {
             try {
@@ -133,11 +133,11 @@ public class PullMessageService extends ServiceThread {
                 }
             } catch (InterruptedException ignored) {
             } catch (Exception e) {
-                logger.error("Pull Message Service Run Method exception", e);
+                log.error("Pull Message Service Run Method exception", e);
             }
         }
 
-        logger.info(this.getServiceName() + " service end");
+        log.info(this.getServiceName() + " service end");
     }
 
     @Override
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java
index 0c91eaae0..45a252197 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java
@@ -31,11 +31,13 @@ import org.apache.rocketmq.client.consumer.AllocateMessageQueueStrategy;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.impl.FindBrokerResult;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.KeyBuilder;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.message.MessageQueueAssignment;
 import org.apache.rocketmq.common.message.MessageRequestMode;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.exception.RemotingTimeoutException;
 import org.apache.rocketmq.remoting.protocol.body.LockBatchRequestBody;
 import org.apache.rocketmq.remoting.protocol.body.UnlockBatchRequestBody;
@@ -43,11 +45,9 @@ import org.apache.rocketmq.remoting.protocol.filter.FilterAPI;
 import org.apache.rocketmq.remoting.protocol.heartbeat.ConsumeType;
 import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;
 import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public abstract class RebalanceImpl {
-    protected static final Logger log = LoggerFactory.getLogger(RebalanceImpl.class);
+    protected static final InternalLogger log = ClientLogger.getLog();
 
     protected final ConcurrentMap<MessageQueue, ProcessQueue> processQueueTable = new ConcurrentHashMap<>(64);
     protected final ConcurrentMap<MessageQueue, PopProcessQueue> popProcessQueueTable = new ConcurrentHashMap<>(64);
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceService.java
index 394381f9d..c8f8ab140 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceService.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceService.java
@@ -17,15 +17,15 @@
 package org.apache.rocketmq.client.impl.consumer;
 
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.ServiceThread;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class RebalanceService extends ServiceThread {
     private static long waitInterval =
         Long.parseLong(System.getProperty(
             "rocketmq.client.rebalance.waitInterval", "20000"));
-    private final Logger log = LoggerFactory.getLogger(RebalanceService.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final MQClientInstance mqClientFactory;
 
     public RebalanceService(MQClientInstance mqClientFactory) {
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java
index 843134c3f..beb220488 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java
@@ -52,6 +52,7 @@ import org.apache.rocketmq.client.impl.consumer.RebalanceService;
 import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl;
 import org.apache.rocketmq.client.impl.producer.MQProducerInner;
 import org.apache.rocketmq.client.impl.producer.TopicPublishInfo;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.stat.ConsumerStatsManager;
 import org.apache.rocketmq.common.MQVersion;
@@ -64,6 +65,7 @@ import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.message.MessageQueueAssignment;
 import org.apache.rocketmq.common.topic.TopicValidator;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.netty.NettyClientConfig;
@@ -80,14 +82,12 @@ import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData;
 import org.apache.rocketmq.remoting.protocol.route.BrokerData;
 import org.apache.rocketmq.remoting.protocol.route.QueueData;
 import org.apache.rocketmq.remoting.protocol.route.TopicRouteData;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 import static org.apache.rocketmq.remoting.rpc.ClientMetadata.topicRouteData2EndpointsForStaticTopic;
 
 public class MQClientInstance {
     private final static long LOCK_TIMEOUT_MILLIS = 3000;
-    private final static Logger log = LoggerFactory.getLogger(MQClientInstance.class);
+    private final static InternalLogger log = ClientLogger.getLog();
     private final ClientConfig clientConfig;
     private final String clientId;
     private final long bootTimestamp = System.currentTimeMillis();
diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java
index a867297f4..8c669ace1 100644
--- a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java
+++ b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java
@@ -51,6 +51,7 @@ import org.apache.rocketmq.client.impl.CommunicationMode;
 import org.apache.rocketmq.client.impl.MQClientManager;
 import org.apache.rocketmq.client.impl.factory.MQClientInstance;
 import org.apache.rocketmq.client.latency.MQFaultStrategy;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.producer.LocalTransactionExecuter;
 import org.apache.rocketmq.client.producer.LocalTransactionState;
@@ -84,6 +85,7 @@ import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.message.MessageType;
 import org.apache.rocketmq.common.sysflag.MessageSysFlag;
 import org.apache.rocketmq.common.utils.CorrelationIdUtil;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.exception.RemotingConnectException;
 import org.apache.rocketmq.remoting.exception.RemotingException;
@@ -93,12 +95,10 @@ import org.apache.rocketmq.remoting.protocol.NamespaceUtil;
 import org.apache.rocketmq.remoting.protocol.header.CheckTransactionStateRequestHeader;
 import org.apache.rocketmq.remoting.protocol.header.EndTransactionRequestHeader;
 import org.apache.rocketmq.remoting.protocol.header.SendMessageRequestHeader;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class DefaultMQProducerImpl implements MQProducerInner {
 
-    private final Logger log = LoggerFactory.getLogger(DefaultMQProducerImpl.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final Random random = new Random();
     private final DefaultMQProducer defaultMQProducer;
     private final ConcurrentMap<String/* topic */, TopicPublishInfo> topicPublishInfoTable =
diff --git a/client/src/main/java/org/apache/rocketmq/client/latency/MQFaultStrategy.java b/client/src/main/java/org/apache/rocketmq/client/latency/MQFaultStrategy.java
index c4ca85e48..a8c7b0747 100644
--- a/client/src/main/java/org/apache/rocketmq/client/latency/MQFaultStrategy.java
+++ b/client/src/main/java/org/apache/rocketmq/client/latency/MQFaultStrategy.java
@@ -18,12 +18,12 @@
 package org.apache.rocketmq.client.latency;
 
 import org.apache.rocketmq.client.impl.producer.TopicPublishInfo;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.message.MessageQueue;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class MQFaultStrategy {
-    private final static Logger log = LoggerFactory.getLogger(MQFaultStrategy.class);
+    private final static InternalLogger log = ClientLogger.getLog();
     private final LatencyFaultTolerance<String> latencyFaultTolerance = new LatencyFaultToleranceImpl();
 
     private boolean sendLatencyFaultEnable = false;
diff --git a/client/src/main/java/org/apache/rocketmq/client/log/ClientLogger.java b/client/src/main/java/org/apache/rocketmq/client/log/ClientLogger.java
new file mode 100644
index 000000000..7ee2ebaa4
--- /dev/null
+++ b/client/src/main/java/org/apache/rocketmq/client/log/ClientLogger.java
@@ -0,0 +1,124 @@
+/*
+ * 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.rocketmq.client.log;
+
+import org.apache.rocketmq.common.constant.LoggerName;
+import org.apache.rocketmq.logging.InnerLoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
+import org.apache.rocketmq.logging.inner.Appender;
+import org.apache.rocketmq.logging.inner.Layout;
+import org.apache.rocketmq.logging.inner.Level;
+import org.apache.rocketmq.logging.inner.Logger;
+import org.apache.rocketmq.logging.inner.LoggingBuilder;
+import org.apache.rocketmq.logging.inner.LoggingEvent;
+import org.apache.rocketmq.remoting.common.RemotingHelper;
+
+public class ClientLogger {
+
+    public static final String CLIENT_LOG_USESLF4J = "rocketmq.client.logUseSlf4j";
+    public static final String CLIENT_LOG_ROOT = "rocketmq.client.logRoot";
+    public static final String CLIENT_LOG_MAXINDEX = "rocketmq.client.logFileMaxIndex";
+    public static final String CLIENT_LOG_FILESIZE = "rocketmq.client.logFileMaxSize";
+    public static final String CLIENT_LOG_LEVEL = "rocketmq.client.logLevel";
+    public static final String CLIENT_LOG_ADDITIVE = "rocketmq.client.log.additive";
+    public static final String CLIENT_LOG_FILENAME = "rocketmq.client.logFileName";
+    public static final String CLIENT_LOG_ASYNC_QUEUESIZE = "rocketmq.client.logAsyncQueueSize";
+    public static final String ROCKETMQ_CLIENT_APPENDER_NAME = "RocketmqClientAppender";
+
+    private static final InternalLogger CLIENT_LOGGER;
+
+    private static final boolean CLIENT_USE_SLF4J;
+
+    private static Appender appenderProxy = new AppenderProxy();
+
+    //private static Appender rocketmqClientAppender = null;
+
+    static {
+        CLIENT_USE_SLF4J = Boolean.parseBoolean(System.getProperty(CLIENT_LOG_USESLF4J, "false"));
+        if (!CLIENT_USE_SLF4J) {
+            InternalLoggerFactory.setCurrentLoggerType(InnerLoggerFactory.LOGGER_INNER);
+            CLIENT_LOGGER = createLogger(LoggerName.CLIENT_LOGGER_NAME);
+            createLogger(LoggerName.COMMON_LOGGER_NAME);
+            createLogger(RemotingHelper.ROCKETMQ_REMOTING);
+            Logger.getRootLogger().addAppender(appenderProxy);
+        } else {
+            CLIENT_LOGGER = InternalLoggerFactory.getLogger(LoggerName.CLIENT_LOGGER_NAME);
+        }
+    }
+
+    private static synchronized Appender createClientAppender() {
+        String clientLogRoot = System.getProperty(CLIENT_LOG_ROOT, System.getProperty("user.home") + "/logs/rocketmqlogs");
+        String clientLogMaxIndex = System.getProperty(CLIENT_LOG_MAXINDEX, "10");
+        String clientLogFileName = System.getProperty(CLIENT_LOG_FILENAME, "rocketmq_client.log");
+        String maxFileSize = System.getProperty(CLIENT_LOG_FILESIZE, "1073741824");
+        String asyncQueueSize = System.getProperty(CLIENT_LOG_ASYNC_QUEUESIZE, "1024");
+
+        String logFileName = clientLogRoot + "/" + clientLogFileName;
+
+        int maxFileIndex = Integer.parseInt(clientLogMaxIndex);
+        int queueSize = Integer.parseInt(asyncQueueSize);
+
+        Layout layout = LoggingBuilder.newLayoutBuilder().withDefaultLayout().build();
+
+        Appender rocketmqClientAppender = LoggingBuilder.newAppenderBuilder()
+            .withRollingFileAppender(logFileName, maxFileSize, maxFileIndex)
+            .withAsync(false, queueSize).withName(ROCKETMQ_CLIENT_APPENDER_NAME).withLayout(layout).build();
+
+        return rocketmqClientAppender;
+    }
+
+    private static InternalLogger createLogger(final String loggerName) {
+        String clientLogLevel = System.getProperty(CLIENT_LOG_LEVEL, "INFO");
+        boolean additive = "true".equalsIgnoreCase(System.getProperty(CLIENT_LOG_ADDITIVE));
+        InternalLogger logger = InternalLoggerFactory.getLogger(loggerName);
+        InnerLoggerFactory.InnerLogger innerLogger = (InnerLoggerFactory.InnerLogger) logger;
+        Logger realLogger = innerLogger.getLogger();
+
+        //if (rocketmqClientAppender == null) {
+        //   createClientAppender();
+        //}
+
+        realLogger.addAppender(appenderProxy);
+        realLogger.setLevel(Level.toLevel(clientLogLevel));
+        realLogger.setAdditivity(additive);
+        return logger;
+    }
+
+    public static InternalLogger getLog() {
+        return CLIENT_LOGGER;
+    }
+
+    static class AppenderProxy extends Appender {
+        private Appender proxy;
+
+        @Override
+        protected void append(LoggingEvent event) {
+            if (null == proxy) {
+                proxy = ClientLogger.createClientAppender();
+            }
+            proxy.doAppend(event);
+        }
+
+        @Override
+        public void close() {
+            if (null != proxy) {
+                proxy.close();
+            }
+        }
+    }
+}
diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java
index cb91fe4db..a311f86d6 100644
--- a/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java
+++ b/client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java
@@ -30,6 +30,7 @@ import org.apache.rocketmq.client.exception.MQBrokerException;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.exception.RequestTimeoutException;
 import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.trace.AsyncTraceDispatcher;
 import org.apache.rocketmq.client.trace.TraceDispatcher;
 import org.apache.rocketmq.client.trace.hook.EndTransactionTraceHookImpl;
@@ -41,11 +42,10 @@ import org.apache.rocketmq.common.message.MessageClientIDSetter;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.topic.TopicValidator;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.ResponseCode;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 /**
  * This class is the entry point for applications intending to send messages. </p>
@@ -65,7 +65,7 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer {
      * Wrapping internal implementations for virtually all methods presented in this class.
      */
     protected final transient DefaultMQProducerImpl defaultMQProducerImpl;
-    private final Logger logger = LoggerFactory.getLogger(DefaultMQProducer.class);
+    private final InternalLogger log = ClientLogger.getLog();
     private final Set<Integer> retryResponseCodes = new CopyOnWriteArraySet<>(Arrays.asList(
         ResponseCode.TOPIC_NOT_EXIST,
         ResponseCode.SERVICE_NOT_AVAILABLE,
@@ -272,7 +272,7 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer {
                 this.defaultMQProducerImpl.registerEndTransactionHook(
                     new EndTransactionTraceHookImpl(traceDispatcher));
             } catch (Throwable e) {
-                logger.error("system mqtrace hook init failed ,maybe can't send msg trace data");
+                log.error("system mqtrace hook init failed ,maybe can't send msg trace data");
             }
         }
     }
@@ -301,7 +301,7 @@ public class DefaultMQProducer extends ClientConfig implements MQProducer {
             try {
                 traceDispatcher.start(this.getNamesrvAddr(), this.getAccessChannel());
             } catch (MQClientException e) {
-                logger.warn("trace dispatcher start failed ", e);
+                log.warn("trace dispatcher start failed ", e);
             }
         }
     }
diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureHolder.java b/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureHolder.java
index 0a89d548e..100890d87 100644
--- a/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureHolder.java
+++ b/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureHolder.java
@@ -31,12 +31,12 @@ import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.client.common.ClientErrorCode;
 import org.apache.rocketmq.client.exception.RequestTimeoutException;
 import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class RequestFutureHolder {
-    private static final Logger log = LoggerFactory.getLogger(RequestFutureHolder.class);
+    private static InternalLogger log = ClientLogger.getLog();
     private static final RequestFutureHolder INSTANCE = new RequestFutureHolder();
     private ConcurrentHashMap<String, RequestResponseFuture> requestFutureTable = new ConcurrentHashMap<>();
     private final Set<DefaultMQProducerImpl> producerSet = new HashSet<>();
diff --git a/client/src/main/java/org/apache/rocketmq/client/stat/ConsumerStatsManager.java b/client/src/main/java/org/apache/rocketmq/client/stat/ConsumerStatsManager.java
index 9d50409ab..5c87fb01f 100644
--- a/client/src/main/java/org/apache/rocketmq/client/stat/ConsumerStatsManager.java
+++ b/client/src/main/java/org/apache/rocketmq/client/stat/ConsumerStatsManager.java
@@ -18,14 +18,14 @@
 package org.apache.rocketmq.client.stat;
 
 import java.util.concurrent.ScheduledExecutorService;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.common.stats.StatsItemSet;
 import org.apache.rocketmq.common.stats.StatsSnapshot;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.protocol.body.ConsumeStatus;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class ConsumerStatsManager {
-    private static final Logger log = LoggerFactory.getLogger(ConsumerStatsManager.class);
+    private static final InternalLogger log = ClientLogger.getLog();
 
     private static final String TOPIC_AND_GROUP_CONSUME_OK_TPS = "CONSUME_OK_TPS";
     private static final String TOPIC_AND_GROUP_CONSUME_FAILED_TPS = "CONSUME_FAILED_TPS";
diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java
index 0da760cf9..67b8a8a05 100644
--- a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java
+++ b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java
@@ -35,6 +35,7 @@ import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl;
 import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl;
 import org.apache.rocketmq.client.impl.producer.TopicPublishInfo;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.producer.MessageQueueSelector;
 import org.apache.rocketmq.client.producer.SendCallback;
@@ -44,14 +45,14 @@ import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.message.Message;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.common.topic.TopicValidator;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 import static org.apache.rocketmq.client.trace.TraceConstants.TRACE_INSTANCE_NAME;
 
 public class AsyncTraceDispatcher implements TraceDispatcher {
-    private final static Logger log = LoggerFactory.getLogger(AsyncTraceDispatcher.class);
+
+    private final static InternalLogger log = ClientLogger.getLog();
     private final static AtomicInteger COUNTER = new AtomicInteger();
     private final int queueSize;
     private final int batchSize;
diff --git a/client/src/main/resources/rmq.client.logback.xml b/client/src/main/resources/rmq.client.logback.xml
deleted file mode 100644
index 5d398b434..000000000
--- a/client/src/main/resources/rmq.client.logback.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
-  -->
-
-<configuration debug="false">
-    <conversionRule conversionWord="pid" converterClass="io.github.aliyunmq.logback.extensions.ProcessIdConverter"/>
-    <appender name="CustomConsoleAppender" class="io.github.aliyunmq.logback.extensions.CustomConsoleAppender">
-        <encoder>
-            <pattern>%yellow(%d{yyy-MM-dd HH:mm:ss.SSS,GMT+8}) %highlight(%-5p) %boldWhite([%pid]) %magenta([%t]) %boldGreen([%logger{12}#%M:%L]) - %m%n
-            </pattern>
-            <charset class="java.nio.charset.Charset">UTF-8</charset>
-        </encoder>
-    </appender>
-    <appender name="DefaultAppender" class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
-        <append>true</append>
-        <File>
-            ${rocketmq.log.root:-${user.home}${file.separator}logs${file.separator}rocketmqlogs}${file.separator}rocketmq_client.log
-        </File>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>
-                ${rocketmq.log.root:-${user.home}${file.separator}logs${file.separator}rocketmqlogs}${file.separator}other_days${file.separator}rocketmq_client-%i.log.gz
-            </FileNamePattern>
-            <minIndex>1</minIndex>
-            <maxIndex>${rocketmq.log.file.maxIndex:-10}</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <maxFileSize>64MB</maxFileSize>
-        </triggeringPolicy>
-        <encoder class="org.apache.rocketmq.shade.ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <pattern>%d{yyy-MM-dd HH:mm:ss.SSS,GMT+8} %-5p [%pid] [%t] [%logger{12}#%M:%L] - %m%n</pattern>
-            <charset class="java.nio.charset.Charset">UTF-8</charset>
-        </encoder>
-    </appender>
-    <root level="${rocketmq.log.level:-info}">
-        <appender-ref ref="CustomConsoleAppender"/>
-        <appender-ref ref="DefaultAppender" additivity="false"/>
-    </root>
-    <!-- ref: https://github.com/grpc/grpc-java/issues/3033 -->
-    <!-- <logger name="io.grpc" level="warn"/> -->
-</configuration>
\ No newline at end of file
diff --git a/client/src/test/resources/log4j2.xml b/client/src/test/resources/log4j2.xml
new file mode 100644
index 000000000..52cf2a886
--- /dev/null
+++ b/client/src/test/resources/log4j2.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="ERROR">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/common/BUILD.bazel b/common/BUILD.bazel
index f85bda7ee..8370023d2 100644
--- a/common/BUILD.bazel
+++ b/common/BUILD.bazel
@@ -21,6 +21,7 @@ java_library(
     srcs = glob(["src/main/java/**/*.java"]),
     visibility = ["//visibility:public"],
     deps = [
+        "//logging",
         "@maven//:com_alibaba_fastjson",
         "@maven//:com_github_luben_zstd_jni",
         "@maven//:com_google_guava_guava",
@@ -37,7 +38,6 @@ java_library(
         "@maven//:io_opentelemetry_opentelemetry_sdk_metrics",
         "@maven//:org_apache_commons_commons_lang3",
         "@maven//:org_lz4_lz4_java",
-        "@maven//:io_github_aliyun_mq_rocketmq_slf4j_api",
     ],
 )
 
diff --git a/common/pom.xml b/common/pom.xml
index c62f86384..250b2584e 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -32,6 +32,10 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>rocketmq-logging</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
@@ -60,6 +64,11 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.7</version>
+        </dependency>
         <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
@@ -92,13 +101,5 @@
             <groupId>javax.annotation</groupId>
             <artifactId>javax.annotation-api</artifactId>
         </dependency>
-        <dependency>
-            <groupId>io.github.aliyun-mq</groupId>
-            <artifactId>rocketmq-slf4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.github.aliyun-mq</groupId>
-            <artifactId>rocketmq-logback-classic</artifactId>
-        </dependency>
     </dependencies>
 </project>
diff --git a/common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java b/common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java
index 8bce59d76..fa799be9c 100644
--- a/common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java
+++ b/common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java
@@ -17,6 +17,8 @@
 
 package org.apache.rocketmq.common;
 
+import org.apache.rocketmq.logging.InnerLoggerFactory;
+
 public abstract class AbstractBrokerRunnable implements Runnable {
     protected final BrokerIdentity brokerIdentity;
 
@@ -33,7 +35,7 @@ public abstract class AbstractBrokerRunnable implements Runnable {
     public void run() {
         if (brokerIdentity.isInBrokerContainer()) {
             // set threadlocal broker identity to forward logging to corresponding broker
-//            InnerLoggerFactory.BROKER_IDENTITY.set(brokerIdentity.getCanonicalName());
+            InnerLoggerFactory.BROKER_IDENTITY.set(brokerIdentity.getCanonicalName());
         }
         run2();
     }
diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java
index 1c9b301d8..714439785 100644
--- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java
+++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java
@@ -23,11 +23,11 @@ import org.apache.rocketmq.common.constant.PermName;
 import org.apache.rocketmq.common.message.MessageRequestMode;
 import org.apache.rocketmq.common.topic.TopicValidator;
 import org.apache.rocketmq.common.utils.NetworkUtil;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class BrokerConfig extends BrokerIdentity {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     private String brokerConfigPath = null;
 
diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerIdentity.java b/common/src/main/java/org/apache/rocketmq/common/BrokerIdentity.java
index be8cf7954..74f8126f2 100644
--- a/common/src/main/java/org/apache/rocketmq/common/BrokerIdentity.java
+++ b/common/src/main/java/org/apache/rocketmq/common/BrokerIdentity.java
@@ -24,13 +24,14 @@ import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.rocketmq.common.annotation.ImportantField;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InnerLoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class BrokerIdentity {
     private static final String DEFAULT_CLUSTER_NAME = "DefaultCluster";
 
-    protected static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    protected static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     private static String localHostName;
 
@@ -116,7 +117,7 @@ public class BrokerIdentity {
 
     public String getCanonicalName() {
         if (isBrokerContainer) {
-//            return InnerLoggerFactory.BROKER_CONTAINER_NAME;
+            return InnerLoggerFactory.BROKER_CONTAINER_NAME;
         }
         return this.getBrokerClusterName() + "_" + this.getBrokerName() + "_" + this.getBrokerId();
     }
diff --git a/common/src/main/java/org/apache/rocketmq/common/ConfigManager.java b/common/src/main/java/org/apache/rocketmq/common/ConfigManager.java
index 9fc3304e4..13d5b6be4 100644
--- a/common/src/main/java/org/apache/rocketmq/common/ConfigManager.java
+++ b/common/src/main/java/org/apache/rocketmq/common/ConfigManager.java
@@ -19,11 +19,11 @@ package org.apache.rocketmq.common;
 import java.io.IOException;
 import java.util.Map;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public abstract class ConfigManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     public abstract String encode();
 
diff --git a/common/src/main/java/org/apache/rocketmq/common/MixAll.java b/common/src/main/java/org/apache/rocketmq/common/MixAll.java
index 6abf3e7a8..f18df48c1 100644
--- a/common/src/main/java/org/apache/rocketmq/common/MixAll.java
+++ b/common/src/main/java/org/apache/rocketmq/common/MixAll.java
@@ -20,8 +20,8 @@ import org.apache.rocketmq.common.annotation.ImportantField;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.help.FAQUrl;
 import org.apache.rocketmq.common.utils.IOTinyUtils;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -103,7 +103,7 @@ public class MixAll {
     public static final String ZONE_NAME = "__ZONE_NAME"; 
     public static final String ZONE_MODE = "__ZONE_MODE";
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
     public static final String LOGICAL_QUEUE_MOCK_BROKER_PREFIX = "__syslo__";
     public static final String METADATA_SCOPE_GLOBAL = "__global__";
     public static final String LOGICAL_QUEUE_MOCK_BROKER_NAME_NOT_EXIST = "__syslo__none__";
@@ -252,11 +252,11 @@ public class MixAll {
         return null;
     }
 
-    public static void printObjectProperties(final Logger logger, final Object object) {
+    public static void printObjectProperties(final InternalLogger logger, final Object object) {
         printObjectProperties(logger, object, false);
     }
 
-    public static void printObjectProperties(final Logger logger, final Object object,
+    public static void printObjectProperties(final InternalLogger logger, final Object object,
         final boolean onlyImportantField) {
         Field[] fields = object.getClass().getDeclaredFields();
         for (Field field : fields) {
diff --git a/common/src/main/java/org/apache/rocketmq/common/ServiceThread.java b/common/src/main/java/org/apache/rocketmq/common/ServiceThread.java
index 6023e9e8a..a84bcc861 100644
--- a/common/src/main/java/org/apache/rocketmq/common/ServiceThread.java
+++ b/common/src/main/java/org/apache/rocketmq/common/ServiceThread.java
@@ -19,11 +19,11 @@ package org.apache.rocketmq.common;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public abstract class ServiceThread implements Runnable {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     private static final long JOIN_TIME = 90 * 1000;
 
diff --git a/common/src/main/java/org/apache/rocketmq/common/ThreadFactoryImpl.java b/common/src/main/java/org/apache/rocketmq/common/ThreadFactoryImpl.java
index a87c1713a..a21fb35c1 100644
--- a/common/src/main/java/org/apache/rocketmq/common/ThreadFactoryImpl.java
+++ b/common/src/main/java/org/apache/rocketmq/common/ThreadFactoryImpl.java
@@ -20,12 +20,12 @@ package org.apache.rocketmq.common;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class ThreadFactoryImpl implements ThreadFactory {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     private final AtomicLong threadIndex = new AtomicLong(0);
     private final String threadNamePrefix;
diff --git a/common/src/main/java/org/apache/rocketmq/common/UtilAll.java b/common/src/main/java/org/apache/rocketmq/common/UtilAll.java
index 8b7b26992..81f5df7ec 100644
--- a/common/src/main/java/org/apache/rocketmq/common/UtilAll.java
+++ b/common/src/main/java/org/apache/rocketmq/common/UtilAll.java
@@ -47,14 +47,14 @@ import org.apache.commons.lang3.JavaVersion;
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.commons.validator.routines.InetAddressValidator;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import sun.misc.Unsafe;
 import sun.nio.ch.DirectBuffer;
 
 public class UtilAll {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
-    private static final Logger STORE_LOG = LoggerFactory.getLogger(LoggerName.STORE_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger STORE_LOG = InternalLoggerFactory.getLogger(LoggerName.STORE_LOGGER_NAME);
 
 
     public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
diff --git a/common/src/main/java/org/apache/rocketmq/common/compression/Lz4Compressor.java b/common/src/main/java/org/apache/rocketmq/common/compression/Lz4Compressor.java
index 162487ad9..4e537d856 100644
--- a/common/src/main/java/org/apache/rocketmq/common/compression/Lz4Compressor.java
+++ b/common/src/main/java/org/apache/rocketmq/common/compression/Lz4Compressor.java
@@ -23,11 +23,11 @@ import java.io.IOException;
 import net.jpountz.lz4.LZ4FrameInputStream;
 import net.jpountz.lz4.LZ4FrameOutputStream;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class Lz4Compressor implements Compressor {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     @Override
     public byte[] compress(byte[] src, int level) throws IOException {
diff --git a/common/src/main/java/org/apache/rocketmq/common/compression/ZlibCompressor.java b/common/src/main/java/org/apache/rocketmq/common/compression/ZlibCompressor.java
index a457830c3..64e798f03 100644
--- a/common/src/main/java/org/apache/rocketmq/common/compression/ZlibCompressor.java
+++ b/common/src/main/java/org/apache/rocketmq/common/compression/ZlibCompressor.java
@@ -23,11 +23,11 @@ import java.io.IOException;
 import java.util.zip.DeflaterOutputStream;
 import java.util.zip.InflaterInputStream;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class ZlibCompressor implements Compressor {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     @Override
     public byte[] compress(byte[] src, int level) throws IOException {
diff --git a/common/src/main/java/org/apache/rocketmq/common/compression/ZstdCompressor.java b/common/src/main/java/org/apache/rocketmq/common/compression/ZstdCompressor.java
index 5e1351d20..3a220ce9f 100644
--- a/common/src/main/java/org/apache/rocketmq/common/compression/ZstdCompressor.java
+++ b/common/src/main/java/org/apache/rocketmq/common/compression/ZstdCompressor.java
@@ -23,11 +23,11 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class ZstdCompressor implements Compressor {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     @Override
     public byte[] compress(byte[] src, int level) throws IOException {
diff --git a/common/src/main/java/org/apache/rocketmq/common/namesrv/DefaultTopAddressing.java b/common/src/main/java/org/apache/rocketmq/common/namesrv/DefaultTopAddressing.java
index f45b2aad6..be7e78c7e 100644
--- a/common/src/main/java/org/apache/rocketmq/common/namesrv/DefaultTopAddressing.java
+++ b/common/src/main/java/org/apache/rocketmq/common/namesrv/DefaultTopAddressing.java
@@ -28,12 +28,12 @@ import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.help.FAQUrl;
 import org.apache.rocketmq.common.utils.HttpTinyClient;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class DefaultTopAddressing implements TopAddressing {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
 
     private String nsAddr;
     private String wsAddr;
diff --git a/common/src/main/java/org/apache/rocketmq/common/queue/ConcurrentTreeMap.java b/common/src/main/java/org/apache/rocketmq/common/queue/ConcurrentTreeMap.java
index 774a42818..b5999a706 100644
--- a/common/src/main/java/org/apache/rocketmq/common/queue/ConcurrentTreeMap.java
+++ b/common/src/main/java/org/apache/rocketmq/common/queue/ConcurrentTreeMap.java
@@ -22,14 +22,14 @@ import java.util.Map;
 import java.util.TreeMap;
 import java.util.concurrent.locks.ReentrantLock;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 /**
  * thread safe
  */
 public class ConcurrentTreeMap<K, V> {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final ReentrantLock lock;
     private TreeMap<K, V> tree;
     private RoundQueue<K> roundQueue;
diff --git a/common/src/main/java/org/apache/rocketmq/common/statistics/StatisticsItemPrinter.java b/common/src/main/java/org/apache/rocketmq/common/statistics/StatisticsItemPrinter.java
index 5901acc73..26c1df8ca 100644
--- a/common/src/main/java/org/apache/rocketmq/common/statistics/StatisticsItemPrinter.java
+++ b/common/src/main/java/org/apache/rocketmq/common/statistics/StatisticsItemPrinter.java
@@ -16,19 +16,19 @@
  */
 package org.apache.rocketmq.common.statistics;
 
-import org.apache.rocketmq.shade.org.slf4j.Logger;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class StatisticsItemPrinter {
-    private Logger log;
+    private InternalLogger log;
 
     private StatisticsItemFormatter formatter;
 
-    public StatisticsItemPrinter(StatisticsItemFormatter formatter, Logger log) {
+    public StatisticsItemPrinter(StatisticsItemFormatter formatter, InternalLogger log) {
         this.formatter = formatter;
         this.log = log;
     }
 
-    public void log(Logger log) {
+    public void log(InternalLogger log) {
         this.log = log;
     }
 
diff --git a/common/src/main/java/org/apache/rocketmq/common/stats/MomentStatsItem.java b/common/src/main/java/org/apache/rocketmq/common/stats/MomentStatsItem.java
index 1470754a3..bc987b191 100644
--- a/common/src/main/java/org/apache/rocketmq/common/stats/MomentStatsItem.java
+++ b/common/src/main/java/org/apache/rocketmq/common/stats/MomentStatsItem.java
@@ -21,7 +21,7 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.rocketmq.common.UtilAll;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class MomentStatsItem {
 
@@ -30,10 +30,10 @@ public class MomentStatsItem {
     private final String statsName;
     private final String statsKey;
     private final ScheduledExecutorService scheduledExecutorService;
-    private final Logger log;
+    private final InternalLogger log;
 
     public MomentStatsItem(String statsName, String statsKey,
-        ScheduledExecutorService scheduledExecutorService, Logger log) {
+        ScheduledExecutorService scheduledExecutorService, InternalLogger log) {
         this.statsName = statsName;
         this.statsKey = statsKey;
         this.scheduledExecutorService = scheduledExecutorService;
diff --git a/common/src/main/java/org/apache/rocketmq/common/stats/MomentStatsItemSet.java b/common/src/main/java/org/apache/rocketmq/common/stats/MomentStatsItemSet.java
index 96e1d5060..522130e36 100644
--- a/common/src/main/java/org/apache/rocketmq/common/stats/MomentStatsItemSet.java
+++ b/common/src/main/java/org/apache/rocketmq/common/stats/MomentStatsItemSet.java
@@ -24,16 +24,16 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.common.UtilAll;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class MomentStatsItemSet {
     private final ConcurrentMap<String/* key */, MomentStatsItem> statsItemTable =
         new ConcurrentHashMap<>(128);
     private final String statsName;
     private final ScheduledExecutorService scheduledExecutorService;
-    private final Logger log;
+    private final InternalLogger log;
 
-    public MomentStatsItemSet(String statsName, ScheduledExecutorService scheduledExecutorService, Logger log) {
+    public MomentStatsItemSet(String statsName, ScheduledExecutorService scheduledExecutorService, InternalLogger log) {
         this.statsName = statsName;
         this.scheduledExecutorService = scheduledExecutorService;
         this.log = log;
diff --git a/common/src/main/java/org/apache/rocketmq/common/stats/RTStatsItem.java b/common/src/main/java/org/apache/rocketmq/common/stats/RTStatsItem.java
index 5e86842b6..102148cdc 100644
--- a/common/src/main/java/org/apache/rocketmq/common/stats/RTStatsItem.java
+++ b/common/src/main/java/org/apache/rocketmq/common/stats/RTStatsItem.java
@@ -17,17 +17,17 @@
 
 package org.apache.rocketmq.common.stats;
 
+import org.apache.rocketmq.logging.InternalLogger;
+
 import java.util.concurrent.ScheduledExecutorService;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
 
 /**
  * A StatItem for response time, the only difference between from StatsItem is it has a different log output.
  */
 public class RTStatsItem extends StatsItem {
 
-    public RTStatsItem(String statsName, String statsKey, ScheduledExecutorService scheduledExecutorService,
-        Logger logger) {
-        super(statsName, statsKey, scheduledExecutorService, logger);
+    public RTStatsItem(String statsName, String statsKey, ScheduledExecutorService scheduledExecutorService, InternalLogger log) {
+        super(statsName, statsKey, scheduledExecutorService, log);
     }
 
     /**
diff --git a/common/src/main/java/org/apache/rocketmq/common/stats/StatsItem.java b/common/src/main/java/org/apache/rocketmq/common/stats/StatsItem.java
index 765c66df1..35e4da5b5 100644
--- a/common/src/main/java/org/apache/rocketmq/common/stats/StatsItem.java
+++ b/common/src/main/java/org/apache/rocketmq/common/stats/StatsItem.java
@@ -23,9 +23,10 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.LongAdder;
 
 import org.apache.rocketmq.common.UtilAll;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class StatsItem {
+
     private final LongAdder value = new LongAdder();
 
     private final LongAdder times = new LongAdder();
@@ -39,14 +40,14 @@ public class StatsItem {
     private final String statsName;
     private final String statsKey;
     private final ScheduledExecutorService scheduledExecutorService;
+    private final InternalLogger log;
 
-    private final Logger logger;
-
-    public StatsItem(String statsName, String statsKey, ScheduledExecutorService scheduledExecutorService, Logger logger) {
+    public StatsItem(String statsName, String statsKey, ScheduledExecutorService scheduledExecutorService,
+        InternalLogger log) {
         this.statsName = statsName;
         this.statsKey = statsKey;
         this.scheduledExecutorService = scheduledExecutorService;
-        this.logger = logger;
+        this.log = log;
     }
 
     private static StatsSnapshot computeStatsData(final LinkedList<CallSnapshot> csList) {
@@ -193,18 +194,18 @@ public class StatsItem {
 
     public void printAtMinutes() {
         StatsSnapshot ss = computeStatsData(this.csListMinute);
-        logger.info(String.format("[%s] [%s] Stats In One Minute, ", this.statsName, this.statsKey) + statPrintDetail(ss));
+        log.info(String.format("[%s] [%s] Stats In One Minute, ", this.statsName, this.statsKey) + statPrintDetail(ss));
     }
 
     public void printAtHour() {
         StatsSnapshot ss = computeStatsData(this.csListHour);
-        logger.info(String.format("[%s] [%s] Stats In One Hour, ", this.statsName, this.statsKey) + statPrintDetail(ss));
+        log.info(String.format("[%s] [%s] Stats In One Hour, ", this.statsName, this.statsKey) + statPrintDetail(ss));
 
     }
 
     public void printAtDay() {
         StatsSnapshot ss = computeStatsData(this.csListDay);
-        logger.info(String.format("[%s] [%s] Stats In One Day, ", this.statsName, this.statsKey) + statPrintDetail(ss));
+        log.info(String.format("[%s] [%s] Stats In One Day, ", this.statsName, this.statsKey) + statPrintDetail(ss));
     }
 
     protected String statPrintDetail(StatsSnapshot ss) {
diff --git a/common/src/main/java/org/apache/rocketmq/common/stats/StatsItemSet.java b/common/src/main/java/org/apache/rocketmq/common/stats/StatsItemSet.java
index b9bd8c910..eb853847a 100644
--- a/common/src/main/java/org/apache/rocketmq/common/stats/StatsItemSet.java
+++ b/common/src/main/java/org/apache/rocketmq/common/stats/StatsItemSet.java
@@ -24,7 +24,7 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.common.UtilAll;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
+import org.apache.rocketmq.logging.InternalLogger;
 
 public class StatsItemSet {
     private final ConcurrentMap<String/* key */, StatsItem> statsItemTable =
@@ -32,13 +32,12 @@ public class StatsItemSet {
 
     private final String statsName;
     private final ScheduledExecutorService scheduledExecutorService;
+    private final InternalLogger log;
 
-    private final Logger logger;
-
-    public StatsItemSet(String statsName, ScheduledExecutorService scheduledExecutorService, Logger logger) {
-        this.logger = logger;
+    public StatsItemSet(String statsName, ScheduledExecutorService scheduledExecutorService, InternalLogger log) {
         this.statsName = statsName;
         this.scheduledExecutorService = scheduledExecutorService;
+        this.log = log;
         this.init();
     }
 
@@ -214,9 +213,9 @@ public class StatsItemSet {
         StatsItem statsItem = this.statsItemTable.get(statsKey);
         if (null == statsItem) {
             if (rtItem) {
-                statsItem = new RTStatsItem(this.statsName, statsKey, this.scheduledExecutorService, logger);
+                statsItem = new RTStatsItem(this.statsName, statsKey, this.scheduledExecutorService, this.log);
             } else {
-                statsItem = new StatsItem(this.statsName, statsKey, this.scheduledExecutorService, logger);
+                statsItem = new StatsItem(this.statsName, statsKey, this.scheduledExecutorService, this.log);
             }
             StatsItem prev = this.statsItemTable.putIfAbsent(statsKey, statsItem);
 
diff --git a/common/src/main/java/org/apache/rocketmq/common/thread/ThreadPoolMonitor.java b/common/src/main/java/org/apache/rocketmq/common/thread/ThreadPoolMonitor.java
index 7b25c7e3b..e5bb6a394 100644
--- a/common/src/main/java/org/apache/rocketmq/common/thread/ThreadPoolMonitor.java
+++ b/common/src/main/java/org/apache/rocketmq/common/thread/ThreadPoolMonitor.java
@@ -28,12 +28,12 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import org.apache.rocketmq.common.UtilAll;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class ThreadPoolMonitor {
-    private static Logger jstackLogger = LoggerFactory.getLogger(ThreadPoolMonitor.class);
-    private static Logger waterMarkLogger = LoggerFactory.getLogger(ThreadPoolMonitor.class);
+    private static InternalLogger jstackLogger = InternalLoggerFactory.getLogger(ThreadPoolMonitor.class);
+    private static InternalLogger waterMarkLogger = InternalLoggerFactory.getLogger(ThreadPoolMonitor.class);
 
     private static final List<ThreadPoolWrapper> MONITOR_EXECUTOR = new CopyOnWriteArrayList<>();
     private static final ScheduledExecutorService MONITOR_SCHEDULED = Executors.newSingleThreadScheduledExecutor(
@@ -45,7 +45,7 @@ public class ThreadPoolMonitor {
     private static volatile long jstackPeriodTime = 60000;
     private static volatile long jstackTime = System.currentTimeMillis();
 
-    public static void config(Logger jstackLoggerConfig, Logger waterMarkLoggerConfig,
+    public static void config(InternalLogger jstackLoggerConfig, InternalLogger waterMarkLoggerConfig,
         boolean enablePrintJstack, long jstackPeriodTimeConfig, long threadPoolStatusPeriodTimeConfig) {
         jstackLogger = jstackLoggerConfig;
         waterMarkLogger = waterMarkLoggerConfig;
diff --git a/common/src/main/java/org/apache/rocketmq/common/utils/NetworkUtil.java b/common/src/main/java/org/apache/rocketmq/common/utils/NetworkUtil.java
index 36859b445..5d05bc12f 100644
--- a/common/src/main/java/org/apache/rocketmq/common/utils/NetworkUtil.java
+++ b/common/src/main/java/org/apache/rocketmq/common/utils/NetworkUtil.java
@@ -29,13 +29,13 @@ import java.nio.channels.spi.SelectorProvider;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public class NetworkUtil {
     public static final String OS_NAME = System.getProperty("os.name");
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
     private static boolean isLinuxPlatform = false;
     private static boolean isWindowsPlatform = false;
 
diff --git a/common/src/main/java/org/apache/rocketmq/common/utils/ServiceProvider.java b/common/src/main/java/org/apache/rocketmq/common/utils/ServiceProvider.java
index c465a44b3..00c8bffba 100644
--- a/common/src/main/java/org/apache/rocketmq/common/utils/ServiceProvider.java
+++ b/common/src/main/java/org/apache/rocketmq/common/utils/ServiceProvider.java
@@ -20,8 +20,8 @@ package org.apache.rocketmq.common.utils;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 import java.io.BufferedReader;
 import java.io.InputStream;
@@ -30,7 +30,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class ServiceProvider {
-    private static final Logger LOG = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    
+    private static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
+    
     /**
      * A reference to the classloader that loaded this class. It's more efficient to compute it once and cache it here.
      */
diff --git a/common/src/main/java/org/apache/rocketmq/common/utils/ThreadUtils.java b/common/src/main/java/org/apache/rocketmq/common/utils/ThreadUtils.java
index 7fb779636..61ca4a8f2 100644
--- a/common/src/main/java/org/apache/rocketmq/common/utils/ThreadUtils.java
+++ b/common/src/main/java/org/apache/rocketmq/common/utils/ThreadUtils.java
@@ -26,11 +26,11 @@ import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 public final class ThreadUtils {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.TOOLS_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.TOOLS_LOGGER_NAME);
 
     public static ExecutorService newThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
         TimeUnit unit, BlockingQueue<Runnable> workQueue, String processName, boolean isDaemon) {
diff --git a/container/BUILD.bazel b/container/BUILD.bazel
index 71611bda9..15fc0ae77 100644
--- a/container/BUILD.bazel
+++ b/container/BUILD.bazel
@@ -23,6 +23,7 @@ java_library(
     deps = [
         "//broker",
         "//common",
+        "//logging",
         "//remoting",
         "//client",
         "//srvutil", 
@@ -41,7 +42,6 @@ java_library(
         "@maven//:ch_qos_logback_logback_core",
         "@maven//:ch_qos_logback_logback_classic",
         "@maven//:commons_cli_commons_cli",
-        "@maven//:io_github_aliyun_mq_rocketmq_slf4j_api",
     ],
 )
 
@@ -53,6 +53,7 @@ java_library(
         ":container",
         "//broker",
         "//common",
+        "//logging",
         "//remoting",
         "//client",
         "//srvutil", 
diff --git a/container/pom.xml b/container/pom.xml
index dc7ab5dfb..c0ea9d33d 100644
--- a/container/pom.xml
+++ b/container/pom.xml
@@ -34,13 +34,6 @@
         <dependency>
             <groupId>org.apache.rocketmq</groupId>
             <artifactId>rocketmq-broker</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <scope>test</scope>
         </dependency>
     </dependencies>
 </project>
diff --git a/container/src/main/java/org/apache/rocketmq/container/BrokerContainer.java b/container/src/main/java/org/apache/rocketmq/container/BrokerContainer.java
index e5c920962..20f549baf 100644
--- a/container/src/main/java/org/apache/rocketmq/container/BrokerContainer.java
+++ b/container/src/main/java/org/apache/rocketmq/container/BrokerContainer.java
@@ -39,8 +39,8 @@ import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.utils.ThreadUtils;
 import org.apache.rocketmq.container.logback.BrokerLogbackConfigurator;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.Configuration;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.RemotingServer;
@@ -51,7 +51,7 @@ import org.apache.rocketmq.store.config.BrokerRole;
 import org.apache.rocketmq.store.config.MessageStoreConfig;
 
 public class BrokerContainer implements IBrokerContainer {
-    private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private final ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(1,
         new BasicThreadFactory.Builder()
diff --git a/container/src/main/java/org/apache/rocketmq/container/BrokerContainerProcessor.java b/container/src/main/java/org/apache/rocketmq/container/BrokerContainerProcessor.java
index ea28bd783..671ea5ff9 100644
--- a/container/src/main/java/org/apache/rocketmq/container/BrokerContainerProcessor.java
+++ b/container/src/main/java/org/apache/rocketmq/container/BrokerContainerProcessor.java
@@ -27,8 +27,8 @@ import org.apache.rocketmq.common.BrokerConfig;
 import org.apache.rocketmq.common.BrokerIdentity;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingCommandException;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
@@ -41,7 +41,7 @@ import org.apache.rocketmq.remoting.protocol.header.RemoveBrokerRequestHeader;
 import org.apache.rocketmq.store.config.MessageStoreConfig;
 
 public class BrokerContainerProcessor implements NettyRequestProcessor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
     private final BrokerContainer brokerContainer;
     private List<BrokerBootHook> brokerBootHookList;
 
diff --git a/container/src/main/java/org/apache/rocketmq/container/BrokerContainerStartup.java b/container/src/main/java/org/apache/rocketmq/container/BrokerContainerStartup.java
index f60c99b0b..d58f8ae57 100644
--- a/container/src/main/java/org/apache/rocketmq/container/BrokerContainerStartup.java
+++ b/container/src/main/java/org/apache/rocketmq/container/BrokerContainerStartup.java
@@ -16,6 +16,8 @@
  */
 package org.apache.rocketmq.container;
 
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.joran.JoranConfigurator;
 import java.io.BufferedInputStream;
 import java.io.FileInputStream;
 import java.io.InputStream;
@@ -34,14 +36,16 @@ import org.apache.rocketmq.common.MQVersion;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.common.utils.NetworkUtil;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.netty.NettyClientConfig;
 import org.apache.rocketmq.remoting.netty.NettyServerConfig;
 import org.apache.rocketmq.remoting.netty.NettySystemConfig;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 import org.apache.rocketmq.srvutil.ServerUtil;
 import org.apache.rocketmq.store.config.MessageStoreConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class BrokerContainerStartup {
     private static final String BROKER_CONTAINER_CONFIG_OPTION = "c";
@@ -51,9 +55,10 @@ public class BrokerContainerStartup {
     public static Properties properties = null;
     public static CommandLine commandLine = null;
     public static String configFile = null;
-    public static Logger log;
+    public static InternalLogger log;
     public static final SystemConfigFileHelper CONFIG_FILE_HELPER = new SystemConfigFileHelper();
     public static String rocketmqHome = null;
+    public static final JoranConfigurator CONFIGURATOR = new JoranConfigurator();
 
     public static void main(String[] args) {
         final BrokerContainer brokerContainer = startBrokerContainer(createBrokerContainer(args));
@@ -168,7 +173,7 @@ public class BrokerContainerStartup {
 
         brokerConfig.setBrokerConfigPath(filePath);
 
-        log = LoggerFactory.getLogger(brokerConfig.getLoggerIdentifier() + LoggerName.BROKER_LOGGER_NAME);
+        log = InternalLoggerFactory.getLogger(brokerConfig.getLoggerIdentifier() + LoggerName.BROKER_LOGGER_NAME);
         MixAll.printObjectProperties(log, brokerConfig);
         MixAll.printObjectProperties(log, messageStoreConfig);
 
@@ -306,21 +311,29 @@ public class BrokerContainerStartup {
                 }
             }
 
+            LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
+            CONFIGURATOR.setContext(lc);
+            lc.reset();
+            //https://logback.qos.ch/manual/configuration.html
+            lc.setPackagingDataEnabled(false);
+
+            CONFIGURATOR.doConfigure(rocketmqHome + "/conf/logback_broker.xml");
+
             if (commandLine.hasOption(PRINT_PROPERTIES_OPTION)) {
-                Logger console = LoggerFactory.getLogger(LoggerName.BROKER_CONSOLE_NAME);
+                InternalLogger console = InternalLoggerFactory.getLogger(LoggerName.BROKER_CONSOLE_NAME);
                 MixAll.printObjectProperties(console, containerConfig);
                 MixAll.printObjectProperties(console, nettyServerConfig);
                 MixAll.printObjectProperties(console, nettyClientConfig);
                 System.exit(0);
             } else if (commandLine.hasOption(PRINT_IMPORTANT_PROPERTIES_OPTION)) {
-                Logger console = LoggerFactory.getLogger(LoggerName.BROKER_CONSOLE_NAME);
+                InternalLogger console = InternalLoggerFactory.getLogger(LoggerName.BROKER_CONSOLE_NAME);
                 MixAll.printObjectProperties(console, containerConfig, true);
                 MixAll.printObjectProperties(console, nettyServerConfig, true);
                 MixAll.printObjectProperties(console, nettyClientConfig, true);
                 System.exit(0);
             }
 
-            log = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+            log = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
             MixAll.printObjectProperties(log, containerConfig);
             MixAll.printObjectProperties(log, nettyServerConfig);
             MixAll.printObjectProperties(log, nettyClientConfig);
diff --git a/container/src/main/java/org/apache/rocketmq/container/logback/BrokerLogbackConfigurator.java b/container/src/main/java/org/apache/rocketmq/container/logback/BrokerLogbackConfigurator.java
index ba7467721..45cbe9367 100644
--- a/container/src/main/java/org/apache/rocketmq/container/logback/BrokerLogbackConfigurator.java
+++ b/container/src/main/java/org/apache/rocketmq/container/logback/BrokerLogbackConfigurator.java
@@ -17,16 +17,33 @@
 
 package org.apache.rocketmq.container.logback;
 
+import ch.qos.logback.classic.AsyncAppender;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.encoder.Encoder;
+import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+import ch.qos.logback.core.rolling.RollingPolicy;
+import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP;
+import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
+import ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicy;
+import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
+
+import java.lang.reflect.Field;
 import java.util.HashSet;
 import java.util.Set;
 
+import ch.qos.logback.core.util.FileSize;
 import org.apache.rocketmq.common.BrokerIdentity;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
+import org.slf4j.LoggerFactory;
 
 public class BrokerLogbackConfigurator {
-    private static final Logger LOG = LoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
+    private static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.BROKER_LOGGER_NAME);
 
     private static final Set<String> CONFIGURED_BROKER_LIST = new HashSet<>();
 
@@ -37,5 +54,134 @@ public class BrokerLogbackConfigurator {
     public static final String SUFFIX_INNER_APPENDER = "_inner";
 
     public static void doConfigure(BrokerIdentity brokerIdentity) {
+        if (!CONFIGURED_BROKER_LIST.contains(brokerIdentity.getCanonicalName())) {
+            try {
+                LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
+                for (ch.qos.logback.classic.Logger tempLogger : lc.getLoggerList()) {
+                    String loggerName = tempLogger.getName();
+                    if (loggerName.startsWith(ROCKETMQ_PREFIX)
+                        && !loggerName.endsWith(SUFFIX_CONSOLE)
+                        && !loggerName.equals(LoggerName.ACCOUNT_LOGGER_NAME)
+                        && !loggerName.equals(LoggerName.COMMERCIAL_LOGGER_NAME)
+                        && !loggerName.equals(LoggerName.CONSUMER_STATS_LOGGER_NAME)) {
+                        ch.qos.logback.classic.Logger logger = lc.getLogger(brokerIdentity.getLoggerIdentifier() + loggerName);
+                        logger.setAdditive(tempLogger.isAdditive());
+                        logger.setLevel(tempLogger.getLevel());
+                        String appenderName = loggerName + SUFFIX_APPENDER;
+                        Appender<ILoggingEvent> tempAppender = tempLogger.getAppender(appenderName);
+                        if (tempAppender instanceof AsyncAppender) {
+                            AsyncAppender tempAsyncAppender = (AsyncAppender) tempAppender;
+                            AsyncAppender asyncAppender = new AsyncAppender();
+                            asyncAppender.setName(brokerIdentity.getLoggerIdentifier() + appenderName);
+                            asyncAppender.setContext(tempAsyncAppender.getContext());
+
+                            String innerAppenderName = appenderName + SUFFIX_INNER_APPENDER;
+                            Appender<ILoggingEvent> tempInnerAppender = tempAsyncAppender.getAppender(innerAppenderName);
+                            if (!(tempInnerAppender instanceof RollingFileAppender)) {
+                                continue;
+                            }
+                            asyncAppender.addAppender(configureRollingFileAppender((RollingFileAppender<ILoggingEvent>) tempInnerAppender,
+                                brokerIdentity, innerAppenderName));
+                            asyncAppender.start();
+                            logger.addAppender(asyncAppender);
+                        } else if (tempAppender instanceof RollingFileAppender) {
+                            logger.addAppender(configureRollingFileAppender((RollingFileAppender<ILoggingEvent>) tempAppender,
+                                brokerIdentity, appenderName));
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                LOG.error("Configure logback for broker {} failed, will use default broker log config instead. {}", brokerIdentity.getCanonicalName(), e);
+                return;
+            }
+
+            CONFIGURED_BROKER_LIST.add(brokerIdentity.getCanonicalName());
+        }
+    }
+
+    private static RollingFileAppender<ILoggingEvent> configureRollingFileAppender(
+        RollingFileAppender<ILoggingEvent> tempRollingFileAppender, BrokerIdentity brokerIdentity, String appenderName)
+        throws NoSuchFieldException, IllegalAccessException {
+        RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>();
+
+        // configure appender name
+        rollingFileAppender.setName(brokerIdentity.getLoggerIdentifier() + appenderName);
+
+        // configure file name
+        rollingFileAppender.setFile(tempRollingFileAppender.getFile().replaceAll(ROCKETMQ_LOGS, brokerIdentity.getCanonicalName() + "_" + ROCKETMQ_LOGS));
+
+        // configure append
+        rollingFileAppender.setAppend(true);
+
+        // configure prudent
+        rollingFileAppender.setPrudent(tempRollingFileAppender.isPrudent());
+
+        // configure rollingPolicy
+        RollingPolicy originalRollingPolicy = tempRollingFileAppender.getRollingPolicy();
+        if (originalRollingPolicy instanceof TimeBasedRollingPolicy) {
+            TimeBasedRollingPolicy<ILoggingEvent> tempRollingPolicy = (TimeBasedRollingPolicy<ILoggingEvent>) originalRollingPolicy;
+            TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
+            rollingPolicy.setContext(tempRollingPolicy.getContext());
+            rollingPolicy.setFileNamePattern(tempRollingPolicy.getFileNamePattern());
+            SizeAndTimeBasedFNATP<ILoggingEvent> sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<>();
+            sizeAndTimeBasedFNATP.setContext(tempRollingPolicy.getContext());
+            TimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent> timeBasedFileNamingAndTriggeringPolicy =
+                tempRollingPolicy.getTimeBasedFileNamingAndTriggeringPolicy();
+            if (timeBasedFileNamingAndTriggeringPolicy instanceof SizeAndTimeBasedFNATP) {
+                SizeAndTimeBasedFNATP<ILoggingEvent> originalSizeAndTimeBasedFNATP =
+                    (SizeAndTimeBasedFNATP<ILoggingEvent>) timeBasedFileNamingAndTriggeringPolicy;
+                Field field = originalSizeAndTimeBasedFNATP.getClass().getDeclaredField("maxFileSize");
+                field.setAccessible(true);
+                sizeAndTimeBasedFNATP.setMaxFileSize((FileSize) field.get(originalSizeAndTimeBasedFNATP));
+                sizeAndTimeBasedFNATP.setTimeBasedRollingPolicy(rollingPolicy);
+            }
+            rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(sizeAndTimeBasedFNATP);
+            rollingPolicy.setMaxHistory(tempRollingPolicy.getMaxHistory());
+            rollingPolicy.setParent(rollingFileAppender);
+            rollingPolicy.start();
+            rollingFileAppender.setRollingPolicy(rollingPolicy);
+        } else if (originalRollingPolicy instanceof FixedWindowRollingPolicy) {
+            FixedWindowRollingPolicy tempRollingPolicy = (FixedWindowRollingPolicy) originalRollingPolicy;
+            FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy();
+            rollingPolicy.setContext(tempRollingPolicy.getContext());
+            rollingPolicy.setFileNamePattern(tempRollingPolicy.getFileNamePattern().replaceAll(ROCKETMQ_LOGS, brokerIdentity.getCanonicalName() + "_" + ROCKETMQ_LOGS));
+            rollingPolicy.setMaxIndex(tempRollingPolicy.getMaxIndex());
+            rollingPolicy.setMinIndex(tempRollingPolicy.getMinIndex());
+            rollingPolicy.setParent(rollingFileAppender);
+            rollingPolicy.start();
+            rollingFileAppender.setRollingPolicy(rollingPolicy);
+        }
+
+        // configure triggerPolicy
+        if (tempRollingFileAppender.getTriggeringPolicy() instanceof SizeBasedTriggeringPolicy) {
+            SizeBasedTriggeringPolicy<ILoggingEvent> tempTriggerPolicy = (SizeBasedTriggeringPolicy<ILoggingEvent>) tempRollingFileAppender.getTriggeringPolicy();
+            SizeBasedTriggeringPolicy<ILoggingEvent> triggerPolicy = new SizeBasedTriggeringPolicy<>();
+            triggerPolicy.setContext(tempTriggerPolicy.getContext());
+            Field field = triggerPolicy.getClass().getDeclaredField("maxFileSize");
+            field.setAccessible(true);
+            triggerPolicy.setMaxFileSize((FileSize) field.get(triggerPolicy));
+            triggerPolicy.start();
+            rollingFileAppender.setTriggeringPolicy(triggerPolicy);
+        }
+
+        // configure encoder
+        Encoder<ILoggingEvent> tempEncoder = tempRollingFileAppender.getEncoder();
+        if (tempEncoder instanceof PatternLayoutEncoder) {
+            PatternLayoutEncoder tempPatternLayoutEncoder = (PatternLayoutEncoder) tempEncoder;
+            PatternLayoutEncoder patternLayoutEncoder = new PatternLayoutEncoder();
+            patternLayoutEncoder.setContext(tempPatternLayoutEncoder.getContext());
+            patternLayoutEncoder.setPattern(tempPatternLayoutEncoder.getPattern());
+            patternLayoutEncoder.setCharset(tempPatternLayoutEncoder.getCharset());
+            patternLayoutEncoder.start();
+
+            rollingFileAppender.setEncoder(patternLayoutEncoder);
+        }
+
+        // configure context
+        rollingFileAppender.setContext(tempRollingFileAppender.getContext());
+
+        rollingFileAppender.start();
+
+        return rollingFileAppender;
     }
 }
diff --git a/container/src/test/resources/rmq.logback-test.xml b/container/src/test/resources/rmq.logback-test.xml
deleted file mode 100644
index c3ec0d1e8..000000000
--- a/container/src/test/resources/rmq.logback-test.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
-  -->
-<configuration>
-
-    <appender name="CONSOLE" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
-        <layout class="org.apache.rocketmq.shade.ch.qos.logback.classic.PatternLayout">
-            <Pattern>
-                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
-            </Pattern>
-        </layout>
-    </appender>
-
-    <logger name="org.apache.rocketmq" level="error" additivity="false">
-        <appender-ref ref="CONSOLE"/>
-    </logger>
-
-    <root level="error">
-        <appender-ref ref="CONSOLE"/>
-    </root>
-
-</configuration>
\ No newline at end of file
diff --git a/controller/BUILD.bazel b/controller/BUILD.bazel
index f14480c5e..ef9b9c5eb 100644
--- a/controller/BUILD.bazel
+++ b/controller/BUILD.bazel
@@ -22,6 +22,7 @@ java_library(
     visibility = ["//visibility:public"],
     deps = [
         "//common",
+        "//logging",
         "//remoting",
         "//client",
         "//srvutil", 
@@ -39,7 +40,6 @@ java_library(
         "@maven//:ch_qos_logback_logback_core",
         "@maven//:ch_qos_logback_logback_classic",
         "@maven//:commons_cli_commons_cli",
-        "@maven//:io_github_aliyun_mq_rocketmq_slf4j_api",
     ],
 )
 
@@ -50,6 +50,7 @@ java_library(
     deps = [
         ":controller",
         "//common",
+        "//logging",
         "//remoting",
         "//client",
         "//srvutil", 
diff --git a/controller/pom.xml b/controller/pom.xml
index db5fd1e55..1f7698add 100644
--- a/controller/pom.xml
+++ b/controller/pom.xml
@@ -44,18 +44,19 @@
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-client</artifactId>
-            <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-srvutil</artifactId>
-            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
-            <scope>test</scope>
         </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/controller/src/main/java/org/apache/rocketmq/controller/BrokerHousekeepingService.java b/controller/src/main/java/org/apache/rocketmq/controller/BrokerHousekeepingService.java
index a18b12c86..50c96cfd3 100644
--- a/controller/src/main/java/org/apache/rocketmq/controller/BrokerHousekeepingService.java
+++ b/controller/src/main/java/org/apache/rocketmq/controller/BrokerHousekeepingService.java
@@ -18,12 +18,12 @@ package org.apache.rocketmq.controller;
 
 import io.netty.channel.Channel;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.ChannelEventListener;
 
 public class BrokerHousekeepingService implements ChannelEventListener {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
     private final ControllerManager controllerManager;
 
     public BrokerHousekeepingService(ControllerManager controllerManager) {
diff --git a/controller/src/main/java/org/apache/rocketmq/controller/ControllerManager.java b/controller/src/main/java/org/apache/rocketmq/controller/ControllerManager.java
index cd8d0f2ba..1add67a38 100644
--- a/controller/src/main/java/org/apache/rocketmq/controller/ControllerManager.java
+++ b/controller/src/main/java/org/apache/rocketmq/controller/ControllerManager.java
@@ -34,8 +34,8 @@ import org.apache.rocketmq.controller.elect.impl.DefaultElectPolicy;
 import org.apache.rocketmq.controller.impl.DLedgerController;
 import org.apache.rocketmq.controller.impl.DefaultBrokerHeartbeatManager;
 import org.apache.rocketmq.controller.processor.ControllerRequestProcessor;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.Configuration;
 import org.apache.rocketmq.remoting.RemotingClient;
 import org.apache.rocketmq.remoting.RemotingServer;
@@ -50,7 +50,7 @@ import org.apache.rocketmq.remoting.protocol.header.namesrv.controller.ElectMast
 import org.apache.rocketmq.remoting.protocol.header.namesrv.controller.ElectMasterResponseHeader;
 
 public class ControllerManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
 
     private final ControllerConfig controllerConfig;
     private final NettyServerConfig nettyServerConfig;
diff --git a/controller/src/main/java/org/apache/rocketmq/controller/ControllerStartup.java b/controller/src/main/java/org/apache/rocketmq/controller/ControllerStartup.java
index 7d24c0b82..e27ee68ab 100644
--- a/controller/src/main/java/org/apache/rocketmq/controller/ControllerStartup.java
+++ b/controller/src/main/java/org/apache/rocketmq/controller/ControllerStartup.java
@@ -16,6 +16,9 @@
  */
 package org.apache.rocketmq.controller;
 
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.joran.JoranConfigurator;
+import ch.qos.logback.core.joran.spi.JoranException;
 import java.io.BufferedInputStream;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -30,17 +33,18 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.common.ControllerConfig;
 import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.netty.NettyClientConfig;
 import org.apache.rocketmq.remoting.netty.NettyServerConfig;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 import org.apache.rocketmq.srvutil.ServerUtil;
 import org.apache.rocketmq.srvutil.ShutdownHookThread;
+import org.slf4j.LoggerFactory;
 
 public class ControllerStartup {
 
-    private static Logger log;
+    private static InternalLogger log;
     private static Properties properties = null;
     private static CommandLine commandLine = null;
 
@@ -65,7 +69,7 @@ public class ControllerStartup {
         return null;
     }
 
-    public static ControllerManager createControllerManager(String[] args) throws IOException {
+    public static ControllerManager createControllerManager(String[] args) throws IOException, JoranException {
         Options options = ServerUtil.buildCommandlineOptions(new Options());
         commandLine = ServerUtil.parseCmdLine("mqcontroller", args, buildCommandlineOptions(options), new DefaultParser());
         if (null == commandLine) {
@@ -102,12 +106,18 @@ public class ControllerStartup {
 
         MixAll.properties2Object(ServerUtil.commandLine2Properties(commandLine), controllerConfig);
 
+        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
+        JoranConfigurator configurator = new JoranConfigurator();
+        configurator.setContext(lc);
+        lc.reset();
+
         if (StringUtils.isEmpty(controllerConfig.getRocketmqHome())) {
             System.out.printf("Please set the %s or %s variable in your environment!%n", MixAll.ROCKETMQ_HOME_ENV, MixAll.ROCKETMQ_HOME_PROPERTY);
             System.exit(-1);
         }
+        configurator.doConfigure(controllerConfig.getRocketmqHome() + "/conf/logback_controller.xml");
 
-        log = LoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
+        log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
 
         MixAll.printObjectProperties(log, controllerConfig);
         MixAll.printObjectProperties(log, nettyServerConfig);
diff --git a/controller/src/main/java/org/apache/rocketmq/controller/impl/DLedgerController.java b/controller/src/main/java/org/apache/rocketmq/controller/impl/DLedgerController.java
index a45e18e18..ba8a156fb 100644
--- a/controller/src/main/java/org/apache/rocketmq/controller/impl/DLedgerController.java
+++ b/controller/src/main/java/org/apache/rocketmq/controller/impl/DLedgerController.java
@@ -47,8 +47,8 @@ import org.apache.rocketmq.controller.impl.event.ControllerResult;
 import org.apache.rocketmq.controller.impl.event.EventMessage;
 import org.apache.rocketmq.controller.impl.event.EventSerializer;
 import org.apache.rocketmq.controller.impl.manager.ReplicasInfoManager;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.ChannelEventListener;
 import org.apache.rocketmq.remoting.CommandCustomHeader;
 import org.apache.rocketmq.remoting.RemotingServer;
@@ -69,7 +69,7 @@ import org.apache.rocketmq.remoting.protocol.header.namesrv.controller.RegisterB
  */
 public class DLedgerController implements Controller {
 
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
     private final DLedgerServer dLedgerServer;
     private final ControllerConfig controllerConfig;
     private final DLedgerConfig dLedgerConfig;
diff --git a/controller/src/main/java/org/apache/rocketmq/controller/impl/DLedgerControllerStateMachine.java b/controller/src/main/java/org/apache/rocketmq/controller/impl/DLedgerControllerStateMachine.java
index de4503d1b..ef3124166 100644
--- a/controller/src/main/java/org/apache/rocketmq/controller/impl/DLedgerControllerStateMachine.java
+++ b/controller/src/main/java/org/apache/rocketmq/controller/impl/DLedgerControllerStateMachine.java
@@ -26,14 +26,14 @@ import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.controller.impl.event.EventMessage;
 import org.apache.rocketmq.controller.impl.event.EventSerializer;
 import org.apache.rocketmq.controller.impl.manager.ReplicasInfoManager;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 
 /**
  * The state machine implementation of the dledger controller
  */
 public class DLedgerControllerStateMachine implements StateMachine {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
     private final ReplicasInfoManager replicasInfoManager;
     private final EventSerializer eventSerializer;
     private final String dLedgerId;
diff --git a/controller/src/main/java/org/apache/rocketmq/controller/impl/DefaultBrokerHeartbeatManager.java b/controller/src/main/java/org/apache/rocketmq/controller/impl/DefaultBrokerHeartbeatManager.java
index 6e32a1259..0e04ae48d 100644
--- a/controller/src/main/java/org/apache/rocketmq/controller/impl/DefaultBrokerHeartbeatManager.java
+++ b/controller/src/main/java/org/apache/rocketmq/controller/impl/DefaultBrokerHeartbeatManager.java
@@ -33,12 +33,12 @@ import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.controller.BrokerHeartbeatManager;
 import org.apache.rocketmq.controller.BrokerLiveInfo;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 
 public class DefaultBrokerHeartbeatManager implements BrokerHeartbeatManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
     private static final long DEFAULT_BROKER_CHANNEL_EXPIRED_TIME = 1000 * 10;
     private final ScheduledExecutorService scheduledService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl("DefaultBrokerHeartbeatManager_scheduledService_"));
     private final ExecutorService executor = Executors.newFixedThreadPool(2, new ThreadFactoryImpl("DefaultBrokerHeartbeatManager_executorService_"));
diff --git a/controller/src/main/java/org/apache/rocketmq/controller/impl/manager/ReplicasInfoManager.java b/controller/src/main/java/org/apache/rocketmq/controller/impl/manager/ReplicasInfoManager.java
index 99808d281..b3c76735e 100644
--- a/controller/src/main/java/org/apache/rocketmq/controller/impl/manager/ReplicasInfoManager.java
+++ b/controller/src/main/java/org/apache/rocketmq/controller/impl/manager/ReplicasInfoManager.java
@@ -37,8 +37,8 @@ import org.apache.rocketmq.controller.impl.event.ControllerResult;
 import org.apache.rocketmq.controller.impl.event.ElectMasterEvent;
 import org.apache.rocketmq.controller.impl.event.EventMessage;
 import org.apache.rocketmq.controller.impl.event.EventType;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.protocol.ResponseCode;
 import org.apache.rocketmq.remoting.protocol.body.BrokerMemberGroup;
 import org.apache.rocketmq.remoting.protocol.body.InSyncStateData;
@@ -59,7 +59,7 @@ import org.apache.rocketmq.remoting.protocol.header.namesrv.controller.RegisterB
  * be called sequentially
  */
 public class ReplicasInfoManager {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
     private final ControllerConfig controllerConfig;
     private final Map<String/* brokerName */, BrokerInfo> replicaInfoTable;
     private final Map<String/* brokerName */, SyncStateInfo> syncStateSetInfoTable;
diff --git a/controller/src/main/java/org/apache/rocketmq/controller/processor/ControllerRequestProcessor.java b/controller/src/main/java/org/apache/rocketmq/controller/processor/ControllerRequestProcessor.java
index b7ecfdf1d..42094a6bd 100644
--- a/controller/src/main/java/org/apache/rocketmq/controller/processor/ControllerRequestProcessor.java
+++ b/controller/src/main/java/org/apache/rocketmq/controller/processor/ControllerRequestProcessor.java
@@ -27,8 +27,8 @@ import org.apache.rocketmq.common.MixAll;
 import org.apache.rocketmq.common.constant.LoggerName;
 import org.apache.rocketmq.controller.BrokerHeartbeatManager;
 import org.apache.rocketmq.controller.ControllerManager;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
+import org.apache.rocketmq.logging.InternalLogger;
+import org.apache.rocketmq.logging.InternalLoggerFactory;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.netty.NettyRequestProcessor;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
@@ -59,7 +59,7 @@ import static org.apache.rocketmq.remoting.protocol.RequestCode.UPDATE_CONTROLLE
  * Processor for controller request
  */
 public class ControllerRequestProcessor implements NettyRequestProcessor {
-    private static final Logger log = LoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
+    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.CONTROLLER_LOGGER_NAME);
     private static final int WAIT_TIMEOUT_OUT = 5;
     private final ControllerManager controllerManager;
     private final BrokerHeartbeatManager heartbeatManager;
diff --git a/controller/src/test/resources/logback-test.xml b/controller/src/test/resources/logback-test.xml
new file mode 100644
index 000000000..e7ebef1af
--- /dev/null
+++ b/controller/src/test/resources/logback-test.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<configuration>
+
+    <appender name="DefaultAppender" class="ch.qos.logback.core.ConsoleAppender">
+        <append>true</append>
+        <encoder>
+            <pattern>%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n</pattern>
+            <charset class="java.nio.charset.Charset">UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <root>
+        <level value="OFF"/>
+        <appender-ref ref="DefaultAppender"/>
+    </root>
+</configuration>
diff --git a/controller/src/test/resources/rmq.logback-test.xml b/controller/src/test/resources/rmq.logback-test.xml
deleted file mode 100644
index c3ec0d1e8..000000000
--- a/controller/src/test/resources/rmq.logback-test.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
-  -->
-<configuration>
-
-    <appender name="CONSOLE" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
-        <layout class="org.apache.rocketmq.shade.ch.qos.logback.classic.PatternLayout">
-            <Pattern>
-                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
-            </Pattern>
-        </layout>
-    </appender>
-
-    <logger name="org.apache.rocketmq" level="error" additivity="false">
-        <appender-ref ref="CONSOLE"/>
-    </logger>
-
-    <root level="error">
-        <appender-ref ref="CONSOLE"/>
-    </root>
-
-</configuration>
\ No newline at end of file
diff --git a/broker/src/main/resources/rmq.broker.logback.xml b/distribution/conf/logback_broker.xml
similarity index 69%
rename from broker/src/main/resources/rmq.broker.logback.xml
rename to distribution/conf/logback_broker.xml
index 72a2c8732..3daa0b2f2 100644
--- a/broker/src/main/resources/rmq.broker.logback.xml
+++ b/distribution/conf/logback_broker.xml
@@ -18,15 +18,15 @@
 
 <configuration scan="true" scanPeriod="30 seconds">
     <appender name="DefaultAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/broker_default.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/broker_default.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -36,15 +36,15 @@
     </appender>
 
     <appender name="RocketmqBrokerAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/broker.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/broker.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>20</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>128MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -52,20 +52,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqBrokerAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqBrokerAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqBrokerAppender_inner"/>
     </appender>
 
     <appender name="RocketmqProtectionAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/protection.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/protection.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -73,20 +73,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqProtectionAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqProtectionAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqProtectionAppender_inner"/>
     </appender>
 
     <appender name="RocketmqWaterMarkAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/watermark.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/watermark.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -94,20 +94,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqWaterMarkAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqWaterMarkAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqWaterMarkAppender_inner"/>
     </appender>
 
     <appender name="RocketmqStoreAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/store.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/store.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>128MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -115,20 +115,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqStoreAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqStoreAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqStoreAppender_inner"/>
     </appender>
 
     <appender name="RocketmqTrafficAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/broker_traffic.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/broker_traffic.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -136,20 +136,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqTrafficAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqTrafficAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqTrafficAppender_inner"/>
     </appender>
 
     <appender name="RocketmqRemotingAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/remoting.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/remoting.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -157,20 +157,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqRemotingAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqRemotingAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqRemotingAppender_inner"/>
     </appender>
 
     <appender name="RocketmqStoreErrorAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/storeerror.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/storeerror.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -178,21 +178,21 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqStoreErrorAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqStoreErrorAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqStoreErrorAppender_inner"/>
     </appender>
 
 
     <appender name="RocketmqTransactionAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/transaction.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/transaction.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -200,20 +200,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqTransactionAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqTransactionAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqTransactionAppender_inner"/>
     </appender>
 
     <appender name="RocketmqRebalanceLockAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/lock.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/lock.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -221,20 +221,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqRebalanceLockAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqRebalanceLockAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqRebalanceLockAppender_inner"/>
     </appender>
 
     <appender name="RocketmqFilterAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/filter.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/filter.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -242,20 +242,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqFilterAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqFilterAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqFilterAppender_inner"/>
     </appender>
 
     <appender name="RocketmqStatsAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/stats.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/stats.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -265,31 +265,31 @@
     </appender>
 
     <appender name="RocketmqCommercialAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/commercial.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/commercial.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>500MB</maxFileSize>
         </triggeringPolicy>
     </appender>
 
     <appender name="RocketmqPopAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/pop.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/pop.%i.log
             </fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>20</maxIndex>
         </rollingPolicy>
         <triggeringPolicy
-            class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>128MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -298,11 +298,11 @@
         </encoder>
     </appender>
 
-    <appender name="RocketmqPopAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqPopAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqPopAppender_inner"/>
     </appender>
 
-    <appender name="STDOUT" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <append>true</append>
         <encoder>
             <pattern>%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n</pattern>
diff --git a/controller/src/main/resources/rmq.controller.logback.xml b/distribution/conf/logback_controller.xml
similarity index 79%
rename from controller/src/main/resources/rmq.controller.logback.xml
rename to distribution/conf/logback_controller.xml
index b6706f4bd..ad49dac03 100644
--- a/controller/src/main/resources/rmq.controller.logback.xml
+++ b/distribution/conf/logback_controller.xml
@@ -18,16 +18,16 @@
 
 <configuration>
     <appender name="DefaultAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/controller_default.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/controller_default.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
         <triggeringPolicy
-            class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -37,16 +37,16 @@
     </appender>
 
     <appender name="RocketmqControllerAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/controller.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/controller.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
         <triggeringPolicy
-            class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -54,12 +54,12 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqControllerAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqControllerAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqControllerAppender_inner"/>
         <discardingThreshold>0</discardingThreshold>
     </appender>
 
-    <appender name="STDOUT" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <append>true</append>
         <encoder>
             <pattern>%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n</pattern>
diff --git a/namesrv/src/main/resources/rmq.namesrv.logback.xml b/distribution/conf/logback_namesrv.xml
similarity index 77%
rename from namesrv/src/main/resources/rmq.namesrv.logback.xml
rename to distribution/conf/logback_namesrv.xml
index f8ac6fbbd..f8e0c59ac 100644
--- a/namesrv/src/main/resources/rmq.namesrv.logback.xml
+++ b/distribution/conf/logback_namesrv.xml
@@ -18,16 +18,16 @@
 
 <configuration scan="true" scanPeriod="30 seconds">
     <appender name="DefaultAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/namesrv_default.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/namesrv_default.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
         <triggeringPolicy
-            class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -37,16 +37,16 @@
     </appender>
 
     <appender name="RocketmqNamesrvAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/namesrv.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/namesrv.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
         <triggeringPolicy
-            class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -54,21 +54,21 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqNamesrvAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqNamesrvAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqNamesrvAppender_inner"/>
         <discardingThreshold>0</discardingThreshold>
     </appender>
 
     <appender name="RocketmqTrafficAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/namesrv_traffic.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/namesrv_traffic.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -76,11 +76,11 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqTrafficAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqTrafficAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqTrafficAppender_inner"/>
     </appender>
 
-    <appender name="STDOUT" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <append>true</append>
         <encoder>
             <pattern>%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n</pattern>
diff --git a/proxy/src/main/resources/rmq.proxy.logback.xml b/distribution/conf/logback_proxy.xml
similarity index 69%
rename from proxy/src/main/resources/rmq.proxy.logback.xml
rename to distribution/conf/logback_proxy.xml
index cd9d9dd40..a0101dcfd 100644
--- a/proxy/src/main/resources/rmq.proxy.logback.xml
+++ b/distribution/conf/logback_proxy.xml
@@ -19,15 +19,15 @@
 <configuration>
 
     <appender name="RocketmqProxyAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/proxy.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/proxy.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>128MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -35,20 +35,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqProxyAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqProxyAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqProxyAppender_inner"/>
     </appender>
 
     <appender name="RocketmqProxyWatermarkAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/proxy_watermark.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/proxy_watermark.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>128MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -56,21 +56,21 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqProxyWatermarkAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqProxyWatermarkAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqProxyWatermarkAppender_inner"/>
     </appender>
 
     <!-- Below is the logger configuration for broker-->
     <appender name="DefaultAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/broker_default.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/broker_default.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -80,15 +80,15 @@
     </appender>
 
     <appender name="RocketmqBrokerAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/broker.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/broker.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>20</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>128MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -96,20 +96,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqBrokerAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqBrokerAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqBrokerAppender_inner"/>
     </appender>
 
     <appender name="RocketmqProtectionAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/protection.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/protection.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -117,20 +117,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqProtectionAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqProtectionAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqProtectionAppender_inner"/>
     </appender>
 
     <appender name="RocketmqWaterMarkAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/watermark.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/watermark.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -138,20 +138,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqWaterMarkAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqWaterMarkAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqWaterMarkAppender_inner"/>
     </appender>
 
     <appender name="RocketmqStoreAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/store.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/store.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>128MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -159,20 +159,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqStoreAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqStoreAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqStoreAppender_inner"/>
     </appender>
 
     <appender name="RocketmqRemotingAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/remoting.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/remoting.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -180,20 +180,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqRemotingAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqRemotingAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqRemotingAppender_inner"/>
     </appender>
 
     <appender name="RocketmqStoreErrorAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/storeerror.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/storeerror.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -201,21 +201,21 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqStoreErrorAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqStoreErrorAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqStoreErrorAppender_inner"/>
     </appender>
 
 
     <appender name="RocketmqTransactionAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/transaction.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/transaction.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -223,20 +223,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqTransactionAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqTransactionAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqTransactionAppender_inner"/>
     </appender>
 
     <appender name="RocketmqRebalanceLockAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/lock.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/lock.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -244,20 +244,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqRebalanceLockAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqRebalanceLockAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqRebalanceLockAppender_inner"/>
     </appender>
 
     <appender name="RocketmqFilterAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/filter.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/filter.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -265,20 +265,20 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqFilterAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqFilterAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqFilterAppender_inner"/>
     </appender>
 
     <appender name="RocketmqStatsAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/stats.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/stats.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -288,31 +288,31 @@
     </appender>
 
     <appender name="RocketmqCommercialAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/${brokerLogDir}/commercial.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/${brokerLogDir}/commercial.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>10</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>500MB</maxFileSize>
         </triggeringPolicy>
     </appender>
 
     <appender name="RocketmqPopAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/pop.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/pop.%i.log
             </fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>20</maxIndex>
         </rollingPolicy>
         <triggeringPolicy
-            class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>128MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -321,11 +321,11 @@
         </encoder>
     </appender>
 
-    <appender name="RocketmqPopAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqPopAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqPopAppender_inner"/>
     </appender>
 
-    <appender name="STDOUT" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <append>true</append>
         <encoder>
             <pattern>%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n</pattern>
diff --git a/tools/src/main/resources/rmq.tools.logback.xml b/distribution/conf/logback_tools.xml
similarity index 79%
rename from tools/src/main/resources/rmq.tools.logback.xml
rename to distribution/conf/logback_tools.xml
index babd1c687..4a931365b 100644
--- a/tools/src/main/resources/rmq.tools.logback.xml
+++ b/distribution/conf/logback_tools.xml
@@ -18,15 +18,15 @@
 
 <configuration scan="true" scanPeriod="30 seconds">
     <appender name="DefaultAppender"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/tools_default.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/tools_default.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
-        <triggeringPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -36,16 +36,16 @@
     </appender>
 
     <appender name="RocketmqToolsAppender_inner"
-              class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.RollingFileAppender">
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${user.home}/logs/rocketmqlogs/tools.log</file>
         <append>true</append>
-        <rollingPolicy class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
             <fileNamePattern>${user.home}/logs/rocketmqlogs/otherdays/tools.%i.log.gz</fileNamePattern>
             <minIndex>1</minIndex>
             <maxIndex>5</maxIndex>
         </rollingPolicy>
         <triggeringPolicy
-            class="org.apache.rocketmq.shade.ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <maxFileSize>100MB</maxFileSize>
         </triggeringPolicy>
         <encoder>
@@ -53,12 +53,12 @@
             <charset class="java.nio.charset.Charset">UTF-8</charset>
         </encoder>
     </appender>
-    <appender name="RocketmqToolsAppender" class="org.apache.rocketmq.shade.ch.qos.logback.classic.AsyncAppender">
+    <appender name="RocketmqToolsAppender" class="ch.qos.logback.classic.AsyncAppender">
         <appender-ref ref="RocketmqToolsAppender_inner"/>
     </appender>
 
 
-    <appender name="STDOUT" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <append>true</append>
         <encoder>
             <pattern>%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n</pattern>
diff --git a/example/pom.xml b/example/pom.xml
index 197002eef..22a01c6c8 100644
--- a/example/pom.xml
+++ b/example/pom.xml
@@ -35,22 +35,26 @@
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-client</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-srvutil</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-openmessaging</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-acl</artifactId>
-            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>rocketmq-tools</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
         </dependency>
         <dependency>
             <groupId>org.javassist</groupId>
diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/BatchProducer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/BatchProducer.java
index e182e3637..23e922766 100644
--- a/example/src/main/java/org/apache/rocketmq/example/benchmark/BatchProducer.java
+++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/BatchProducer.java
@@ -35,18 +35,18 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.rocketmq.client.exception.MQBrokerException;
 import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.producer.SendResult;
 import org.apache.rocketmq.client.producer.SendStatus;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.message.Message;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 import org.apache.rocketmq.remoting.protocol.SerializeType;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 import org.apache.rocketmq.srvutil.ServerUtil;
 
 public class BatchProducer {
@@ -95,7 +95,7 @@ public class BatchProducer {
         final DefaultMQProducer producer = initInstance(namesrv, msgTraceEnable, rpcHook);
         producer.start();
 
-        final Logger logger = LoggerFactory.getLogger(BatchProducer.class);
+        final InternalLogger log = ClientLogger.getLog();
         final ExecutorService sendThreadPool = Executors.newFixedThreadPool(threadCount);
         for (int i = 0; i < threadCount; i++) {
             sendThreadPool.execute(new Runnable() {
@@ -137,7 +137,7 @@ public class BatchProducer {
                         } catch (RemotingException e) {
                             statsBenchmark.getSendRequestFailedCount().increment();
                             statsBenchmark.getSendMessageFailedCount().add(msgs.size());
-                            logger.error("[BENCHMARK_PRODUCER] Send Exception", e);
+                            log.error("[BENCHMARK_PRODUCER] Send Exception", e);
 
                             try {
                                 Thread.sleep(3000);
@@ -152,15 +152,15 @@ public class BatchProducer {
                             }
                             statsBenchmark.getSendRequestFailedCount().increment();
                             statsBenchmark.getSendMessageFailedCount().add(msgs.size());
-                            logger.error("[BENCHMARK_PRODUCER] Send Exception", e);
+                            log.error("[BENCHMARK_PRODUCER] Send Exception", e);
                         } catch (MQClientException e) {
                             statsBenchmark.getSendRequestFailedCount().increment();
                             statsBenchmark.getSendMessageFailedCount().add(msgs.size());
-                            logger.error("[BENCHMARK_PRODUCER] Send Exception", e);
+                            log.error("[BENCHMARK_PRODUCER] Send Exception", e);
                         } catch (MQBrokerException e) {
                             statsBenchmark.getSendRequestFailedCount().increment();
                             statsBenchmark.getSendMessageFailedCount().add(msgs.size());
-                            logger.error("[BENCHMARK_PRODUCER] Send Exception", e);
+                            log.error("[BENCHMARK_PRODUCER] Send Exception", e);
                             try {
                                 Thread.sleep(3000);
                             } catch (InterruptedException ignored) {
diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java
index 23896a250..24266a7b1 100644
--- a/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java
+++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java
@@ -27,17 +27,17 @@ import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.apache.rocketmq.client.exception.MQBrokerException;
 import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.producer.SendCallback;
 import org.apache.rocketmq.client.producer.SendResult;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.message.Message;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.RPCHook;
 import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.apache.rocketmq.remoting.protocol.RemotingCommand;
 import org.apache.rocketmq.remoting.protocol.SerializeType;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 import org.apache.rocketmq.srvutil.ServerUtil;
 
 import java.util.Arrays;
@@ -53,8 +53,6 @@ import java.util.concurrent.atomic.AtomicLong;
 
 public class Producer {
 
-    private static final Logger log = LoggerFactory.getLogger(Producer.class);
-
     private static byte[] msgBody;
     private static final int MAX_LENGTH_ASYNC_QUEUE = 10000;
     private static final int SLEEP_FOR_A_WHILE = 100;
@@ -93,6 +91,8 @@ public class Producer {
         }
         msgBody = sb.toString().getBytes(StandardCharsets.UTF_8);
 
+        final InternalLogger log = ClientLogger.getLog();
+
         final ExecutorService sendThreadPool = Executors.newFixedThreadPool(threadCount);
 
         final StatsBenchmarkProducer statsBenchmark = new StatsBenchmarkProducer();
diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/timer/TimerProducer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/timer/TimerProducer.java
index e1a18dc75..e4b1d87cc 100644
--- a/example/src/main/java/org/apache/rocketmq/example/benchmark/timer/TimerProducer.java
+++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/timer/TimerProducer.java
@@ -23,14 +23,14 @@ import org.apache.commons.cli.Options;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.client.exception.MQBrokerException;
 import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.common.ThreadFactoryImpl;
 import org.apache.rocketmq.common.message.Message;
 import org.apache.rocketmq.common.message.MessageConst;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
 import org.apache.rocketmq.remoting.exception.RemotingException;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 import org.apache.rocketmq.srvutil.ServerUtil;
 
 import java.io.UnsupportedEncodingException;
@@ -48,7 +48,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 public class TimerProducer {
-    private static final Logger log = LoggerFactory.getLogger(TimerProducer.class);
+    private static final InternalLogger LOGGER = ClientLogger.getLog();
 
     private final String topic;
     private final int threadCount;
@@ -188,17 +188,17 @@ public class TimerProducer {
                                 }
                             } catch (RemotingException e) {
                                 statsBenchmark.getSendRequestFailedCount().incrementAndGet();
-                                log.error("[BENCHMARK_PRODUCER] Send Exception", e);
+                                LOGGER.error("[BENCHMARK_PRODUCER] Send Exception", e);
                                 sleep(3000);
                             } catch (InterruptedException e) {
                                 statsBenchmark.getSendRequestFailedCount().incrementAndGet();
                                 sleep(3000);
                             } catch (MQClientException e) {
                                 statsBenchmark.getSendRequestFailedCount().incrementAndGet();
-                                log.error("[BENCHMARK_PRODUCER] Send Exception", e);
+                                LOGGER.error("[BENCHMARK_PRODUCER] Send Exception", e);
                             } catch (MQBrokerException e) {
                                 statsBenchmark.getReceiveResponseFailedCount().incrementAndGet();
-                                log.error("[BENCHMARK_PRODUCER] Send Exception", e);
+                                LOGGER.error("[BENCHMARK_PRODUCER] Send Exception", e);
                                 sleep(3000);
                             }
                         }
diff --git a/example/src/main/java/org/apache/rocketmq/example/rpc/AsyncRequestProducer.java b/example/src/main/java/org/apache/rocketmq/example/rpc/AsyncRequestProducer.java
index 1d4989342..072291d5c 100644
--- a/example/src/main/java/org/apache/rocketmq/example/rpc/AsyncRequestProducer.java
+++ b/example/src/main/java/org/apache/rocketmq/example/rpc/AsyncRequestProducer.java
@@ -18,15 +18,15 @@
 package org.apache.rocketmq.example.rpc;
 
 import org.apache.rocketmq.client.exception.MQClientException;
+import org.apache.rocketmq.client.log.ClientLogger;
 import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.producer.RequestCallback;
 import org.apache.rocketmq.common.message.Message;
+import org.apache.rocketmq.logging.InternalLogger;
 import org.apache.rocketmq.remoting.common.RemotingHelper;
-import org.apache.rocketmq.shade.org.slf4j.Logger;
-import org.apache.rocketmq.shade.org.slf4j.LoggerFactory;
 
 public class AsyncRequestProducer {
-    private static final Logger log = LoggerFactory.getLogger(AsyncRequestProducer.class);
+    private static final InternalLogger log = ClientLogger.getLog();
 
     public static void main(String[] args) throws MQClientException, InterruptedException {
         String producerGroup = "please_rename_unique_group_name";
diff --git a/example/src/main/java/org/apache/rocketmq/example/simple/PopPushConsumer.java b/example/src/main/java/org/apache/rocketmq/example/simple/PopPushConsumer.java
new file mode 100644
index 000000000..b2695db60
--- /dev/null
+++ b/example/src/main/java/org/apache/rocketmq/example/simple/PopPushConsumer.java
@@ -0,0 +1,62 @@
+/*
+ * 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.rocketmq.example.simple;
+
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
+import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
+import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
+import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
+import org.apache.rocketmq.common.message.MessageRequestMode;
+import org.apache.rocketmq.remoting.protocol.body.ClusterInfo;
+import org.apache.rocketmq.remoting.protocol.route.BrokerData;
+import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
+
+public class PopPushConsumer {
+
+    public static final String CONSUMER_GROUP = "CID_JODIE_1";
+    public static final String TOPIC = "TopicTest";
+
+    // Or use AdminTools directly: mqadmin setConsumeMode -c cluster -t topic -g group -m POP -n 8
+    private static void switchPop() throws Exception {
+        DefaultMQAdminExt mqAdminExt = new DefaultMQAdminExt();
+        mqAdminExt.start();
+
+        ClusterInfo clusterInfo = mqAdminExt.examineBrokerClusterInfo();
+        Set<String> brokerAddrs = clusterInfo.getBrokerAddrTable().values().stream().map(BrokerData::selectBrokerAddr).collect(Collectors.toSet());
+
+        for (String brokerAddr : brokerAddrs) {
+            mqAdminExt.setMessageRequestMode(brokerAddr, TOPIC, CONSUMER_GROUP, MessageRequestMode.POP, 8, 3_000);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        switchPop();
+
+        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
+        consumer.subscribe(TOPIC, "*");
+        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
+        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
+            System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
+            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+        });
+        consumer.setClientRebalance(false);
+        consumer.start();
+        System.out.printf("Consumer Started.%n");
+    }
+}
diff --git a/filter/BUILD.bazel b/filter/BUILD.bazel
index 048c3bdb6..7b6c8687b 100644
--- a/filter/BUILD.bazel
+++ b/filter/BUILD.bazel
@@ -23,6 +23,7 @@ java_library(
     deps = [
         "//common",
         "//remoting",
+        "//logging", 
         "//srvutil",
         "@maven//:org_apache_commons_commons_lang3",
         "@maven//:commons_validator_commons_validator",
diff --git a/filter/pom.xml b/filter/pom.xml
index d83729148..e26c72fec 100644
--- a/filter/pom.xml
+++ b/filter/pom.xml
@@ -36,12 +36,10 @@
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-common</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>rocketmq-srvutil</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
diff --git a/filter/src/test/resources/rmq.logback-test.xml b/filter/src/test/resources/rmq.logback-test.xml
deleted file mode 100644
index c3ec0d1e8..000000000
--- a/filter/src/test/resources/rmq.logback-test.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
-  -->
-<configuration>
-
-    <appender name="CONSOLE" class="org.apache.rocketmq.shade.ch.qos.logback.core.ConsoleAppender">
-        <layout class="org.apache.rocketmq.shade.ch.qos.logback.classic.PatternLayout">
-            <Pattern>
-                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
-            </Pattern>
-        </layout>
-    </appender>
-
-    <logger name="org.apache.rocketmq" level="error" additivity="false">
-        <appender-ref ref="CONSOLE"/>
-    </logger>
-
-    <root level="error">
-        <appender-ref ref="CONSOLE"/>
-    </root>
-
-</configuration>
\ No newline at end of file
diff --git a/logging/BUILD.bazel b/logging/BUILD.bazel
new file mode 100644
index 000000000..a2380e71e
--- /dev/null
+++ b/logging/BUILD.bazel
@@ -0,0 +1,24 @@
+#
+# 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.
+#
+java_library(
+    name = "logging",
+    srcs = glob(["src/main/java/**/*.java"]),
+    deps = [
+        "@maven//:org_slf4j_slf4j_api",
+    ],
+    visibility = ["//visibility:public"],
+)
\ No newline at end of file
diff --git a/container/pom.xml b/logging/pom.xml
similarity index 77%
copy from container/pom.xml
copy to logging/pom.xml
index dc7ab5dfb..4d879cf1e 100644
--- a/container/pom.xml
+++ b/logging/pom.xml
@@ -14,7 +14,9 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>org.apache.rocketmq</groupId>
         <artifactId>rocketmq-all</artifactId>
@@ -23,24 +25,24 @@
 
     <modelVersion>4.0.0</modelVersion>
     <packaging>jar</packaging>
-    <artifactId>rocketmq-container</artifactId>
-    <name>rocketmq-container ${project.version}</name>
+    <artifactId>rocketmq-logging</artifactId>
+    <name>rocketmq-logging ${project.version}</name>
 
     <properties>
         <project.root>${basedir}/..</project.root>
     </properties>
 
     <dependencies>
-        <dependency>
-            <groupId>org.apache.rocketmq</groupId>
-            <artifactId>rocketmq-broker</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
-</project>
+
+</project>
\ No newline at end of file
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/InnerLoggerFactory.java b/logging/src/main/java/org/apache/rocketmq/logging/InnerLoggerFactory.java
new file mode 100644
index 000000000..114e068ea
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/InnerLoggerFactory.java
@@ -0,0 +1,482 @@
+/*
+ * 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.rocketmq.logging;
+
+import org.apache.rocketmq.logging.inner.Logger;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class InnerLoggerFactory extends InternalLoggerFactory {
+
+    public InnerLoggerFactory() {
+        doRegister();
+    }
+
+    @Override
+    protected InternalLogger getLoggerInstance(String name) {
+        return new InnerLogger(name);
+    }
+
+    @Override
+    protected String getLoggerType() {
+        return LOGGER_INNER;
+    }
+
+    @Override
+    protected void shutdown() {
+        Logger.getRepository().shutdown();
+    }
+
+    public static class InnerLogger implements InternalLogger {
+
+        private Logger logger;
+
+        public InnerLogger(String name) {
+            logger = Logger.getLogger(name);
+        }
+
+        @Override
+        public String getName() {
+            return logger.getName();
+        }
+
+        @Override
+        public void debug(String var1) {
+            logger.debug(var1);
+        }
+
+        @Override
+        public void debug(String var1, Throwable var2) {
+            logger.debug(var1, var2);
+        }
+
+        @Override
+        public void info(String var1) {
+            logger.info(var1);
+        }
+
+        @Override
+        public void info(String var1, Throwable var2) {
+            logger.info(var1, var2);
+        }
+
+        @Override
+        public void warn(String var1) {
+            logger.warn(var1);
+        }
+
+        @Override
+        public void warn(String var1, Throwable var2) {
+            logger.warn(var1, var2);
+        }
+
+        @Override
+        public void error(String var1) {
+            logger.error(var1);
+        }
+
+        @Override
+        public void error(String var1, Throwable var2) {
+            logger.error(var1, var2);
+        }
+
+        @Override
+        public void debug(String var1, Object var2) {
+            FormattingTuple format = MessageFormatter.format(var1, var2);
+            logger.debug(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void debug(String var1, Object var2, Object var3) {
+            FormattingTuple format = MessageFormatter.format(var1, var2, var3);
+            logger.debug(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void debug(String var1, Object... var2) {
+            FormattingTuple format = MessageFormatter.arrayFormat(var1, var2);
+            logger.debug(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void info(String var1, Object var2) {
+            FormattingTuple format = MessageFormatter.format(var1, var2);
+            logger.info(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void info(String var1, Object var2, Object var3) {
+            FormattingTuple format = MessageFormatter.format(var1, var2, var3);
+            logger.info(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void info(String var1, Object... var2) {
+            FormattingTuple format = MessageFormatter.arrayFormat(var1, var2);
+            logger.info(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void warn(String var1, Object var2) {
+            FormattingTuple format = MessageFormatter.format(var1, var2);
+            logger.warn(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void warn(String var1, Object... var2) {
+            FormattingTuple format = MessageFormatter.arrayFormat(var1, var2);
+            logger.warn(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void warn(String var1, Object var2, Object var3) {
+            FormattingTuple format = MessageFormatter.format(var1, var2, var3);
+            logger.warn(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void error(String var1, Object var2) {
+            FormattingTuple format = MessageFormatter.format(var1, var2);
+            logger.warn(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void error(String var1, Object var2, Object var3) {
+            FormattingTuple format = MessageFormatter.format(var1, var2, var3);
+            logger.warn(format.getMessage(), format.getThrowable());
+        }
+
+        @Override
+        public void error(String var1, Object... var2) {
+            FormattingTuple format = MessageFormatter.arrayFormat(var1, var2);
+            logger.warn(format.getMessage(), format.getThrowable());
+        }
+
+        public Logger getLogger() {
+            return logger;
+        }
+    }
+
+
+    public static class FormattingTuple {
+        private String message;
+        private Throwable throwable;
+        private Object[] argArray;
+
+        public FormattingTuple(String message) {
+            this(message, null, null);
+        }
+
+        public FormattingTuple(String message, Object[] argArray, Throwable throwable) {
+            this.message = message;
+            this.throwable = throwable;
+            if (throwable == null) {
+                this.argArray = argArray;
+            } else {
+                this.argArray = trimmedCopy(argArray);
+            }
+
+        }
+
+        static Object[] trimmedCopy(Object[] argArray) {
+            if (argArray != null && argArray.length != 0) {
+                int trimemdLen = argArray.length - 1;
+                Object[] trimmed = new Object[trimemdLen];
+                System.arraycopy(argArray, 0, trimmed, 0, trimemdLen);
+                return trimmed;
+            } else {
+                throw new IllegalStateException("non-sensical empty or null argument array");
+            }
+        }
+
+        public String getMessage() {
+            return this.message;
+        }
+
+        public Object[] getArgArray() {
+            return this.argArray;
+        }
+
+        public Throwable getThrowable() {
+            return this.throwable;
+        }
+    }
+
+    public static class MessageFormatter {
+
+        public MessageFormatter() {
+        }
+
+        public static FormattingTuple format(String messagePattern, Object arg) {
+            return arrayFormat(messagePattern, new Object[]{arg});
+        }
+
+        public static FormattingTuple format(String messagePattern, Object arg1, Object arg2) {
+            return arrayFormat(messagePattern, new Object[]{arg1, arg2});
+        }
+
+        static Throwable getThrowableCandidate(Object[] argArray) {
+            if (argArray != null && argArray.length != 0) {
+                Object lastEntry = argArray[argArray.length - 1];
+                return lastEntry instanceof Throwable ? (Throwable) lastEntry : null;
+            } else {
+                return null;
+            }
+        }
+
+        public static FormattingTuple arrayFormat(String messagePattern, Object[] argArray) {
+            Throwable throwableCandidate = getThrowableCandidate(argArray);
+            if (messagePattern == null) {
+                return new FormattingTuple(null, argArray, throwableCandidate);
+            } else if (argArray == null) {
+                return new FormattingTuple(messagePattern);
+            } else {
+                int i = 0;
+                StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50);
+
+                int len;
+                for (len = 0; len < argArray.length; ++len) {
+                    int j = messagePattern.indexOf("{}", i);
+                    if (j == -1) {
+                        if (i == 0) {
+                            return new FormattingTuple(messagePattern, argArray, throwableCandidate);
+                        }
+
+                        sbuf.append(messagePattern.substring(i, messagePattern.length()));
+                        return new FormattingTuple(sbuf.toString(), argArray, throwableCandidate);
+                    }
+
+                    if (isEscapeDelimeter(messagePattern, j)) {
+                        if (!isDoubleEscaped(messagePattern, j)) {
+                            --len;
+                            sbuf.append(messagePattern.substring(i, j - 1));
+                            sbuf.append('{');
+                            i = j + 1;
+                        } else {
+                            sbuf.append(messagePattern.substring(i, j - 1));
+                            deeplyAppendParameter(sbuf, argArray[len], null);
+                            i = j + 2;
+                        }
+                    } else {
+                        sbuf.append(messagePattern.substring(i, j));
+                        deeplyAppendParameter(sbuf, argArray[len], null);
+                        i = j + 2;
+                    }
+                }
+
+                sbuf.append(messagePattern.substring(i, messagePattern.length()));
+                if (len < argArray.length - 1) {
+                    return new FormattingTuple(sbuf.toString(), argArray, throwableCandidate);
+                } else {
+                    return new FormattingTuple(sbuf.toString(), argArray, null);
+                }
+            }
+        }
+
+        static boolean isEscapeDelimeter(String messagePattern, int delimeterStartIndex) {
+            if (delimeterStartIndex == 0) {
+                return false;
+            } else {
+                char potentialEscape = messagePattern.charAt(delimeterStartIndex - 1);
+                return potentialEscape == 92;
+            }
+        }
+
+        static boolean isDoubleEscaped(String messagePattern, int delimeterStartIndex) {
+            return delimeterStartIndex >= 2 && messagePattern.charAt(delimeterStartIndex - 2) == 92;
+        }
+
+        private static void deeplyAppendParameter(StringBuilder sbuf, Object o, Map<Object[], Object> seenMap) {
+            if (o == null) {
+                sbuf.append("null");
+            } else {
+                if (!o.getClass().isArray()) {
+                    safeObjectAppend(sbuf, o);
+                } else if (o instanceof boolean[]) {
+                    booleanArrayAppend(sbuf, (boolean[]) o);
+                } else if (o instanceof byte[]) {
+                    byteArrayAppend(sbuf, (byte[]) o);
+                } else if (o instanceof char[]) {
+                    charArrayAppend(sbuf, (char[]) o);
+                } else if (o instanceof short[]) {
+                    shortArrayAppend(sbuf, (short[]) o);
+                } else if (o instanceof int[]) {
+                    intArrayAppend(sbuf, (int[]) o);
+                } else if (o instanceof long[]) {
+                    longArrayAppend(sbuf, (long[]) o);
+                } else if (o instanceof float[]) {
+                    floatArrayAppend(sbuf, (float[]) o);
+                } else if (o instanceof double[]) {
+                    doubleArrayAppend(sbuf, (double[]) o);
+                } else {
+                    objectArrayAppend(sbuf, (Object[]) o, seenMap);
+                }
+
+            }
+        }
+
+        private static void safeObjectAppend(StringBuilder sbuf, Object o) {
+            try {
+                String t = o.toString();
+                sbuf.append(t);
+            } catch (Throwable var3) {
+                System.err.println("RocketMQ InnerLogger: Failed toString() invocation on an object of type [" + o.getClass().getName() + "]");
+                var3.printStackTrace();
+                sbuf.append("[FAILED toString()]");
+            }
+
+        }
+
+        private static void objectArrayAppend(StringBuilder sbuf, Object[] a, Map<Object[], Object> seenMap) {
+            if (seenMap == null) {
+                seenMap = new HashMap<>();
+            }
+            sbuf.append('[');
+            if (!seenMap.containsKey(a)) {
+                seenMap.put(a, null);
+                int len = a.length;
+
+                for (int i = 0; i < len; ++i) {
+                    deeplyAppendParameter(sbuf, a[i], seenMap);
+                    if (i != len - 1) {
+                        sbuf.append(", ");
+                    }
+                }
+
+                seenMap.remove(a);
+            } else {
+                sbuf.append("...");
+            }
+
+            sbuf.append(']');
+        }
+
+        private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
+            sbuf.append('[');
+            int len = a.length;
+
+            for (int i = 0; i < len; ++i) {
+                sbuf.append(a[i]);
+                if (i != len - 1) {
+                    sbuf.append(", ");
+                }
+            }
+
+            sbuf.append(']');
+        }
+
+        private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
+            sbuf.append('[');
+            int len = a.length;
+
+            for (int i = 0; i < len; ++i) {
+                sbuf.append(a[i]);
+                if (i != len - 1) {
+                    sbuf.append(", ");
+                }
+            }
+
+            sbuf.append(']');
+        }
+
+        private static void charArrayAppend(StringBuilder sbuf, char[] a) {
+            sbuf.append('[');
+            int len = a.length;
+
+            for (int i = 0; i < len; ++i) {
+                sbuf.append(a[i]);
+                if (i != len - 1) {
+                    sbuf.append(", ");
+                }
+            }
+
+            sbuf.append(']');
+        }
+
+        private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
+            sbuf.append('[');
+            int len = a.length;
+
+            for (int i = 0; i < len; ++i) {
+                sbuf.append(a[i]);
+                if (i != len - 1) {
+                    sbuf.append(", ");
+                }
+            }
+
+            sbuf.append(']');
+        }
+
+        private static void intArrayAppend(StringBuilder sbuf, int[] a) {
+            sbuf.append('[');
+            int len = a.length;
+
+            for (int i = 0; i < len; ++i) {
+                sbuf.append(a[i]);
+                if (i != len - 1) {
+                    sbuf.append(", ");
+                }
+            }
+
+            sbuf.append(']');
+        }
+
+        private static void longArrayAppend(StringBuilder sbuf, long[] a) {
+            sbuf.append('[');
+            int len = a.length;
+
+            for (int i = 0; i < len; ++i) {
+                sbuf.append(a[i]);
+                if (i != len - 1) {
+                    sbuf.append(", ");
+                }
+            }
+
+            sbuf.append(']');
+        }
+
+        private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
+            sbuf.append('[');
+            int len = a.length;
+
+            for (int i = 0; i < len; ++i) {
+                sbuf.append(a[i]);
+                if (i != len - 1) {
+                    sbuf.append(", ");
+                }
+            }
+
+            sbuf.append(']');
+        }
+
+        private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {
+            sbuf.append('[');
+            int len = a.length;
+
+            for (int i = 0; i < len; ++i) {
+                sbuf.append(a[i]);
+                if (i != len - 1) {
+                    sbuf.append(", ");
+                }
+            }
+
+            sbuf.append(']');
+        }
+    }
+}
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/InternalLogger.java b/logging/src/main/java/org/apache/rocketmq/logging/InternalLogger.java
new file mode 100644
index 000000000..fae69dda6
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/InternalLogger.java
@@ -0,0 +1,63 @@
+/*
+ * 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.rocketmq.logging;
+
+public interface InternalLogger {
+
+    String getName();
+
+    void debug(String var1);
+
+    void debug(String var1, Object var2);
+
+    void debug(String var1, Object var2, Object var3);
+
+    void debug(String var1, Object... var2);
+
+    void debug(String var1, Throwable var2);
+
+    void info(String var1);
+
+    void info(String var1, Object var2);
+
+    void info(String var1, Object var2, Object var3);
+
+    void info(String var1, Object... var2);
+
+    void info(String var1, Throwable var2);
+
+    void warn(String var1);
+
+    void warn(String var1, Object var2);
+
+    void warn(String var1, Object... var2);
+
+    void warn(String var1, Object var2, Object var3);
+
+    void warn(String var1, Throwable var2);
+
+    void error(String var1);
+
+    void error(String var1, Object var2);
+
+    void error(String var1, Object var2, Object var3);
+
+    void error(String var1, Object... var2);
+
+    void error(String var1, Throwable var2);
+}
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/InternalLoggerFactory.java b/logging/src/main/java/org/apache/rocketmq/logging/InternalLoggerFactory.java
new file mode 100644
index 000000000..9c21f664b
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/InternalLoggerFactory.java
@@ -0,0 +1,100 @@
+/*
+ * 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.rocketmq.logging;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public abstract class InternalLoggerFactory {
+
+    public static final String LOGGER_SLF4J = "slf4j";
+
+    public static final String LOGGER_INNER = "inner";
+
+    public static final String DEFAULT_LOGGER = LOGGER_SLF4J;
+
+    public static final String BROKER_CONTAINER_NAME = "BrokerContainer";
+
+    /**
+     * Loggers with following name will be directed to default logger for LogTail parser.
+     */
+    public static final String CONSUMER_STATS_LOGGER_NAME = "RocketmqConsumerStats";
+    public static final String COMMERCIAL_LOGGER_NAME = "RocketmqCommercial";
+    public static final String ACCOUNT_LOGGER_NAME = "RocketmqAccount";
+
+    private static String loggerType = null;
+
+    public static final ThreadLocal<String> BROKER_IDENTITY = new ThreadLocal<>();
+
+    private static ConcurrentHashMap<String, InternalLoggerFactory> loggerFactoryCache = new ConcurrentHashMap<>();
+
+    public static InternalLogger getLogger(Class clazz) {
+        return getLogger(clazz.getName());
+    }
+
+    public static InternalLogger getLogger(String name) {
+        return getLoggerFactory().getLoggerInstance(name);
+    }
+
+    private static InternalLoggerFactory getLoggerFactory() {
+        InternalLoggerFactory internalLoggerFactory = null;
+        if (loggerType != null) {
+            internalLoggerFactory = loggerFactoryCache.get(loggerType);
+        }
+        if (internalLoggerFactory == null) {
+            internalLoggerFactory = loggerFactoryCache.get(DEFAULT_LOGGER);
+        }
+        if (internalLoggerFactory == null) {
+            internalLoggerFactory = loggerFactoryCache.get(LOGGER_INNER);
+        }
+        if (internalLoggerFactory == null) {
+            throw new RuntimeException("[RocketMQ] Logger init failed, please check logger");
+        }
+        return internalLoggerFactory;
+    }
+
+    public static void setCurrentLoggerType(String type) {
+        loggerType = type;
+    }
+
+    static {
+        try {
+            new Slf4jLoggerFactory();
+        } catch (Throwable e) {
+            //ignore
+        }
+        try {
+            new InnerLoggerFactory();
+        } catch (Throwable e) {
+            //ignore
+        }
+    }
+
+    protected void doRegister() {
+        String loggerType = getLoggerType();
+        if (loggerFactoryCache.get(loggerType) != null) {
+            return;
+        }
+        loggerFactoryCache.put(loggerType, this);
+    }
+
+    protected abstract void shutdown();
+
+    protected abstract InternalLogger getLoggerInstance(String name);
+
+    protected abstract String getLoggerType();
+}
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/Slf4jLoggerFactory.java b/logging/src/main/java/org/apache/rocketmq/logging/Slf4jLoggerFactory.java
new file mode 100644
index 000000000..f1f727cc4
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/Slf4jLoggerFactory.java
@@ -0,0 +1,193 @@
+/*
+ * 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.rocketmq.logging;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Slf4jLoggerFactory extends InternalLoggerFactory {
+
+    public Slf4jLoggerFactory() {
+        LoggerFactory.getILoggerFactory();
+        doRegister();
+    }
+
+    @Override
+    protected String getLoggerType() {
+        return InternalLoggerFactory.LOGGER_SLF4J;
+    }
+
+    @Override
+    protected InternalLogger getLoggerInstance(String name) {
+        return new Slf4jLogger(name);
+    }
+
+    @Override
+    protected void shutdown() {
+
+    }
+
+    public static class Slf4jLogger implements InternalLogger {
+        private static final Pattern PATTERN = Pattern.compile("#.*#");
+
+        private final String loggerSuffix;
+        private final Logger defaultLogger;
+
+        private final Map<String, Logger> loggerMap = new HashMap<>();
+
+        public Slf4jLogger(String loggerSuffix) {
+            this.loggerSuffix = loggerSuffix;
+            this.defaultLogger = LoggerFactory.getLogger(loggerSuffix);
+        }
+
+        private Logger getLogger() {
+            if (loggerSuffix.equals(ACCOUNT_LOGGER_NAME)
+                || loggerSuffix.equals(CONSUMER_STATS_LOGGER_NAME)
+                || loggerSuffix.equals(COMMERCIAL_LOGGER_NAME)) {
+                return defaultLogger;
+            }
+            String brokerIdentity = InnerLoggerFactory.BROKER_IDENTITY.get();
+            if (brokerIdentity == null) {
+                Matcher m = PATTERN.matcher(Thread.currentThread().getName());
+                if (m.find()) {
+                    String match = m.group();
+                    brokerIdentity = match.substring(1, match.length() - 1);
+                }
+            }
+            if (InnerLoggerFactory.BROKER_CONTAINER_NAME.equals(brokerIdentity)) {
+                return defaultLogger;
+            }
+            if (brokerIdentity != null) {
+                if (!loggerMap.containsKey(brokerIdentity)) {
+                    loggerMap.put(brokerIdentity, LoggerFactory.getLogger("#" + brokerIdentity + "#" + loggerSuffix));
+                }
+                return loggerMap.get(brokerIdentity);
+            }
+            return defaultLogger;
+        }
+
+        @Override
+        public String getName() {
+            return getLogger().getName();
+        }
+
+        @Override
+        public void debug(String s) {
+            getLogger().debug(s);
+        }
+
+        @Override
+        public void debug(String s, Object o) {
+            getLogger().debug(s, o);
+        }
+
+        @Override
+        public void debug(String s, Object o, Object o1) {
+            getLogger().debug(s, o, o1);
+        }
+
+        @Override
+        public void debug(String s, Object... objects) {
+            getLogger().debug(s, objects);
+        }
+
+        @Override
+        public void debug(String s, Throwable throwable) {
+            getLogger().debug(s, throwable);
+        }
+
+        @Override
+        public void info(String s) {
+            getLogger().info(s);
+        }
+
+        @Override
+        public void info(String s, Object o) {
+            getLogger().info(s, o);
+        }
+
+        @Override
+        public void info(String s, Object o, Object o1) {
+            getLogger().info(s, o, o1);
+        }
+
+        @Override
+        public void info(String s, Object... objects) {
+            getLogger().info(s, objects);
+        }
+
+        @Override
+        public void info(String s, Throwable throwable) {
+            getLogger().info(s, throwable);
+        }
+
+        @Override
+        public void warn(String s) {
+            getLogger().warn(s);
+        }
+
+        @Override
+        public void warn(String s, Object o) {
+            getLogger().warn(s, o);
+        }
+
+        @Override
+        public void warn(String s, Object... objects) {
+            getLogger().warn(s, objects);
+        }
+
+        @Override
+        public void warn(String s, Object o, Object o1) {
+            getLogger().warn(s, o, o1);
+        }
+
+        @Override
+        public void warn(String s, Throwable throwable) {
+            getLogger().warn(s, throwable);
+        }
+
+        @Override
+        public void error(String s) {
+            getLogger().error(s);
+        }
+
+        @Override
+        public void error(String s, Object o) {
+            getLogger().error(s, o);
+        }
+
+        @Override
+        public void error(String s, Object o, Object o1) {
+            getLogger().error(s, o, o1);
+        }
+
+        @Override
+        public void error(String s, Object... objects) {
+            getLogger().error(s, objects);
+        }
+
+        @Override
+        public void error(String s, Throwable throwable) {
+            getLogger().error(s, throwable);
+        }
+    }
+}
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/inner/Appender.java b/logging/src/main/java/org/apache/rocketmq/logging/inner/Appender.java
new file mode 100755
index 000000000..d40d6cb31
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/inner/Appender.java
@@ -0,0 +1,228 @@
+/*
+ * 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.rocketmq.logging.inner;
+
+
+import java.io.InterruptedIOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+public abstract class Appender {
+
+    public static final int CODE_WRITE_FAILURE = 1;
+    public static final int CODE_FLUSH_FAILURE = 2;
+    public static final int CODE_CLOSE_FAILURE = 3;
+    public static final int CODE_FILE_OPEN_FAILURE = 4;
+
+    public final static String LINE_SEP = System.getProperty("line.separator");
+
+    boolean firstTime = true;
+
+    protected Layout layout;
+
+    protected String name;
+
+    protected boolean closed = false;
+
+    public void activateOptions() {
+    }
+
+    abstract protected void append(LoggingEvent event);
+
+    public void finalize() {
+        try {
+            super.finalize();
+        } catch (Throwable throwable) {
+            SysLogger.error("Finalizing appender named [" + name + "]. error", throwable);
+        }
+        if (this.closed) {
+            return;
+        }
+
+        SysLogger.debug("Finalizing appender named [" + name + "].");
+        close();
+    }
+
+    public Layout getLayout() {
+        return layout;
+    }
+
+    public final String getName() {
+        return this.name;
+    }
+
+    public synchronized void doAppend(LoggingEvent event) {
+        if (closed) {
+            SysLogger.error("Attempted to append to closed appender named [" + name + "].");
+            return;
+        }
+        this.append(event);
+    }
+
+    public void setLayout(Layout layout) {
+        this.layout = layout;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public abstract void close();
+
+    public void handleError(String message, Exception e, int errorCode) {
+        if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
+            Thread.currentThread().interrupt();
+        }
+        if (firstTime) {
+            SysLogger.error(message + " code:" + errorCode, e);
+            firstTime = false;
+        }
+    }
+
+    public void handleError(String message) {
+        if (firstTime) {
+            SysLogger.error(message);
+            firstTime = false;
+        }
+    }
+
+
+    public interface AppenderPipeline {
+
+        void addAppender(Appender newAppender);
+
+        Enumeration getAllAppenders();
+
+        Appender getAppender(String name);
+
+        boolean isAttached(Appender appender);
+
+        void removeAllAppenders();
+
+        void removeAppender(Appender appender);
+
+        void removeAppender(String name);
+    }
+
+
+    public static class AppenderPipelineImpl implements AppenderPipeline {
+
+
+        protected Vector<Appender> appenderList;
+
+        public void addAppender(Appender newAppender) {
+            if (newAppender == null) {
+                return;
+            }
+
+            if (appenderList == null) {
+                appenderList = new Vector<>(1);
+            }
+            if (!appenderList.contains(newAppender)) {
+                appenderList.addElement(newAppender);
+            }
+        }
+
+        public int appendLoopOnAppenders(LoggingEvent event) {
+            int size = 0;
+            Appender appender;
+
+            if (appenderList != null) {
+                size = appenderList.size();
+                for (int i = 0; i < size; i++) {
+                    appender = appenderList.elementAt(i);
+                    appender.doAppend(event);
+                }
+            }
+            return size;
+        }
+
+        public Enumeration getAllAppenders() {
+            if (appenderList == null) {
+                return null;
+            } else {
+                return appenderList.elements();
+            }
+        }
+
+        public Appender getAppender(String name) {
+            if (appenderList == null || name == null) {
+                return null;
+            }
+
+            int size = appenderList.size();
+            Appender appender;
+            for (int i = 0; i < size; i++) {
+                appender = appenderList.elementAt(i);
+                if (name.equals(appender.getName())) {
+                    return appender;
+                }
+            }
+            return null;
+        }
+
+        public boolean isAttached(Appender appender) {
+            if (appenderList == null || appender == null) {
+                return false;
+            }
+
+            int size = appenderList.size();
+            Appender a;
+            for (int i = 0; i < size; i++) {
+                a = appenderList.elementAt(i);
+                if (a == appender) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public void removeAllAppenders() {
+            if (appenderList != null) {
+                int len = appenderList.size();
+                for (int i = 0; i < len; i++) {
+                    Appender a = appenderList.elementAt(i);
+                    a.close();
+                }
+                appenderList.removeAllElements();
+                appenderList = null;
+            }
+        }
+
+        public void removeAppender(Appender appender) {
+            if (appender == null || appenderList == null) {
+                return;
+            }
+            appenderList.removeElement(appender);
+        }
+
+        public void removeAppender(String name) {
+            if (name == null || appenderList == null) {
+                return;
+            }
+            int size = appenderList.size();
+            for (int i = 0; i < size; i++) {
+                if (name.equals((appenderList.elementAt(i)).getName())) {
+                    appenderList.removeElementAt(i);
+                    break;
+                }
+            }
+        }
+
+    }
+}
diff --git a/common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java b/logging/src/main/java/org/apache/rocketmq/logging/inner/Layout.java
similarity index 56%
copy from common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java
copy to logging/src/main/java/org/apache/rocketmq/logging/inner/Layout.java
index 8bce59d76..7ea3561df 100644
--- a/common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java
+++ b/logging/src/main/java/org/apache/rocketmq/logging/inner/Layout.java
@@ -15,26 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.rocketmq.common;
+package org.apache.rocketmq.logging.inner;
 
-public abstract class AbstractBrokerRunnable implements Runnable {
-    protected final BrokerIdentity brokerIdentity;
+public abstract class Layout {
 
-    public AbstractBrokerRunnable(BrokerIdentity brokerIdentity) {
-        this.brokerIdentity = brokerIdentity;
+    public abstract String format(LoggingEvent event);
+
+    public String getContentType() {
+        return "text/plain";
+    }
+
+    public String getHeader() {
+        return null;
     }
 
-    /**
-     * real logic for running
-     */
-    public abstract void run2();
-
-    @Override
-    public void run() {
-        if (brokerIdentity.isInBrokerContainer()) {
-            // set threadlocal broker identity to forward logging to corresponding broker
-//            InnerLoggerFactory.BROKER_IDENTITY.set(brokerIdentity.getCanonicalName());
-        }
-        run2();
+    public String getFooter() {
+        return null;
     }
-}
+
+
+    abstract public boolean ignoresThrowable();
+
+}
\ No newline at end of file
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/inner/Level.java b/logging/src/main/java/org/apache/rocketmq/logging/inner/Level.java
new file mode 100755
index 000000000..d647adb6b
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/inner/Level.java
@@ -0,0 +1,152 @@
+/*
+ * 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.rocketmq.logging.inner;
+
+import java.io.Serializable;
+
+public class Level implements Serializable {
+
+    transient int level;
+    transient String levelStr;
+    transient int syslogEquivalent;
+
+    public final static int OFF_INT = Integer.MAX_VALUE;
+    public final static int ERROR_INT = 40000;
+    public final static int WARN_INT = 30000;
+    public final static int INFO_INT = 20000;
+    public final static int DEBUG_INT = 10000;
+    public final static int ALL_INT = Integer.MIN_VALUE;
+
+
+    private static final String ALL_NAME = "ALL";
+
+    private static final String DEBUG_NAME = "DEBUG";
+
+    private static final String INFO_NAME = "INFO";
+
+    private static final String WARN_NAME = "WARN";
+
+    private static final String ERROR_NAME = "ERROR";
+
+    private static final String OFF_NAME = "OFF";
+
+    final static public Level OFF = new Level(OFF_INT, OFF_NAME, 0);
+
+    final static public Level ERROR = new Level(ERROR_INT, ERROR_NAME, 3);
+
+    final static public Level WARN = new Level(WARN_INT, WARN_NAME, 4);
+
+    final static public Level INFO = new Level(INFO_INT, INFO_NAME, 6);
+
+    final static public Level DEBUG = new Level(DEBUG_INT, DEBUG_NAME, 7);
+
+    final static public Level ALL = new Level(ALL_INT, ALL_NAME, 7);
+
+    static final long serialVersionUID = 3491141966387921974L;
+
+    protected Level(int level, String levelStr, int syslogEquivalent) {
+        this.level = level;
+        this.levelStr = levelStr;
+        this.syslogEquivalent = syslogEquivalent;
+    }
+
+    public static Level toLevel(String sArg) {
+        return toLevel(sArg, Level.DEBUG);
+    }
+
+    public static Level toLevel(int val) {
+        return toLevel(val, Level.DEBUG);
+    }
+
+    public static Level toLevel(int val, Level defaultLevel) {
+        switch (val) {
+            case ALL_INT:
+                return ALL;
+            case DEBUG_INT:
+                return Level.DEBUG;
+            case INFO_INT:
+                return Level.INFO;
+            case WARN_INT:
+                return Level.WARN;
+            case ERROR_INT:
+                return Level.ERROR;
+            case OFF_INT:
+                return OFF;
+            default:
+                return defaultLevel;
+        }
+    }
+
+    public static Level toLevel(String sArg, Level defaultLevel) {
+        if (sArg == null) {
+            return defaultLevel;
+        }
+        String s = sArg.toUpperCase();
+
+        if (s.equals(ALL_NAME)) {
+            return Level.ALL;
+        }
+        if (s.equals(DEBUG_NAME)) {
+            return Level.DEBUG;
+        }
+        if (s.equals(INFO_NAME)) {
+            return Level.INFO;
+        }
+        if (s.equals(WARN_NAME)) {
+            return Level.WARN;
+        }
+        if (s.equals(ERROR_NAME)) {
+            return Level.ERROR;
+        }
+        if (s.equals(OFF_NAME)) {
+            return Level.OFF;
+        }
+        return defaultLevel;
+    }
+
+
+    public boolean equals(Object o) {
+        if (o instanceof Level) {
+            Level r = (Level) o;
+            return this.level == r.level;
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        int result = level;
+        result = 31 * result + (levelStr != null ? levelStr.hashCode() : 0);
+        result = 31 * result + syslogEquivalent;
+        return result;
+    }
+
+    public boolean isGreaterOrEqual(Level r) {
+        return level >= r.level;
+    }
+
+    final public String toString() {
+        return levelStr;
+    }
+
+    public final int toInt() {
+        return level;
+    }
+
+}
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/inner/Logger.java b/logging/src/main/java/org/apache/rocketmq/logging/inner/Logger.java
new file mode 100755
index 000000000..7584ea317
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/inner/Logger.java
@@ -0,0 +1,467 @@
+/*
+ * 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.rocketmq.logging.inner;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+
+public class Logger implements Appender.AppenderPipeline {
+
+    private static final String FQCN = Logger.class.getName();
+
+    private static final DefaultLoggerRepository REPOSITORY = new DefaultLoggerRepository(new RootLogger(Level.DEBUG));
+
+    public static LoggerRepository getRepository() {
+        return REPOSITORY;
+    }
+
+    private String name;
+
+    volatile private Level level;
+
+    volatile private Logger parent;
+
+    Appender.AppenderPipelineImpl appenderPipeline;
+
+    private boolean additive = true;
+
+    private Logger(String name) {
+        this.name = name;
+    }
+
+    static public Logger getLogger(String name) {
+        return getRepository().getLogger(name);
+    }
+
+    static public Logger getLogger(Class clazz) {
+        return getRepository().getLogger(clazz.getName());
+    }
+
+    public static Logger getRootLogger() {
+        return getRepository().getRootLogger();
+    }
+
+    synchronized public void addAppender(Appender newAppender) {
+        if (appenderPipeline == null) {
+            appenderPipeline = new Appender.AppenderPipelineImpl();
+        }
+        appenderPipeline.addAppender(newAppender);
+    }
+
+    public void callAppenders(LoggingEvent event) {
+        int writes = 0;
+
+        for (Logger logger = this; logger != null; logger = logger.parent) {
+            synchronized (logger) {
+                if (logger.appenderPipeline != null) {
+                    writes += logger.appenderPipeline.appendLoopOnAppenders(event);
+                }
+                if (!logger.additive) {
+                    break;
+                }
+            }
+        }
+
+        if (writes == 0) {
+            getRepository().emitNoAppenderWarning(this);
+        }
+    }
+
+    synchronized void closeNestedAppenders() {
+        Enumeration enumeration = this.getAllAppenders();
+        if (enumeration != null) {
+            while (enumeration.hasMoreElements()) {
+                Appender a = (Appender) enumeration.nextElement();
+                if (a instanceof Appender.AppenderPipeline) {
+                    a.close();
+                }
+            }
+        }
+    }
+
+    public void debug(Object message) {
+        if (getRepository().isDisabled(Level.DEBUG_INT)) {
+            return;
+        }
+        if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
+            forcedLog(FQCN, Level.DEBUG, message, null);
+        }
+    }
+
+
+    public void debug(Object message, Throwable t) {
+        if (getRepository().isDisabled(Level.DEBUG_INT)) {
+            return;
+        }
+        if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
+            forcedLog(FQCN, Level.DEBUG, message, t);
+        }
+    }
+
+
+    public void error(Object message) {
+        if (getRepository().isDisabled(Level.ERROR_INT)) {
+            return;
+        }
+        if (Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel())) {
+            forcedLog(FQCN, Level.ERROR, message, null);
+        }
+    }
+
+    public void error(Object message, Throwable t) {
+        if (getRepository().isDisabled(Level.ERROR_INT)) {
+            return;
+        }
+        if (Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel())) {
+            forcedLog(FQCN, Level.ERROR, message, t);
+        }
+
+    }
+
+
+    protected void forcedLog(String fqcn, Level level, Object message, Throwable t) {
+        callAppenders(new LoggingEvent(fqcn, this, level, message, t));
+    }
+
+
+    synchronized public Enumeration getAllAppenders() {
+        if (appenderPipeline == null) {
+            return null;
+        } else {
+            return appenderPipeline.getAllAppenders();
+        }
+    }
+
+    synchronized public Appender getAppender(String name) {
+        if (appenderPipeline == null || name == null) {
+            return null;
+        }
+
+        return appenderPipeline.getAppender(name);
+    }
+
+    public Level getEffectiveLevel() {
+        for (Logger c = this; c != null; c = c.parent) {
+            if (c.level != null) {
+                return c.level;
+            }
+        }
+        return null;
+    }
+
+    public final String getName() {
+        return name;
+    }
+
+    final public Level getLevel() {
+        return this.level;
+    }
+
+
+    public void info(Object message) {
+        if (getRepository().isDisabled(Level.INFO_INT)) {
+            return;
+        }
+        if (Level.INFO.isGreaterOrEqual(this.getEffectiveLevel())) {
+            forcedLog(FQCN, Level.INFO, message, null);
+        }
+    }
+
+    public void info(Object message, Throwable t) {
+        if (getRepository().isDisabled(Level.INFO_INT)) {
+            return;
+        }
+        if (Level.INFO.isGreaterOrEqual(this.getEffectiveLevel())) {
+            forcedLog(FQCN, Level.INFO, message, t);
+        }
+    }
+
+    public boolean isAttached(Appender appender) {
+        return appender != null && appenderPipeline != null && appenderPipeline.isAttached(appender);
+    }
+
+    synchronized public void removeAllAppenders() {
+        if (appenderPipeline != null) {
+            appenderPipeline.removeAllAppenders();
+            appenderPipeline = null;
+        }
+    }
+
+    synchronized public void removeAppender(Appender appender) {
+        if (appender == null || appenderPipeline == null) {
+            return;
+        }
+        appenderPipeline.removeAppender(appender);
+    }
+
+    synchronized public void removeAppender(String name) {
+        if (name == null || appenderPipeline == null) {
+            return;
+        }
+        appenderPipeline.removeAppender(name);
+    }
+
+    public void setAdditivity(boolean additive) {
+        this.additive = additive;
+    }
+
+    public void setLevel(Level level) {
+        this.level = level;
+    }
+
+    public void warn(Object message) {
+        if (getRepository().isDisabled(Level.WARN_INT)) {
+            return;
+        }
+
+        if (Level.WARN.isGreaterOrEqual(this.getEffectiveLevel())) {
+            forcedLog(FQCN, Level.WARN, message, null);
+        }
+    }
+
+    public void warn(Object message, Throwable t) {
+        if (getRepository().isDisabled(Level.WARN_INT)) {
+            return;
+        }
+        if (Level.WARN.isGreaterOrEqual(this.getEffectiveLevel())) {
+            forcedLog(FQCN, Level.WARN, message, t);
+        }
+    }
+
+    public interface LoggerRepository {
+
+        boolean isDisabled(int level);
+
+        void setLogLevel(Level level);
+
+        void emitNoAppenderWarning(Logger cat);
+
+        Level getLogLevel();
+
+        Logger getLogger(String name);
+
+        Logger getRootLogger();
+
+        Logger exists(String name);
+
+        void shutdown();
+
+        Enumeration getCurrentLoggers();
+    }
+
+    public static class ProvisionNode extends Vector<Logger> {
+
+        ProvisionNode(Logger logger) {
+            super();
+            addElement(logger);
+        }
+    }
+
+    public static class DefaultLoggerRepository implements LoggerRepository {
+
+        final Hashtable<CategoryKey,Object> ht = new Hashtable<>();
+        Logger root;
+
+        int logLevelInt;
+        Level logLevel;
+
+        boolean emittedNoAppenderWarning = false;
+
+        public DefaultLoggerRepository(Logger root) {
+            this.root = root;
+            setLogLevel(Level.ALL);
+        }
+
+        public void emitNoAppenderWarning(Logger cat) {
+            if (!this.emittedNoAppenderWarning) {
+                SysLogger.warn("No appenders could be found for logger (" + cat.getName() + ").");
+                SysLogger.warn("Please initialize the logger system properly.");
+                this.emittedNoAppenderWarning = true;
+            }
+        }
+
+        public Logger exists(String name) {
+            Object o = ht.get(new CategoryKey(name));
+            if (o instanceof Logger) {
+                return (Logger) o;
+            } else {
+                return null;
+            }
+        }
+
+        public void setLogLevel(Level l) {
+            if (l != null) {
+                logLevelInt = l.level;
+                logLevel = l;
+            }
+        }
+
+        public Level getLogLevel() {
+            return logLevel;
+        }
+
+
+        public Logger getLogger(String name) {
+            CategoryKey key = new CategoryKey(name);
+            Logger logger;
+
+            synchronized (ht) {
+                Object o = ht.get(key);
+                if (o == null) {
+                    logger = makeNewLoggerInstance(name);
+                    ht.put(key, logger);
+                    updateParents(logger);
+                    return logger;
+                } else if (o instanceof Logger) {
+                    return (Logger) o;
+                } else if (o instanceof ProvisionNode) {
+                    logger = makeNewLoggerInstance(name);
+                    ht.put(key, logger);
+                    updateChildren((ProvisionNode) o, logger);
+                    updateParents(logger);
+                    return logger;
+                } else {
+                    return null;
+                }
+            }
+        }
+
+        public Logger makeNewLoggerInstance(String name) {
+            return new Logger(name);
+        }
+
+        public Enumeration getCurrentLoggers() {
+            Vector<Logger> loggers = new Vector<>(ht.size());
+
+            Enumeration elems = ht.elements();
+            while (elems.hasMoreElements()) {
+                Object o = elems.nextElement();
+                if (o instanceof Logger) {
+                    Logger logger = (Logger)o;
+                    loggers.addElement(logger);
+                }
+            }
+            return loggers.elements();
+        }
+
+
+        public Logger getRootLogger() {
+            return root;
+        }
+
+        public boolean isDisabled(int level) {
+            return logLevelInt > level;
+        }
+
+
+        public void shutdown() {
+            Logger root = getRootLogger();
+            root.closeNestedAppenders();
+
+            synchronized (ht) {
+                Enumeration cats = this.getCurrentLoggers();
+                while (cats.hasMoreElements()) {
+                    Logger c = (Logger) cats.nextElement();
+                    c.closeNestedAppenders();
+                }
+                root.removeAllAppenders();
+            }
+        }
+
+
+        private void updateParents(Logger cat) {
+            String name = cat.name;
+            int length = name.length();
+            boolean parentFound = false;
+
+            for (int i = name.lastIndexOf('.', length - 1); i >= 0;
+                 i = name.lastIndexOf('.', i - 1)) {
+                String substr = name.substring(0, i);
+
+                CategoryKey key = new CategoryKey(substr);
+                Object o = ht.get(key);
+                if (o == null) {
+                    ht.put(key, new ProvisionNode(cat));
+                } else if (o instanceof Logger) {
+                    parentFound = true;
+                    cat.parent = (Logger) o;
+                    break;
+                } else if (o instanceof ProvisionNode) {
+                    ((ProvisionNode) o).addElement(cat);
+                } else {
+                    Exception e = new IllegalStateException("unexpected object type " + o.getClass() + " in ht.");
+                    e.printStackTrace();
+                }
+            }
+            if (!parentFound) {
+                cat.parent = root;
+            }
+        }
+
+        private void updateChildren(ProvisionNode pn, Logger logger) {
+            final int last = pn.size();
+
+            for (int i = 0; i < last; i++) {
+                Logger l = pn.elementAt(i);
+                if (!l.parent.name.startsWith(logger.name)) {
+                    logger.parent = l.parent;
+                    l.parent = logger;
+                }
+            }
+        }
+
+        private class CategoryKey {
+
+            String name;
+            int hashCache;
+
+            CategoryKey(String name) {
+                this.name = name;
+                hashCache = name.hashCode();
+            }
+
+            final public int hashCode() {
+                return hashCache;
+            }
+
+            final public boolean equals(Object o) {
+                if (this == o) {
+                    return true;
+                }
+
+                if (o != null && o instanceof CategoryKey) {
+                    CategoryKey cc = (CategoryKey) o;
+                    return name.equals(cc.name);
+                } else {
+                    return false;
+                }
+            }
+        }
+
+    }
+
+    public static class RootLogger extends Logger {
+
+        public RootLogger(Level level) {
+            super("root");
+            setLevel(level);
+        }
+    }
+}
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/inner/LoggingBuilder.java b/logging/src/main/java/org/apache/rocketmq/logging/inner/LoggingBuilder.java
new file mode 100644
index 000000000..ea669cfcf
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/inner/LoggingBuilder.java
@@ -0,0 +1,1231 @@
+/*
+ * 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.rocketmq.logging.inner;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FilterWriter;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+public class LoggingBuilder {
+
+    public static final String SYSTEM_OUT = "System.out";
+    public static final String SYSTEM_ERR = "System.err";
+
+    public static final String LOGGING_ENCODING = "rocketmq.logging.inner.encoding";
+    public static final String ENCODING = System.getProperty(LOGGING_ENCODING, "UTF-8");
+
+    public static AppenderBuilder newAppenderBuilder() {
+        return new AppenderBuilder();
+    }
+
+    public static class AppenderBuilder {
+        private AsyncAppender asyncAppender;
+
+        private Appender appender = null;
+
+        private AppenderBuilder() {
+
+        }
+
+        public AppenderBuilder withLayout(Layout layout) {
+            appender.setLayout(layout);
+            return this;
+        }
+
+        public AppenderBuilder withName(String name) {
+            appender.setName(name);
+            return this;
+        }
+
+        public AppenderBuilder withConsoleAppender(String target) {
+            ConsoleAppender consoleAppender = new ConsoleAppender();
+            consoleAppender.setTarget(target);
+            consoleAppender.activateOptions();
+            this.appender = consoleAppender;
+            return this;
+        }
+
+        public AppenderBuilder withFileAppender(String file) {
+            FileAppender appender = new FileAppender();
+            appender.setFile(file);
+            appender.setAppend(true);
+            appender.setBufferedIO(false);
+            appender.setEncoding(ENCODING);
+            appender.setImmediateFlush(true);
+            appender.activateOptions();
+            this.appender = appender;
+            return this;
+        }
+
+        public AppenderBuilder withRollingFileAppender(String file, String maxFileSize, int maxFileIndex) {
+            RollingFileAppender appender = new RollingFileAppender();
+            appender.setFile(file);
+            appender.setAppend(true);
+            appender.setBufferedIO(false);
+            appender.setEncoding(ENCODING);
+            appender.setImmediateFlush(true);
+            appender.setMaximumFileSize(Integer.parseInt(maxFileSize));
+            appender.setMaxBackupIndex(maxFileIndex);
+            appender.activateOptions();
+            this.appender = appender;
+            return this;
+        }
+
+        public AppenderBuilder withDailyFileRollingAppender(String file, String datePattern) {
+            DailyRollingFileAppender appender = new DailyRollingFileAppender();
+            appender.setFile(file);
+            appender.setAppend(true);
+            appender.setBufferedIO(false);
+            appender.setEncoding(ENCODING);
+            appender.setImmediateFlush(true);
+            appender.setDatePattern(datePattern);
+            appender.activateOptions();
+            this.appender = appender;
+            return this;
+        }
+
+        public AppenderBuilder withAsync(boolean blocking, int buffSize) {
+            AsyncAppender asyncAppender = new AsyncAppender();
+            asyncAppender.setBlocking(blocking);
+            asyncAppender.setBufferSize(buffSize);
+            this.asyncAppender = asyncAppender;
+            return this;
+        }
+
+        public Appender build() {
+            if (appender == null) {
+                throw new RuntimeException("please specify appender first");
+            }
+            if (asyncAppender != null) {
+                asyncAppender.addAppender(appender);
+                return asyncAppender;
+            } else {
+                return appender;
+            }
+        }
+    }
+
+    public static class AsyncAppender extends Appender implements Appender.AppenderPipeline {
+
+        public static final int DEFAULT_BUFFER_SIZE = 128;
+
+        private final List<LoggingEvent> buffer = new ArrayList<>();
+
+        private final Map<String, DiscardSummary> discardMap = new HashMap<>();
+
+        private int bufferSize = DEFAULT_BUFFER_SIZE;
+
+        private final AppenderPipelineImpl appenderPipeline;
+
+        private final Thread dispatcher;
+
+        private boolean blocking = true;
+
+        public AsyncAppender() {
+            appenderPipeline = new AppenderPipelineImpl();
+
+            dispatcher = new Thread(new Dispatcher(this, buffer, discardMap, appenderPipeline));
+
+            dispatcher.setDaemon(true);
+
+            dispatcher.setName("AsyncAppender-Dispatcher-" + dispatcher.getName());
+            dispatcher.start();
+        }
+
+        public void addAppender(final Appender newAppender) {
+            synchronized (appenderPipeline) {
+                appenderPipeline.addAppender(newAppender);
+            }
+        }
+
+        public void append(final LoggingEvent event) {
+            if (dispatcher == null || !dispatcher.isAlive() || bufferSize <= 0) {
+                synchronized (appenderPipeline) {
+                    appenderPipeline.appendLoopOnAppenders(event);
+                }
+
+                return;
+            }
+
+            event.getThreadName();
+            event.getRenderedMessage();
+
+            synchronized (buffer) {
+                while (true) {
+                    int previousSize = buffer.size();
+
+                    if (previousSize < bufferSize) {
+                        buffer.add(event);
+
+                        if (previousSize == 0) {
+                            buffer.notifyAll();
+                        }
+
+                        break;
+                    }
+
+                    boolean discard = true;
+                    if (blocking
+                        && !Thread.interrupted()
+                        && Thread.currentThread() != dispatcher) {
+                        try {
+                            buffer.wait();
+                            discard = false;
+                        } catch (InterruptedException e) {
+                            Thread.currentThread().interrupt();
+                        }
+                    }
+                    if (discard) {
+                        String loggerName = event.getLoggerName();
+                        DiscardSummary summary = discardMap.get(loggerName);
+
+                        if (summary == null) {
+                            summary = new DiscardSummary(event);
+                            discardMap.put(loggerName, summary);
+                        } else {
+                            summary.add(event);
+                        }
+
+                        break;
+                    }
+                }
+            }
+        }
+
+        public void close() {
+
+            synchronized (buffer) {
+                closed = true;
+                buffer.notifyAll();
+            }
+
+            try {
+                dispatcher.join();
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                SysLogger.error(
+                    "Got an InterruptedException while waiting for the "
+                        + "dispatcher to finish.", e);
+            }
+
+            synchronized (appenderPipeline) {
+                Enumeration iter = appenderPipeline.getAllAppenders();
+                if (iter != null) {
+                    while (iter.hasMoreElements()) {
+                        Object next = iter.nextElement();
+                        if (next instanceof Appender) {
+                            ((Appender) next).close();
+                        }
+                    }
+                }
+            }
+        }
+
+        public Enumeration getAllAppenders() {
+            synchronized (appenderPipeline) {
+                return appenderPipeline.getAllAppenders();
+            }
+        }
+
+        public Appender getAppender(final String name) {
+            synchronized (appenderPipeline) {
+                return appenderPipeline.getAppender(name);
+            }
+        }
+
+        public boolean isAttached(final Appender appender) {
+            synchronized (appenderPipeline) {
+                return appenderPipeline.isAttached(appender);
+            }
+        }
+
+        public void removeAllAppenders() {
+            synchronized (appenderPipeline) {
+                appenderPipeline.removeAllAppenders();
+            }
+        }
+
+        public void removeAppender(final Appender appender) {
+            synchronized (appenderPipeline) {
+                appenderPipeline.removeAppender(appender);
+            }
+        }
+
+        public void removeAppender(final String name) {
+            synchronized (appenderPipeline) {
+                appenderPipeline.removeAppender(name);
+            }
+        }
+
+        public void setBufferSize(final int size) {
+            if (size < 0) {
+                throw new NegativeArraySizeException("size");
+            }
+
+            synchronized (buffer) {
+                bufferSize = (size < 1) ? 1 : size;
+                buffer.notifyAll();
+            }
+        }
+
+        public int getBufferSize() {
+            return bufferSize;
+        }
+
+        public void setBlocking(final boolean value) {
+            synchronized (buffer) {
+                blocking = value;
+                buffer.notifyAll();
+            }
+        }
+
+        public boolean getBlocking() {
+            return blocking;
+        }
+
+        private final class DiscardSummary {
+
+            private LoggingEvent maxEvent;
+
+            private int count;
+
+            public DiscardSummary(final LoggingEvent event) {
+                maxEvent = event;
+                count = 1;
+            }
+
+            public void add(final LoggingEvent event) {
+                if (event.getLevel().toInt() > maxEvent.getLevel().toInt()) {
+                    maxEvent = event;
+                }
+                count++;
+            }
+
+            public LoggingEvent createEvent() {
+                String msg =
+                    MessageFormat.format(
+                        "Discarded {0} messages due to full event buffer including: {1}",
+                        count, maxEvent.getMessage());
+
+                return new LoggingEvent(
+                    "AsyncAppender.DONT_REPORT_LOCATION",
+                    Logger.getLogger(maxEvent.getLoggerName()),
+                    maxEvent.getLevel(),
+                    msg,
+                    null);
+            }
+        }
+
+        private class Dispatcher implements Runnable {
+
+            private final AsyncAppender parent;
+
+            private final List<LoggingEvent> buffer;
+
+            private final Map<String, DiscardSummary> discardMap;
+
+            private final AppenderPipelineImpl appenderPipeline;
+
+            public Dispatcher(
+                final AsyncAppender parent, final List<LoggingEvent> buffer, final Map<String, DiscardSummary> discardMap,
+                final AppenderPipelineImpl appenderPipeline) {
+
+                this.parent = parent;
+                this.buffer = buffer;
+                this.appenderPipeline = appenderPipeline;
+                this.discardMap = discardMap;
+            }
+
+            public void run() {
+                boolean isActive = true;
+
+                try {
+                    while (isActive) {
+                        LoggingEvent[] events = null;
+
+                        synchronized (buffer) {
+                            int bufferSize = buffer.size();
+                            isActive = !parent.closed;
+
+                            while (bufferSize == 0 && isActive) {
+                                buffer.wait();
+                                bufferSize = buffer.size();
+                                isActive = !parent.closed;
+                            }
+
+                            if (bufferSize > 0) {
+                                events = new LoggingEvent[bufferSize + discardMap.size()];
+                                buffer.toArray(events);
+
+                                int index = bufferSize;
+                                Collection<DiscardSummary> values = discardMap.values();
+                                for (DiscardSummary value : values) {
+                                    events[index++] = value.createEvent();
+                                }
+
+                                buffer.clear();
+                                discardMap.clear();
+
+                                buffer.notifyAll();
+                            }
+                        }
+                        if (events != null) {
+                            for (LoggingEvent event : events) {
+                                synchronized (appenderPipeline) {
+                                    appenderPipeline.appendLoopOnAppenders(event);
+                                }
+                            }
+                        }
+                    }
+                } catch (InterruptedException ex) {
+                    Thread.currentThread().interrupt();
+                }
+            }
+        }
+    }
+
+    private static class QuietWriter extends FilterWriter {
+
+        protected Appender appender;
+
+        public QuietWriter(Writer writer, Appender appender) {
+            super(writer);
+            this.appender = appender;
+        }
+
+        public void write(String string) {
+            if (string != null) {
+                try {
+                    out.write(string);
+                } catch (Exception e) {
+                    appender.handleError("Failed to write [" + string + "].", e,
+                        Appender.CODE_WRITE_FAILURE);
+                }
+            }
+        }
+
+        public void flush() {
+            try {
+                out.flush();
+            } catch (Exception e) {
+                appender.handleError("Failed to flush writer,", e,
+                    Appender.CODE_FLUSH_FAILURE);
+            }
+        }
+    }
+
+    public static class WriterAppender extends Appender {
+
+
+        protected boolean immediateFlush = true;
+
+        protected String encoding;
+
+
+        protected QuietWriter qw;
+
+        public WriterAppender() {
+
+        }
+
+        public void setImmediateFlush(boolean value) {
+            immediateFlush = value;
+        }
+
+
+        public boolean getImmediateFlush() {
+            return immediateFlush;
+        }
+
+        public void activateOptions() {
+        }
+
+
+        public void append(LoggingEvent event) {
+            if (!checkEntryConditions()) {
+                return;
+            }
+            subAppend(event);
+        }
+
+        protected boolean checkEntryConditions() {
+            if (this.closed) {
+                SysLogger.warn("Not allowed to write to a closed appender.");
+                return false;
+            }
+
+            if (this.qw == null) {
+                handleError("No output stream or file set for the appender named [" +
+                    name + "].");
+                return false;
+            }
+
+            if (this.layout == null) {
+                handleError("No layout set for the appender named [" + name + "].");
+                return false;
+            }
+            return true;
+        }
+
+        public synchronized void close() {
+            if (this.closed) {
+                return;
+            }
+            this.closed = true;
+            writeFooter();
+            reset();
+        }
+
+        protected void closeWriter() {
+            if (qw != null) {
+                try {
+                    qw.close();
+                } catch (IOException e) {
+                    handleError("Could not close " + qw, e, CODE_CLOSE_FAILURE);
+                }
+            }
+        }
+
+        protected OutputStreamWriter createWriter(OutputStream os) {
+            OutputStreamWriter retval = null;
+
+            String enc = getEncoding();
+            if (enc != null) {
+                try {
+                    retval = new OutputStreamWriter(os, enc);
+                } catch (IOException e) {
+                    SysLogger.warn("Error initializing output writer.");
+                    SysLogger.warn("Unsupported encoding?");
+                }
+            }
+            if (retval == null) {
+                retval = new OutputStreamWriter(os, StandardCharsets.UTF_8);
+            }
+            return retval;
+        }
+
+        public String getEncoding() {
+            return encoding;
+        }
+
+        public void setEncoding(String value) {
+            encoding = value;
+        }
+
+
+        public synchronized void setWriter(Writer writer) {
+            reset();
+            this.qw = new QuietWriter(writer, this);
+            writeHeader();
+        }
+
+        protected void subAppend(LoggingEvent event) {
+            this.qw.write(this.layout.format(event));
+
+            if (layout.ignoresThrowable()) {
+                String[] s = event.getThrowableStr();
+                if (s != null) {
+                    for (String s1 : s) {
+                        this.qw.write(s1);
+                        this.qw.write(LINE_SEP);
+                    }
+                }
+            }
+
+            if (shouldFlush(event)) {
+                this.qw.flush();
+            }
+        }
+
+        protected void reset() {
+            closeWriter();
+            this.qw = null;
+        }
+
+        protected void writeFooter() {
+            if (layout != null) {
+                String f = layout.getFooter();
+                if (f != null && this.qw != null) {
+                    this.qw.write(f);
+                    this.qw.flush();
+                }
+            }
+        }
+
+        protected void writeHeader() {
+            if (layout != null) {
+                String h = layout.getHeader();
+                if (h != null && this.qw != null) {
+                    this.qw.write(h);
+                }
+            }
+        }
+
+        protected boolean shouldFlush(final LoggingEvent event) {
+            return event != null && immediateFlush;
+        }
+    }
+
+
+    public static class FileAppender extends WriterAppender {
+
+        protected boolean fileAppend = true;
+
+        protected String fileName = null;
+
+        protected boolean bufferedIO = false;
+
+        protected int bufferSize = 8 * 1024;
+
+        public FileAppender() {
+        }
+
+        public FileAppender(Layout layout, String filename, boolean append)
+            throws IOException {
+            this.layout = layout;
+            this.setFile(filename, append, false, bufferSize);
+        }
+
+        public void setFile(String file) {
+            fileName = file.trim();
+        }
+
+        public boolean getAppend() {
+            return fileAppend;
+        }
+
+        public String getFile() {
+            return fileName;
+        }
+
+        public void activateOptions() {
+            if (fileName != null) {
+                try {
+                    setFile(fileName, fileAppend, bufferedIO, bufferSize);
+                } catch (IOException e) {
+                    handleError("setFile(" + fileName + "," + fileAppend + ") call failed.",
+                        e, CODE_FILE_OPEN_FAILURE);
+                }
+            } else {
+                SysLogger.warn("File option not set for appender [" + name + "].");
+                SysLogger.warn("Are you using FileAppender instead of ConsoleAppender?");
+            }
+        }
+
+        protected void closeFile() {
+            if (this.qw != null) {
+                try {
+                    this.qw.close();
+                } catch (IOException e) {
+                    if (e instanceof InterruptedIOException) {
+                        Thread.currentThread().interrupt();
+                    }
+                    SysLogger.error("Could not close " + qw, e);
+                }
+            }
+        }
+
+        public boolean getBufferedIO() {
+            return this.bufferedIO;
+        }
+
+        public int getBufferSize() {
+            return this.bufferSize;
+        }
+
+        public void setAppend(boolean flag) {
+            fileAppend = flag;
+        }
+
+        public void setBufferedIO(boolean bufferedIO) {
+            this.bufferedIO = bufferedIO;
+            if (bufferedIO) {
+                immediateFlush = false;
+            }
+        }
+
+        public void setBufferSize(int bufferSize) {
+            this.bufferSize = bufferSize;
+        }
+
+        public synchronized void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
+            throws IOException {
+            SysLogger.debug("setFile called: " + fileName + ", " + append);
+
+            if (bufferedIO) {
+                setImmediateFlush(false);
+            }
+
+            reset();
+            FileOutputStream ostream;
+            try {
+                ostream = new FileOutputStream(fileName, append);
+            } catch (FileNotFoundException ex) {
+                String parentName = new File(fileName).getParent();
+                if (parentName != null) {
+                    File parentDir = new File(parentName);
+                    if (!parentDir.exists() && parentDir.mkdirs()) {
+                        ostream = new FileOutputStream(fileName, append);
+                    } else {
+                        throw ex;
+                    }
+                } else {
+                    throw ex;
+                }
+            }
+            Writer fw = createWriter(ostream);
+            if (bufferedIO) {
+                fw = new BufferedWriter(fw, bufferSize);
+            }
+            this.setQWForFiles(fw);
+            this.fileName = fileName;
+            this.fileAppend = append;
+            this.bufferedIO = bufferedIO;
+            this.bufferSize = bufferSize;
+            writeHeader();
+            SysLogger.debug("setFile ended");
+        }
+
+        protected void setQWForFiles(Writer writer) {
+            this.qw = new QuietWriter(writer, this);
+        }
+
+        protected void reset() {
+            closeFile();
+            this.fileName = null;
+            super.reset();
+        }
+    }
+
+
+    public static class RollingFileAppender extends FileAppender {
+
+        protected long maxFileSize = 10 * 1024 * 1024;
+
+        protected int maxBackupIndex = 1;
+
+        private long nextRollover = 0;
+
+        public RollingFileAppender() {
+            super();
+        }
+
+        public int getMaxBackupIndex() {
+            return maxBackupIndex;
+        }
+
+        public long getMaximumFileSize() {
+            return maxFileSize;
+        }
+
+        public void rollOver() {
+            File target;
+            File file;
+
+            if (qw != null) {
+                long size = ((CountingQuietWriter) qw).getCount();
+                SysLogger.debug("rolling over count=" + size);
+                nextRollover = size + maxFileSize;
+            }
+            SysLogger.debug("maxBackupIndex=" + maxBackupIndex);
+
+            boolean renameSucceeded = true;
+            if (maxBackupIndex > 0) {
+                file = new File(fileName + '.' + maxBackupIndex);
+                if (file.exists()) {
+                    renameSucceeded = file.delete();
+                }
+
+                for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {
+                    file = new File(fileName + "." + i);
+                    if (file.exists()) {
+                        target = new File(fileName + '.' + (i + 1));
+                        SysLogger.debug("Renaming file " + file + " to " + target);
+                        renameSucceeded = file.renameTo(target);
+                    }
+                }
+
+                if (renameSucceeded) {
+                    target = new File(fileName + "." + 1);
+
+                    this.closeFile(); // keep windows happy.
+
+                    file = new File(fileName);
+                    SysLogger.debug("Renaming file " + file + " to " + target);
+                    renameSucceeded = file.renameTo(target);
+
+                    if (!renameSucceeded) {
+                        try {
+                            this.setFile(fileName, true, bufferedIO, bufferSize);
+                        } catch (IOException e) {
+                            if (e instanceof InterruptedIOException) {
+                                Thread.currentThread().interrupt();
+                            }
+                            SysLogger.error("setFile(" + fileName + ", true) call failed.", e);
+                        }
+                    }
+                }
+            }
+
+            if (renameSucceeded) {
+                try {
+                    this.setFile(fileName, false, bufferedIO, bufferSize);
+                    nextRollover = 0;
+                } catch (IOException e) {
+                    if (e instanceof InterruptedIOException) {
+                        Thread.currentThread().interrupt();
+                    }
+                    SysLogger.error("setFile(" + fileName + ", false) call failed.", e);
+                }
+            }
+        }
+
+        public synchronized void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
+            throws IOException {
+            super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
+            if (append) {
+                File f = new File(fileName);
+                ((CountingQuietWriter) qw).setCount(f.length());
+            }
+        }
+
+        public void setMaxBackupIndex(int maxBackups) {
+            this.maxBackupIndex = maxBackups;
+        }
+
+        public void setMaximumFileSize(long maxFileSize) {
+            this.maxFileSize = maxFileSize;
+        }
+
+        protected void setQWForFiles(Writer writer) {
+            this.qw = new CountingQuietWriter(writer, this);
+        }
+
+        protected void subAppend(LoggingEvent event) {
+            super.subAppend(event);
+            if (fileName != null && qw != null) {
+                long size = ((CountingQuietWriter) qw).getCount();
+                if (size >= maxFileSize && size >= nextRollover) {
+                    rollOver();
+                }
+            }
+        }
+
+        protected class CountingQuietWriter extends QuietWriter {
+
+            protected long count;
+
+            public CountingQuietWriter(Writer writer, Appender appender) {
+                super(writer, appender);
+            }
+
+            public void write(String string) {
+                try {
+                    out.write(string);
+                    count += string.length();
+                } catch (IOException e) {
+                    appender.handleError("Write failure.", e, Appender.CODE_WRITE_FAILURE);
+                }
+            }
+
+            public long getCount() {
+                return count;
+            }
+
+            public void setCount(long count) {
+                this.count = count;
+            }
+
+        }
+    }
+
+
+    public static class DailyRollingFileAppender extends FileAppender {
+
+        static final int TOP_OF_TROUBLE = -1;
+        static final int TOP_OF_MINUTE = 0;
+        static final int TOP_OF_HOUR = 1;
+        static final int HALF_DAY = 2;
+        static final int TOP_OF_DAY = 3;
+        static final int TOP_OF_WEEK = 4;
+        static final int TOP_OF_MONTH = 5;
+
+
+        /**
+         * The date pattern. By default, the pattern is set to
+         * "'.'yyyy-MM-dd" meaning daily rollover.
+         */
+        private String datePattern = "'.'yyyy-MM-dd";
+
+        private String scheduledFilename;
+
+        private long nextCheck = System.currentTimeMillis() - 1;
+
+        Date now = new Date();
+
+        SimpleDateFormat sdf;
+
+        RollingCalendar rc = new RollingCalendar();
+
+        final TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");
+
+
+        public void setDatePattern(String pattern) {
+            datePattern = pattern;
+        }
+
+        public String getDatePattern() {
+            return datePattern;
+        }
+
+        public void activateOptions() {
+            super.activateOptions();
+            if (datePattern != null && fileName != null) {
+                now.setTime(System.currentTimeMillis());
+                sdf = new SimpleDateFormat(datePattern);
+                int type = computeCheckPeriod();
+                printPeriodicity(type);
+                rc.setType(type);
+                File file = new File(fileName);
+                scheduledFilename = fileName + sdf.format(new Date(file.lastModified()));
+
+            } else {
+                SysLogger.error("Either File or DatePattern options are not set for appender [" + name + "].");
+            }
+        }
+
+        void printPeriodicity(int type) {
+            switch (type) {
+                case TOP_OF_MINUTE:
+                    SysLogger.debug("Appender [" + name + "] to be rolled every minute.");
+                    break;
+                case TOP_OF_HOUR:
+                    SysLogger.debug("Appender [" + name + "] to be rolled on top of every hour.");
+                    break;
+                case HALF_DAY:
+                    SysLogger.debug("Appender [" + name + "] to be rolled at midday and midnight.");
+                    break;
+                case TOP_OF_DAY:
+                    SysLogger.debug("Appender [" + name + "] to be rolled at midnight.");
+                    break;
+                case TOP_OF_WEEK:
+                    SysLogger.debug("Appender [" + name + "] to be rolled at start of week.");
+                    break;
+                case TOP_OF_MONTH:
+                    SysLogger.debug("Appender [" + name + "] to be rolled at start of every month.");
+                    break;
+                default:
+                    SysLogger.warn("Unknown periodicity for appender [" + name + "].");
+            }
+        }
+
+        int computeCheckPeriod() {
+            RollingCalendar rollingCalendar = new RollingCalendar(gmtTimeZone, Locale.getDefault());
+            // set sate to 1970-01-01 00:00:00 GMT
+            Date epoch = new Date(0);
+            if (datePattern != null) {
+                for (int i = TOP_OF_MINUTE; i <= TOP_OF_MONTH; i++) {
+                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
+                    simpleDateFormat.setTimeZone(gmtTimeZone);
+                    String r0 = simpleDateFormat.format(epoch);
+                    rollingCalendar.setType(i);
+                    Date next = new Date(rollingCalendar.getNextCheckMillis(epoch));
+                    String r1 = simpleDateFormat.format(next);
+                    if (r0 != null && r1 != null && !r0.equals(r1)) {
+                        return i;
+                    }
+                }
+            }
+            return TOP_OF_TROUBLE;
+        }
+
+        void rollOver() throws IOException {
+
+            if (datePattern == null) {
+                handleError("Missing DatePattern option in rollOver().");
+                return;
+            }
+
+            String datedFilename = fileName + sdf.format(now);
+
+            if (scheduledFilename.equals(datedFilename)) {
+                return;
+            }
+            this.closeFile();
+
+            File target = new File(scheduledFilename);
+            if (target.exists() && !target.delete()) {
+                SysLogger.error("Failed to delete [" + scheduledFilename + "].");
+            }
+
+            File file = new File(fileName);
+            boolean result = file.renameTo(target);
+            if (result) {
+                SysLogger.debug(fileName + " -> " + scheduledFilename);
+            } else {
+                SysLogger.error("Failed to rename [" + fileName + "] to [" + scheduledFilename + "].");
+            }
+
+            try {
+                this.setFile(fileName, true, this.bufferedIO, this.bufferSize);
+            } catch (IOException e) {
+                handleError("setFile(" + fileName + ", true) call failed.");
+            }
+            scheduledFilename = datedFilename;
+        }
+
+        protected void subAppend(LoggingEvent event) {
+            long n = System.currentTimeMillis();
+            if (n >= nextCheck) {
+                now.setTime(n);
+                nextCheck = rc.getNextCheckMillis(now);
+                try {
+                    rollOver();
+                } catch (IOException ioe) {
+                    if (ioe instanceof InterruptedIOException) {
+                        Thread.currentThread().interrupt();
+                    }
+                    SysLogger.error("rollOver() failed.", ioe);
+                }
+            }
+            super.subAppend(event);
+        }
+    }
+
+    private static class RollingCalendar extends GregorianCalendar {
+        private static final long serialVersionUID = -3560331770601814177L;
+
+        int type = DailyRollingFileAppender.TOP_OF_TROUBLE;
+
+        RollingCalendar() {
+            super();
+        }
+
+        RollingCalendar(TimeZone tz, Locale locale) {
+            super(tz, locale);
+        }
+
+        void setType(int type) {
+            this.type = type;
+        }
+
+        public long getNextCheckMillis(Date now) {
+            return getNextCheckDate(now).getTime();
+        }
+
+        public Date getNextCheckDate(Date now) {
+            this.setTime(now);
+
+            switch (type) {
+                case DailyRollingFileAppender.TOP_OF_MINUTE:
+                    this.set(Calendar.SECOND, 0);
+                    this.set(Calendar.MILLISECOND, 0);
+                    this.add(Calendar.MINUTE, 1);
+                    break;
+                case DailyRollingFileAppender.TOP_OF_HOUR:
+                    this.set(Calendar.MINUTE, 0);
+                    this.set(Calendar.SECOND, 0);
+                    this.set(Calendar.MILLISECOND, 0);
+                    this.add(Calendar.HOUR_OF_DAY, 1);
+                    break;
+                case DailyRollingFileAppender.HALF_DAY:
+                    this.set(Calendar.MINUTE, 0);
+                    this.set(Calendar.SECOND, 0);
+                    this.set(Calendar.MILLISECOND, 0);
+                    int hour = get(Calendar.HOUR_OF_DAY);
+                    if (hour < 12) {
+                        this.set(Calendar.HOUR_OF_DAY, 12);
+                    } else {
+                        this.set(Calendar.HOUR_OF_DAY, 0);
+                        this.add(Calendar.DAY_OF_MONTH, 1);
+                    }
+                    break;
+                case DailyRollingFileAppender.TOP_OF_DAY:
+                    this.set(Calendar.HOUR_OF_DAY, 0);
+                    this.set(Calendar.MINUTE, 0);
+                    this.set(Calendar.SECOND, 0);
+                    this.set(Calendar.MILLISECOND, 0);
+                    this.add(Calendar.DATE, 1);
+                    break;
+                case DailyRollingFileAppender.TOP_OF_WEEK:
+                    this.set(Calendar.DAY_OF_WEEK, getFirstDayOfWeek());
+                    this.set(Calendar.HOUR_OF_DAY, 0);
+                    this.set(Calendar.MINUTE, 0);
+                    this.set(Calendar.SECOND, 0);
+                    this.set(Calendar.MILLISECOND, 0);
+                    this.add(Calendar.WEEK_OF_YEAR, 1);
+                    break;
+                case DailyRollingFileAppender.TOP_OF_MONTH:
+                    this.set(Calendar.DATE, 1);
+                    this.set(Calendar.HOUR_OF_DAY, 0);
+                    this.set(Calendar.MINUTE, 0);
+                    this.set(Calendar.SECOND, 0);
+                    this.set(Calendar.MILLISECOND, 0);
+                    this.add(Calendar.MONTH, 1);
+                    break;
+                default:
+                    throw new IllegalStateException("Unknown periodicity type.");
+            }
+            return getTime();
+        }
+    }
+
+    public static class ConsoleAppender extends WriterAppender {
+
+        protected String target = SYSTEM_OUT;
+
+        public ConsoleAppender() {
+        }
+
+        public void setTarget(String value) {
+            String v = value.trim();
+
+            if (SYSTEM_OUT.equalsIgnoreCase(v)) {
+                target = SYSTEM_OUT;
+            } else if (SYSTEM_ERR.equalsIgnoreCase(v)) {
+                target = SYSTEM_ERR;
+            } else {
+                targetWarn(value);
+            }
+        }
+
+        public String getTarget() {
+            return target;
+        }
+
+        void targetWarn(String val) {
+            SysLogger.warn("[" + val + "] should be System.out or System.err.");
+            SysLogger.warn("Using previously set target, System.out by default.");
+        }
+
+        public void activateOptions() {
+            if (target.equals(SYSTEM_ERR)) {
+                setWriter(createWriter(System.err));
+            } else {
+                setWriter(createWriter(System.out));
+            }
+            super.activateOptions();
+        }
+
+        protected final void closeWriter() {
+
+        }
+    }
+
+    public static LayoutBuilder newLayoutBuilder() {
+        return new LayoutBuilder();
+    }
+
+    public static class LayoutBuilder {
+
+        private Layout layout;
+
+        public LayoutBuilder withSimpleLayout() {
+            layout = new SimpleLayout();
+            return this;
+        }
+
+        public LayoutBuilder withDefaultLayout() {
+            layout = new DefaultLayout();
+            return this;
+        }
+
+        public Layout build() {
+            if (layout == null) {
+                layout = new SimpleLayout();
+            }
+            return layout;
+        }
+    }
+
+    public static class SimpleLayout extends Layout {
+
+        @Override
+        public String format(LoggingEvent event) {
+
+            StringBuilder sb = new StringBuilder();
+            sb.append(event.getLevel().toString());
+            sb.append(" - ");
+            sb.append(event.getRenderedMessage());
+            sb.append("\r\n");
+            return sb.toString();
+        }
+
+        @Override
+        public boolean ignoresThrowable() {
+            return false;
+        }
+    }
+
+
+    /**
+     * %d{yyy-MM-dd HH:mm:ss,SSS} %p %c{1}%L - %m%n
+     */
+    public static class DefaultLayout extends Layout {
+        @Override
+        public String format(LoggingEvent event) {
+
+            StringBuilder sb = new StringBuilder();
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
+            String format = simpleDateFormat.format(new Date(event.timeStamp));
+            sb.append(format);
+            sb.append(" ");
+            sb.append(event.getLevel());
+            sb.append(" ");
+            sb.append(event.getLoggerName());
+            sb.append(" - ");
+            sb.append(event.getRenderedMessage());
+            String[] throwableStr = event.getThrowableStr();
+            if (throwableStr != null) {
+                sb.append("\r\n");
+                for (String s : throwableStr) {
+                    sb.append(s);
+                    sb.append("\r\n");
+                }
+            }
+            sb.append("\r\n");
+            return sb.toString();
+        }
+
+        @Override
+        public boolean ignoresThrowable() {
+            return false;
+        }
+    }
+}
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/inner/LoggingEvent.java b/logging/src/main/java/org/apache/rocketmq/logging/inner/LoggingEvent.java
new file mode 100644
index 000000000..06fa6aed9
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/inner/LoggingEvent.java
@@ -0,0 +1,124 @@
+/*
+ * 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.rocketmq.logging.inner;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.io.LineNumberReader;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+
+public class LoggingEvent implements java.io.Serializable {
+
+    transient public final String fqnOfCategoryClass;
+
+    transient private Object message;
+
+    transient private Level level;
+
+    transient private Logger logger;
+
+    private String renderedMessage;
+
+    private String threadName;
+
+    public final long timeStamp;
+
+    private Throwable throwable;
+
+    public LoggingEvent(String fqnOfCategoryClass, Logger logger,
+                        Level level, Object message, Throwable throwable) {
+        this.fqnOfCategoryClass = fqnOfCategoryClass;
+        this.message = message;
+        this.logger = logger;
+        this.throwable = throwable;
+        this.level = level;
+        timeStamp = System.currentTimeMillis();
+    }
+
+    public Object getMessage() {
+        if (message != null) {
+            return message;
+        } else {
+            return getRenderedMessage();
+        }
+    }
+
+    public String getRenderedMessage() {
+        if (renderedMessage == null && message != null) {
+            if (message instanceof String) {
+                renderedMessage = (String) message;
+            } else {
+                renderedMessage = message.toString();
+            }
+            if (renderedMessage != null) {
+                renderedMessage = renderedMessage.replace('\r', ' ').replace('\n', ' ');
+            }
+        }
+        return renderedMessage;
+    }
+
+    public String getThreadName() {
+        if (threadName == null) {
+            threadName = (Thread.currentThread()).getName();
+        }
+        return threadName;
+    }
+
+    public Level getLevel() {
+        return level;
+    }
+
+    public String getLoggerName() {
+        return logger.getName();
+    }
+
+    public String[] getThrowableStr() {
+        if (throwable == null) {
+            return null;
+        }
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        try {
+            throwable.printStackTrace(pw);
+        } catch (RuntimeException ex) {
+            SysLogger.warn("InnerLogger print stack trace error", ex);
+        }
+        pw.flush();
+        LineNumberReader reader = new LineNumberReader(
+            new StringReader(sw.toString()));
+        ArrayList<String> lines = new ArrayList<>();
+        try {
+            String line = reader.readLine();
+            while (line != null) {
+                lines.add(line);
+                line = reader.readLine();
+            }
+        } catch (IOException ex) {
+            if (ex instanceof InterruptedIOException) {
+                Thread.currentThread().interrupt();
+            }
+            lines.add(ex.toString());
+        }
+        String[] tempRep = new String[lines.size()];
+        lines.toArray(tempRep);
+        return tempRep;
+    }
+}
diff --git a/logging/src/main/java/org/apache/rocketmq/logging/inner/SysLogger.java b/logging/src/main/java/org/apache/rocketmq/logging/inner/SysLogger.java
new file mode 100755
index 000000000..b6d104977
--- /dev/null
+++ b/logging/src/main/java/org/apache/rocketmq/logging/inner/SysLogger.java
@@ -0,0 +1,89 @@
+/*
+ * 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.rocketmq.logging.inner;
+
+public class SysLogger {
+
+    protected static boolean debugEnabled = false;
+
+    private static boolean quietMode = false;
+
+    private static final String PREFIX = "RocketMQLog: ";
+    private static final String ERR_PREFIX = "RocketMQLog:ERROR ";
+    private static final String WARN_PREFIX = "RocketMQLog:WARN ";
+
+    public static void setInternalDebugging(boolean enabled) {
+        debugEnabled = enabled;
+    }
+
+    public static void debug(String msg) {
+        if (debugEnabled && !quietMode) {
+            System.out.printf("%s", PREFIX + msg);
+        }
+    }
+
+    public static void debug(String msg, Throwable t) {
+        if (debugEnabled && !quietMode) {
+            System.out.printf("%s", PREFIX + msg);
+            if (t != null) {
+                t.printStackTrace(System.out);
+            }
+        }
+    }
+
+    public static void error(String msg) {
+        if (quietMode) {
+            return;
+        }
+        System.err.println(ERR_PREFIX + msg);
+    }
+
+    public static void error(String msg, Throwable t) {
+        if (quietMode) {
+            return;
+        }
+
+        System.err.println(ERR_PREFIX + msg);
+        if (t != null) {
+            t.printStackTrace();
+        }
+    }
+
+    public static void setQuietMode(boolean quietMode) {
+        SysLogger.quietMode = quietMode;
+    }
+
+    public static void warn(String msg) {
+        if (quietMode) {
+            return;
+        }
+
+        System.err.println(WARN_PREFIX + msg);
+    }
+
+    public static void warn(String msg, Throwable t) {
+        if (quietMode) {
+            return;
+        }
+
+        System.err.println(WARN_PREFIX + msg);
+        if (t != null) {
+            t.printStackTrace();
+        }
+    }
+}
diff --git a/common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java b/logging/src/main/java/org/apache/rocketmq/logging/package-info.java
similarity index 55%
copy from common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java
copy to logging/src/main/java/org/apache/rocketmq/logging/package-info.java
index 8bce59d76..7cb0645de 100644
--- a/common/src/main/java/org/apache/rocketmq/common/AbstractBrokerRunnable.java
+++ b/logging/src/main/java/org/apache/rocketmq/logging/package-info.java
@@ -15,26 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.rocketmq.common;
+package org.apache.rocketmq.logging;
 
-public abstract class AbstractBrokerRunnable implements Runnable {
-    protected final BrokerIdentity brokerIdentity;
-
-    public AbstractBrokerRunnable(BrokerIdentity brokerIdentity) {
-        this.brokerIdentity = brokerIdentity;
-    }
-
-    /**
-     * real logic for running
-     */
-    public abstract void run2();
+/*
+ This package is a minimal logger on the basis of Apache Log4j without
+ file configuration and pattern layout configuration. Main forked files are
+ followed as below:
+ 1. LoggingEvent
+ 2. Logger
+ 3. Layout
+ 4. Level
+ 5. AsyncAppender
+ 6. FileAppender
+ 7. RollingFileAppender
+ 8. DailyRollingFileAppender
+ 9. ConsoleAppender
 
-    @Override
-    public void run() {
-        if (brokerIdentity.isInBrokerContainer()) {
-            // set threadlocal broker identity to forward logging to corresponding broker
-//            InnerLoggerFactory.BROKER_IDENTITY.set(brokerIdentity.getCanonicalName());
-        }
-        run2();
-    }
-}
+ For more information about Apache Log4j, please go to https://github.com/apache/log4j.
+ */
\ No newline at end of file
diff --git a/logging/src/test/java/org/apache/rocketmq/logging/BasicLoggerTest.java b/logging/src/test/java/org/apache/rocketmq/logging/BasicLoggerTest.java
new file mode 100644
index 000000000..c198704de
--- /dev/null
+++ b/logging/src/test/java/org/apache/rocketmq/logging/BasicLoggerTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.rocketmq.logging;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import org.apache.rocketmq.logging.inner.Level;
+import org.apache.rocketmq.logging.inner.Logger;
+import org.apache.rocketmq.logging.inner.LoggingEvent;
+import org.junit.After;
+import org.junit.Before;
+
+public class BasicLoggerTest {
+
+    protected Logger logger = Logger.getLogger("test");
+
+    protected LoggingEvent loggingEvent;
+
+    protected String loggingDir = System.getProperty("user.home") + "/logs/rocketmq-test";
+
+    @Before
+    public void createLoggingEvent() {
+        loggingEvent = new LoggingEvent(Logger.class.getName(), logger, Level.INFO,
+            "junit test error", new RuntimeException("createLogging error"));
+    }
+
+    public String readFile(String file) throws IOException {
+        StringBuilder stringBuilder = new StringBuilder();
+        FileInputStream fileInputStream = new FileInputStream(file);
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
+        String line = bufferedReader.readLine();
+        while (line != null) {
+            stringBuilder.append(line);
+            stringBuilder.append("\r\n");
+            line = bufferedReader.readLine();
+        }
+        bufferedReader.close();
+        return stringBuilder.toString();
+    }
+
+    @After
+    public void clean() {
+        File file = new File(loggingDir);
+        if (file.exists()) {
+            File[] files = file.listFiles();
+            for (File file1 : files) {
+                file1.delete();
+            }
+        }
+    }
+}
diff --git a/logging/src/test/java/org/apache/rocketmq/logging/InnerLoggerFactoryTest.java b/logging/src/test/java/org/apache/rocketmq/logging/InnerLoggerFactoryTest.java
new file mode 100644
index 000000000..2faaabcd6
--- /dev/null
+++ b/logging/src/test/java/org/apache/rocketmq/logging/InnerLoggerFactoryTest.java
@@ -0,0 +1,91 @@
+/*
+ * 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.rocketmq.logging;
+
+import org.apache.rocketmq.logging.inner.Appender;
+import org.apache.rocketmq.logging.inner.Level;
+import org.apache.rocketmq.logging.inner.Logger;
+import org.apache.rocketmq.logging.inner.LoggingBuilder;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+public class InnerLoggerFactoryTest extends BasicLoggerTest {
+
+    private ByteArrayOutputStream byteArrayOutputStream;
+
+    public static final String LOGGER = "ConsoleLogger";
+
+    private PrintStream out;
+
+    @Before
+    public void initLogger() {
+        out = System.out;
+        byteArrayOutputStream = new ByteArrayOutputStream();
+        System.setOut(new PrintStream(byteArrayOutputStream));
+
+        Appender consoleAppender = LoggingBuilder.newAppenderBuilder()
+            .withConsoleAppender(LoggingBuilder.SYSTEM_OUT)
+            .withLayout(LoggingBuilder.newLayoutBuilder().withDefaultLayout().build()).build();
+
+        Logger consoleLogger = Logger.getLogger("ConsoleLogger");
+        consoleLogger.setAdditivity(false);
+        consoleLogger.addAppender(consoleAppender);
+        consoleLogger.setLevel(Level.INFO);
+    }
+
+    @After
+    public void fixConsole() {
+        System.setOut(out);
+    }
+
+    @Test
+    public void testInnerLoggerFactory() {
+        InternalLoggerFactory.setCurrentLoggerType(InternalLoggerFactory.LOGGER_INNER);
+
+        InternalLogger logger1 = InnerLoggerFactory.getLogger(LOGGER);
+        InternalLogger logger = InternalLoggerFactory.getLogger(LOGGER);
+
+        Assert.assertTrue(logger.getName().equals(logger1.getName()));
+
+        InternalLogger logger2 = InnerLoggerFactory.getLogger(InnerLoggerFactoryTest.class);
+        InnerLoggerFactory.InnerLogger logger3 = (InnerLoggerFactory.InnerLogger) logger2;
+
+        logger.info("innerLogger inner info Message");
+        logger.error("innerLogger inner error Message", new RuntimeException());
+        logger.debug("innerLogger inner debug message");
+        logger3.info("innerLogger info message");
+        logger3.error("logback error message");
+        logger3.info("info {}", "hahahah");
+        logger3.warn("warn {}", "hahahah");
+        logger3.warn("logger3 warn");
+        logger3.error("error {}", "hahahah");
+        logger3.debug("debug {}", "hahahah");
+
+        String content = new String(byteArrayOutputStream.toByteArray());
+
+        Assert.assertTrue(content.contains("InnerLoggerFactoryTest"));
+        Assert.assertTrue(content.contains("info"));
+        Assert.assertTrue(content.contains("RuntimeException"));
+        Assert.assertTrue(!content.contains("debug"));
+    }
+}
diff --git a/logging/src/test/java/org/apache/rocketmq/logging/InternalLoggerTest.java b/logging/src/test/java/org/apache/rocketmq/logging/InternalLoggerTest.java
new file mode 100644
index 000000000..50f1dd1c9
--- /dev/null
+++ b/logging/src/test/java/org/apache/rocketmq/logging/InternalLoggerTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.rocketmq.logging;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import org.apache.rocketmq.logging.inner.Appender;
+import org.apache.rocketmq.logging.inner.Level;
+import org.apache.rocketmq.logging.inner.Logger;
+import org.apache.rocketmq.logging.inner.LoggingBuilder;
+import org.apache.rocketmq.logging.inner.SysLogger;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class InternalLoggerTest {
+
+    @Test
+    public void testInternalLogger() {
+        SysLogger.setQuietMode(false);
+        SysLogger.setInternalDebugging(true);
+        PrintStream out = System.out;
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        System.setOut(new PrintStream(byteArrayOutputStream));
+
... 7299 lines suppressed ...