Переглянути джерело

Introduce logging extension: slf4j (#1344)

master
tao.zhang GitHub 4 роки тому
джерело
коміт
1eee2c80b4
Не вдалося знайти GPG ключ що відповідає даному підпису Ідентифікатор GPG ключа: 4AEE18F83AFDEB23
9 змінених файлів з 532 додано та 0 видалено
  1. +1
    -0
      sentinel-extension/pom.xml
  2. +49
    -0
      sentinel-extension/sentinel-logging-extension-slf4j/README.md
  3. +60
    -0
      sentinel-extension/sentinel-logging-extension-slf4j/pom.xml
  4. +81
    -0
      sentinel-extension/sentinel-logging-extension-slf4j/src/main/java/com/alibaba/csp/sentinel/logging/slf4j/CommandCenterLogLogger.java
  5. +81
    -0
      sentinel-extension/sentinel-logging-extension-slf4j/src/main/java/com/alibaba/csp/sentinel/logging/slf4j/RecordLogLogger.java
  6. +2
    -0
      sentinel-extension/sentinel-logging-extension-slf4j/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.log.Logger
  7. +115
    -0
      sentinel-extension/sentinel-logging-extension-slf4j/src/test/java/com/alibaba/csp/sentinel/logging/slf4j/CommandCenterLogTest.java
  8. +118
    -0
      sentinel-extension/sentinel-logging-extension-slf4j/src/test/java/com/alibaba/csp/sentinel/logging/slf4j/RecordLogTest.java
  9. +25
    -0
      sentinel-extension/sentinel-logging-extension-slf4j/src/test/resources/log4j2.xml

+ 1
- 0
sentinel-extension/pom.xml Переглянути файл

@@ -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>

+ 49
- 0
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
<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>
```



+ 60
- 0
sentinel-extension/sentinel-logging-extension-slf4j/pom.xml Переглянути файл

@@ -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>

+ 81
- 0
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);
}

}

+ 81
- 0
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);
}

}

+ 2
- 0
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

+ 115
- 0
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]);
}


}

+ 118
- 0
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]);
}
}

+ 25
- 0
sentinel-extension/sentinel-logging-extension-slf4j/src/test/resources/log4j2.xml Переглянути файл

@@ -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>

Завантаження…
Відмінити
Зберегти