diff --git a/sentinel-extension/pom.xml b/sentinel-extension/pom.xml
index 72bd6d92..6d96dcce 100755
--- a/sentinel-extension/pom.xml
+++ b/sentinel-extension/pom.xml
@@ -22,6 +22,7 @@
sentinel-datasource-spring-cloud-config
sentinel-datasource-consul
sentinel-datasource-etcd
+ sentinel-logging-extension-slf4j
diff --git a/sentinel-extension/sentinel-logging-extension-slf4j/README.md b/sentinel-extension/sentinel-logging-extension-slf4j/README.md
new file mode 100644
index 00000000..6abf29b1
--- /dev/null
+++ b/sentinel-extension/sentinel-logging-extension-slf4j/README.md
@@ -0,0 +1,49 @@
+# Sentinel Logging Extension SLF4J
+
+To use Sentinel Logging Extension SLF4J with Log4j2, you should add the following dependency firstly:
+
+```xml
+
+ com.alibaba.csp
+ sentinel-logging-extension-slf4j
+ x.y.z
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+```
+If you want to use Slf4j with Log4j2, you can add dependencies of Log4j2 and the binding about Log4j2 and SLF4J.
+Then you should provide logging configuration as specification of the logging framework.
+And you can add Sentinel's Loggers that it name is `sentinelRecordLogger` or `sentinelCommandCenterLogger` for your needs. For example:
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
diff --git a/sentinel-extension/sentinel-logging-extension-slf4j/pom.xml b/sentinel-extension/sentinel-logging-extension-slf4j/pom.xml
new file mode 100644
index 00000000..351904bd
--- /dev/null
+++ b/sentinel-extension/sentinel-logging-extension-slf4j/pom.xml
@@ -0,0 +1,60 @@
+
+
+
+ sentinel-parent
+ com.alibaba.csp
+ 1.7.2-SNAPSHOT
+
+ 4.0.0
+
+ sentinel-logging-extension-slf4j
+ jar
+
+
+ 1.7
+ 1.7
+ 1.7.25
+ 2.12.1
+
+
+
+
+ com.alibaba.csp
+ sentinel-transport-common
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+ provided
+
+
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j2.version}
+ test
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ ${log4j2.version}
+ test
+
+
+
+ junit
+ junit
+ test
+
+
+
+ com.github.stefanbirkner
+ system-rules
+ 1.16.1
+ test
+
+
+
+
\ No newline at end of file
diff --git a/sentinel-extension/sentinel-logging-extension-slf4j/src/main/java/com/alibaba/csp/sentinel/logging/slf4j/CommandCenterLogLogger.java b/sentinel-extension/sentinel-logging-extension-slf4j/src/main/java/com/alibaba/csp/sentinel/logging/slf4j/CommandCenterLogLogger.java
new file mode 100644
index 00000000..e1ed4e0f
--- /dev/null
+++ b/sentinel-extension/sentinel-logging-extension-slf4j/src/main/java/com/alibaba/csp/sentinel/logging/slf4j/CommandCenterLogLogger.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed 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 com.alibaba.csp.sentinel.logging.slf4j;
+
+import com.alibaba.csp.sentinel.log.LogTarget;
+import com.alibaba.csp.sentinel.log.Logger;
+import com.alibaba.csp.sentinel.transport.log.CommandCenterLog;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author wavesZh
+ */
+@LogTarget(CommandCenterLog.LOGGER_NAME)
+public class CommandCenterLogLogger implements Logger {
+
+ private final org.slf4j.Logger logger = LoggerFactory.getLogger(CommandCenterLog.LOGGER_NAME);
+
+ @Override
+ public void info(String format, Object... arguments) {
+ logger.info(format, arguments);
+ }
+
+ @Override
+ public void info(String msg, Throwable e) {
+ logger.info(msg, e);
+ }
+
+ @Override
+ public void warn(String format, Object... arguments) {
+ logger.warn(format, arguments);
+ }
+
+ @Override
+ public void warn(String msg, Throwable e) {
+ logger.warn(msg, e);
+ }
+
+ @Override
+ public void trace(String format, Object... arguments) {
+ logger.trace(format, arguments);
+ }
+
+ @Override
+ public void trace(String msg, Throwable e) {
+ logger.trace(msg, e);
+ }
+
+ @Override
+ public void debug(String format, Object... arguments) {
+ logger.debug(format, arguments);
+ }
+
+ @Override
+ public void debug(String msg, Throwable e) {
+ logger.debug(msg, e);
+ }
+
+ @Override
+ public void error(String format, Object... arguments) {
+ logger.error(format, arguments);
+ }
+
+ @Override
+ public void error(String msg, Throwable e) {
+ logger.error(msg, e);
+ }
+
+}
diff --git a/sentinel-extension/sentinel-logging-extension-slf4j/src/main/java/com/alibaba/csp/sentinel/logging/slf4j/RecordLogLogger.java b/sentinel-extension/sentinel-logging-extension-slf4j/src/main/java/com/alibaba/csp/sentinel/logging/slf4j/RecordLogLogger.java
new file mode 100644
index 00000000..f9ffa178
--- /dev/null
+++ b/sentinel-extension/sentinel-logging-extension-slf4j/src/main/java/com/alibaba/csp/sentinel/logging/slf4j/RecordLogLogger.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed 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 com.alibaba.csp.sentinel.logging.slf4j;
+
+import com.alibaba.csp.sentinel.log.LogTarget;
+import com.alibaba.csp.sentinel.log.Logger;
+import com.alibaba.csp.sentinel.log.RecordLog;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author wavesZh
+ */
+@LogTarget(RecordLog.LOGGER_NAME)
+public class RecordLogLogger implements Logger {
+
+ private final org.slf4j.Logger logger = LoggerFactory.getLogger(RecordLog.LOGGER_NAME);
+
+ @Override
+ public void info(String format, Object... arguments) {
+ logger.info(format, arguments);
+ }
+
+ @Override
+ public void info(String msg, Throwable e) {
+ logger.info(msg, e);
+ }
+
+ @Override
+ public void warn(String format, Object... arguments) {
+ logger.warn(format, arguments);
+ }
+
+ @Override
+ public void warn(String msg, Throwable e) {
+ logger.warn(msg, e);
+ }
+
+ @Override
+ public void trace(String format, Object... arguments) {
+ logger.trace(format, arguments);
+ }
+
+ @Override
+ public void trace(String msg, Throwable e) {
+ logger.trace(msg, e);
+ }
+
+ @Override
+ public void debug(String format, Object... arguments) {
+ logger.debug(format, arguments);
+ }
+
+ @Override
+ public void debug(String msg, Throwable e) {
+ logger.debug(msg, e);
+ }
+
+ @Override
+ public void error(String format, Object... arguments) {
+ logger.error(format, arguments);
+ }
+
+ @Override
+ public void error(String msg, Throwable e) {
+ logger.error(msg, e);
+ }
+
+}
diff --git a/sentinel-extension/sentinel-logging-extension-slf4j/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.log.Logger b/sentinel-extension/sentinel-logging-extension-slf4j/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.log.Logger
new file mode 100644
index 00000000..77330c20
--- /dev/null
+++ b/sentinel-extension/sentinel-logging-extension-slf4j/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.log.Logger
@@ -0,0 +1,2 @@
+com.alibaba.csp.sentinel.logging.slf4j.RecordLogLogger
+com.alibaba.csp.sentinel.logging.slf4j.CommandCenterLogLogger
\ No newline at end of file
diff --git a/sentinel-extension/sentinel-logging-extension-slf4j/src/test/java/com/alibaba/csp/sentinel/logging/slf4j/CommandCenterLogTest.java b/sentinel-extension/sentinel-logging-extension-slf4j/src/test/java/com/alibaba/csp/sentinel/logging/slf4j/CommandCenterLogTest.java
new file mode 100644
index 00000000..4df72733
--- /dev/null
+++ b/sentinel-extension/sentinel-logging-extension-slf4j/src/test/java/com/alibaba/csp/sentinel/logging/slf4j/CommandCenterLogTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 1999-2019 Alibaba Group Holding Ltd.
+ *
+ * Licensed 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
+ *
+ * https://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 com.alibaba.csp.sentinel.logging.slf4j;
+
+import com.alibaba.csp.sentinel.transport.log.CommandCenterLog;
+import org.junit.*;
+import org.junit.contrib.java.lang.system.SystemOutRule;
+
+/**
+ * @author xue8
+ */
+@Ignore("https://github.com/stefanbirkner/system-rules/issues/45. You can only run one @Test at a time")
+public class CommandCenterLogTest {
+ @Rule
+ public SystemOutRule log = new SystemOutRule().enableLog();
+
+ @Test
+ public void testLog() {
+ CommandCenterLog.info("init");
+ log.clearLog();
+ int count = 0;
+
+ // info test
+ while (count++ < 1000) {
+ log.clearLog();
+ CommandCenterLog.info("Count {}", count);
+ String str = String.format("INFO sentinelCommandCenterLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+
+ // warn test
+ while (count++ < 2000) {
+ log.clearLog();
+ CommandCenterLog.warn("Count {}", count);
+ String str = String.format("WARN sentinelCommandCenterLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+
+ // trace test
+ while (count++ < 3000) {
+ log.clearLog();
+ CommandCenterLog.trace("Count {}", count);
+ String str = String.format("TRACE sentinelCommandCenterLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+
+ // debug test
+ while (count++ < 4000) {
+ log.clearLog();
+ CommandCenterLog.debug("Count {}", count);
+ String str = String.format("DEBUG sentinelCommandCenterLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+
+ // test error
+ while (count++ < 5000) {
+ log.clearLog();
+ CommandCenterLog.error("Count {}", count);
+ String str = String.format("ERROR sentinelCommandCenterLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+ }
+
+ @Test
+ public void testLogException() {
+ CommandCenterLog.info("init");
+ log.clearLog();
+ Exception e = new Exception("ex");
+
+ // info test
+ CommandCenterLog.info("Error", e);
+ // split the log for test
+ String[] logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("INFO sentinelCommandCenterLogger - Error", logSplit[0]);
+
+ // warn test
+ log.clearLog();
+ CommandCenterLog.warn("Error", e);
+ logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("WARN sentinelCommandCenterLogger - Error", logSplit[0]);
+
+ // trace test
+ log.clearLog();
+ CommandCenterLog.trace("Error", e);
+ logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("TRACE sentinelCommandCenterLogger - Error", logSplit[0]);
+
+ // debug test
+ log.clearLog();
+ CommandCenterLog.debug("Error", e);
+ logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("DEBUG sentinelCommandCenterLogger - Error", logSplit[0]);
+
+ // error test
+ log.clearLog();
+ CommandCenterLog.error("Error", e);
+ logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("ERROR sentinelCommandCenterLogger - Error", logSplit[0]);
+ }
+
+
+}
diff --git a/sentinel-extension/sentinel-logging-extension-slf4j/src/test/java/com/alibaba/csp/sentinel/logging/slf4j/RecordLogTest.java b/sentinel-extension/sentinel-logging-extension-slf4j/src/test/java/com/alibaba/csp/sentinel/logging/slf4j/RecordLogTest.java
new file mode 100644
index 00000000..735691cd
--- /dev/null
+++ b/sentinel-extension/sentinel-logging-extension-slf4j/src/test/java/com/alibaba/csp/sentinel/logging/slf4j/RecordLogTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed 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 com.alibaba.csp.sentinel.logging.slf4j;
+
+import com.alibaba.csp.sentinel.log.RecordLog;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.SystemOutRule;
+
+/**
+ * @author xue8
+ */
+@Ignore("https://github.com/stefanbirkner/system-rules/issues/45. You can only run one @Test at a time")
+public class RecordLogTest {
+ @Rule
+ public SystemOutRule log = new SystemOutRule().enableLog();
+
+ @Test
+ public void testLog() {
+ RecordLog.info("init");
+ log.clearLog();
+ int count = 0;
+
+ // info test
+ while (count++ < 1000) {
+ log.clearLog();
+ RecordLog.info("Count {}", count);
+ String str = String.format("INFO sentinelRecordLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+
+ // warn test
+ while (count++ < 2000) {
+ log.clearLog();
+ RecordLog.warn("Count {}", count);
+ String str = String.format("WARN sentinelRecordLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+
+ // trace test
+ while (count++ < 3000) {
+ log.clearLog();
+ RecordLog.trace("Count {}", count);
+ String str = String.format("TRACE sentinelRecordLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+
+ // debug test
+ while (count++ < 4000) {
+ log.clearLog();
+ RecordLog.debug("Count {}", count);
+ String str = String.format("DEBUG sentinelRecordLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+
+ // test error
+ while (count++ < 5000) {
+ log.clearLog();
+ RecordLog.error("Count {}", count);
+ String str = String.format("ERROR sentinelRecordLogger - Count %d" + System.lineSeparator(), count);
+ Assert.assertEquals(str, log.getLog());
+ }
+ }
+
+
+ @Test
+ public void testLogException() {
+ RecordLog.info("init");
+ log.clearLog();
+ Exception e = new Exception("ex");
+
+ // info test
+ RecordLog.info("Error", e);
+ // split the log for test
+ String[] logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("INFO sentinelRecordLogger - Error", logSplit[0]);
+
+ // warn test
+ log.clearLog();
+ RecordLog.warn("Error", e);
+ logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("WARN sentinelRecordLogger - Error", logSplit[0]);
+
+ // trace test
+ log.clearLog();
+ RecordLog.trace("Error", e);
+ logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("TRACE sentinelRecordLogger - Error", logSplit[0]);
+
+ // debug test
+ log.clearLog();
+ RecordLog.debug("Error", e);
+ logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("DEBUG sentinelRecordLogger - Error", logSplit[0]);
+
+ // error test
+ log.clearLog();
+ RecordLog.error("Error", e);
+ logSplit = log.getLog().split(System.lineSeparator());
+ Assert.assertEquals("ERROR sentinelRecordLogger - Error", logSplit[0]);
+ }
+}
diff --git a/sentinel-extension/sentinel-logging-extension-slf4j/src/test/resources/log4j2.xml b/sentinel-extension/sentinel-logging-extension-slf4j/src/test/resources/log4j2.xml
new file mode 100644
index 00000000..1ce6b195
--- /dev/null
+++ b/sentinel-extension/sentinel-logging-extension-slf4j/src/test/resources/log4j2.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file