@@ -22,6 +22,7 @@ | |||
<module>sentinel-datasource-spring-cloud-config</module> | |||
<module>sentinel-datasource-consul</module> | |||
<module>sentinel-datasource-etcd</module> | |||
<module>sentinel-logging-extension-slf4j</module> | |||
</modules> | |||
</project> |
@@ -0,0 +1,49 @@ | |||
# Sentinel Logging Extension SLF4J | |||
To use Sentinel Logging Extension SLF4J with Log4j2, you should add the following dependency firstly: | |||
```xml | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-logging-extension-slf4j</artifactId> | |||
<version>x.y.z</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.slf4j</groupId> | |||
<artifactId>slf4j-api</artifactId> | |||
<version>${slf4j.version}</version> | |||
</dependency> | |||
``` | |||
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 | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<Configuration> | |||
<Appenders> | |||
<Console name="Console" target="SYSTEM_OUT"> | |||
<PatternLayout pattern="%-5level %logger - %msg%n"/> | |||
</Console> | |||
<File name="FILE" fileName="sentinel-record.log" append="false"> | |||
<PatternLayout pattern="%-5level %logger - %msg%n"/> | |||
</File> | |||
<File name="FILE2" fileName="sentinel-command-center.log" append="false"> | |||
<PatternLayout pattern="%-5level %logger - %msg%n"/> | |||
</File> | |||
</Appenders> | |||
<Loggers> | |||
<Root level="info"/> | |||
<logger name="sentinelRecordLogger" level="trace"> | |||
<appender-ref ref="Console" /> | |||
<appender-ref ref="FILE" /> | |||
</logger> | |||
<logger name="sentinelCommandCenterLogger" level="trace"> | |||
<appender-ref ref="Console" /> | |||
<appender-ref ref="FILE2" /> | |||
</logger> | |||
</Loggers> | |||
</Configuration> | |||
``` | |||
@@ -0,0 +1,60 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<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> | |||
<artifactId>sentinel-parent</artifactId> | |||
<groupId>com.alibaba.csp</groupId> | |||
<version>1.7.2-SNAPSHOT</version> | |||
</parent> | |||
<modelVersion>4.0.0</modelVersion> | |||
<artifactId>sentinel-logging-extension-slf4j</artifactId> | |||
<packaging>jar</packaging> | |||
<properties> | |||
<java.source.version>1.7</java.source.version> | |||
<java.target.version>1.7</java.target.version> | |||
<slf4j.version>1.7.25</slf4j.version> | |||
<log4j2.version>2.12.1</log4j2.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-transport-common</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.slf4j</groupId> | |||
<artifactId>slf4j-api</artifactId> | |||
<version>${slf4j.version}</version> | |||
<scope>provided</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.logging.log4j</groupId> | |||
<artifactId>log4j-core</artifactId> | |||
<version>${log4j2.version}</version> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.logging.log4j</groupId> | |||
<artifactId>log4j-slf4j-impl</artifactId> | |||
<version>${log4j2.version}</version> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>junit</groupId> | |||
<artifactId>junit</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.github.stefanbirkner</groupId> | |||
<artifactId>system-rules</artifactId> | |||
<version>1.16.1</version> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -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); | |||
} | |||
} |
@@ -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); | |||
} | |||
} |
@@ -0,0 +1,2 @@ | |||
com.alibaba.csp.sentinel.logging.slf4j.RecordLogLogger | |||
com.alibaba.csp.sentinel.logging.slf4j.CommandCenterLogLogger |
@@ -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]); | |||
} | |||
} |
@@ -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]); | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<Configuration> | |||
<Appenders> | |||
<Console name="Console" target="SYSTEM_OUT"> | |||
<PatternLayout pattern="%-5level %logger - %msg%n"/> | |||
</Console> | |||
<File name="FILE" fileName="sentinel-record.log" append="false"> | |||
<PatternLayout pattern="%-5level %logger - %msg%n"/> | |||
</File> | |||
<File name="FILE2" fileName="sentinel-command-center.log" append="false"> | |||
<PatternLayout pattern="%-5level %logger - %msg%n"/> | |||
</File> | |||
</Appenders> | |||
<Loggers> | |||
<Root level="info"/> | |||
<logger name="sentinelRecordLogger" level="trace"> | |||
<appender-ref ref="Console" /> | |||
<appender-ref ref="FILE" /> | |||
</logger> | |||
<logger name="sentinelCommandCenterLogger" level="trace"> | |||
<appender-ref ref="Console" /> | |||
<appender-ref ref="FILE2" /> | |||
</logger> | |||
</Loggers> | |||
</Configuration> |