Introduce logging extension: slf4j (#1344)
This commit is contained in:
parent
8f0cb2d24a
commit
1eee2c80b4
|
|
@ -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>
|
||||
Loading…
Reference in New Issue