Skip to content
This repository was archived by the owner on Jan 13, 2025. It is now read-only.

Commit a3894ab

Browse files
Release/v0.2.2 (#18)
* [feat][*][0.2.2]: support bbc log print * [doc][*][0.2.2]: update README.md about bbc log * [feat][*][*]: add interceptor to log request trace --------- Co-authored-by: dawn-to-dusk <[email protected]>
1 parent 072727c commit a3894ab

File tree

13 files changed

+230
-71
lines changed

13 files changed

+230
-71
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,24 @@ systemctl status plugin-server.service
202202
203203
日志文件存储在`log`目录之下。
204204
205+
## 插件
206+
207+
将你的插件放在配置`pluginserver.plugin.repo`的路径之下,然后启动插件服务即可加载所有插件。
208+
209+
插件运行中使用`BBCLogger`打印的日志,比如[这里](https://github.com/AntChainOpenLabs/AntChainBridgePluginSDK/blob/604c5b97305ee77cfa1e14454f5b99f1f905f6ea/pluginset/ethereum/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum/EthereumBBCService.java#L74),插件服务将会按照插件的`product`和BBCService对象的`domain`,打印到不同文件`logs/bbc/${product}/${domain}`,比如下面`product`为`simple-ethereum`和域名为`domainB`的日志文件。
210+
211+
```
212+
logs/
213+
├── antchain-bridge-pluginserver
214+
│   ├── application.log
215+
│   └── error.log
216+
└── bbc
217+
└── simple-ethereum
218+
└── domainB.log
219+
220+
3 directories, 3 files
221+
```
222+
205223
## 运行测试
206224
207225
在运行测试之前,请使用`ps-bootstrap/src/main/resources/scripts/init_tls_certs.sh`生成证书,并将`server.key`和`server.crt` 放到`ps-bootstrap/src/test/resources`之下,运行下述命令即可运行测试用例:

pom.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>2.5.8</version>
8+
<version>2.7.16</version>
99
<relativePath/>
1010
</parent>
1111
<packaging>pom</packaging>
@@ -19,22 +19,24 @@
1919

2020
<properties>
2121
<java.version>8</java.version>
22-
<pluginserver.version>0.2.1</pluginserver.version>
22+
<pluginserver.version>0.2.2</pluginserver.version>
2323
<grpc-starter.version>2.13.1.RELEASE</grpc-starter.version>
2424
<netty-tcnative-boringssl-static.version>2.0.59.Final</netty-tcnative-boringssl-static.version>
2525
<protobuf.version>3.19.1</protobuf.version>
2626
<protobuf-plugin.version>0.6.1</protobuf-plugin.version>
2727
<grpc.version>1.42.2</grpc.version>
2828
<jakarta.annotation-api.version>1.3.5</jakarta.annotation-api.version>
2929
<junit.version>4.13.2</junit.version>
30-
<antchain-bridge.sdk.version>0.1.2</antchain-bridge.sdk.version>
30+
<antchain-bridge.sdk.version>0.2.1</antchain-bridge.sdk.version>
3131
<jline.version>3.3.0</jline.version>
3232
<groovy.version>3.0.17</groovy.version>
3333
<commons-cli.version>1.5.0</commons-cli.version>
3434
<hutool.version>5.8.10</hutool.version>
3535
<fastjson.version>1.2.83_noneautotype</fastjson.version>
3636
<pf4j.version>3.8.0</pf4j.version>
3737
<slf4j.version>1.7.28</slf4j.version>
38+
<jetty.alpnAgent.version>2.0.0</jetty.alpnAgent.version>
39+
<jetty.alpnAgent.path>${settings.localRepository}/org/mortbay/jetty/alpn/jetty-alpn-agent/${jetty.alpnAgent.version}/jetty-alpn-agent-${jetty.alpnAgent.version}.jar</jetty.alpnAgent.path>
3840
</properties>
3941

4042
<repositories>
@@ -49,7 +51,7 @@
4951

5052
<groupId>com.alipay.antchain.bridge</groupId>
5153
<artifactId>antchain-bridge-pluginserver</artifactId>
52-
<version>0.2.1</version>
54+
<version>0.2.2</version>
5355

5456
<name>antchain-bridge-pluginserver</name>
5557
<description>antchain-bridge-pluginserver</description>
@@ -215,8 +217,7 @@
215217
<artifactId>maven-surefire-plugin</artifactId>
216218
<version>3.0.0-M5</version>
217219
<configuration>
218-
<excludes>
219-
</excludes>
220+
<argLine>-javaagent:${jetty.alpnAgent.path}</argLine>
220221
</configuration>
221222
</plugin>
222223
</plugins>

ps-bootstrap/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.alipay.antchain.bridge</groupId>
88
<artifactId>antchain-bridge-pluginserver</artifactId>
9-
<version>0.2.1</version>
9+
<version>0.2.2</version>
1010
</parent>
1111

1212
<artifactId>ps-bootstrap</artifactId>

ps-bootstrap/src/main/java/com/alipay/antchain/bridge/pluginserver/config/PluginManagerConfiguration.java

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,59 +16,27 @@
1616

1717
package com.alipay.antchain.bridge.pluginserver.config;
1818

19-
import cn.hutool.core.collection.ListUtil;
19+
import java.io.IOException;
20+
import java.net.InetAddress;
21+
import java.net.InetSocketAddress;
22+
2023
import cn.hutool.core.util.StrUtil;
21-
import com.alipay.antchain.bridge.pluginserver.pluginmanager.IPluginManagerWrapper;
22-
import com.alipay.antchain.bridge.pluginserver.pluginmanager.PluginManagerWrapperImpl;
2324
import com.alipay.antchain.bridge.pluginserver.server.PluginManagementServiceImpl;
2425
import io.grpc.Server;
2526
import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder;
2627
import lombok.extern.slf4j.Slf4j;
27-
import org.pf4j.ClassLoadingStrategy;
2828
import org.springframework.beans.factory.annotation.Autowired;
2929
import org.springframework.beans.factory.annotation.Value;
3030
import org.springframework.context.annotation.Bean;
3131
import org.springframework.context.annotation.Configuration;
3232

33-
import java.io.IOException;
34-
import java.net.InetAddress;
35-
import java.net.InetSocketAddress;
36-
import java.util.HashMap;
37-
import java.util.HashSet;
38-
import java.util.Map;
39-
import java.util.Set;
40-
4133
@Configuration
4234
@Slf4j
4335
public class PluginManagerConfiguration {
44-
@Value("${pluginserver.plugin.repo}")
45-
private String pluginPath;
4636

47-
@Value("${pluginserver.plugin.policy.classloader.resource.ban-with-prefix.APPLICATION}")
48-
private String[] resourceBannedPrefixOnAppLevel;
49-
50-
@Value("${pluginserver.managerserver.host}")
37+
@Value("${pluginserver.managerserver.host:localhost}")
5138
private String managementHost;
5239

53-
@Bean
54-
public IPluginManagerWrapper pluginManagerWrapper() {
55-
return new PluginManagerWrapperImpl(
56-
pluginPath,
57-
convertPathPrefixBannedMap(resourceBannedPrefixOnAppLevel)
58-
);
59-
}
60-
61-
private Map<ClassLoadingStrategy.Source, Set<String>> convertPathPrefixBannedMap(
62-
String[] resourceBannedPrefixOnAppLevel
63-
) {
64-
Map<ClassLoadingStrategy.Source, Set<String>> result = new HashMap<>();
65-
66-
Set<String> appSet = new HashSet<>(ListUtil.of(resourceBannedPrefixOnAppLevel));
67-
result.put(ClassLoadingStrategy.Source.APPLICATION, appSet);
68-
69-
return result;
70-
}
71-
7240
@Value("${pluginserver.managerserver.port}")
7341
private String pluginServerMgrPort;
7442

ps-bootstrap/src/main/resources/logback-spring.xml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,35 @@
8585
</filter>
8686
</appender>
8787

88+
<appender name="reqTraceAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
89+
<file>${logging.path}/${APP_NAME}/req_trace.log</file>
90+
<encoder>
91+
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
92+
%msg%n
93+
</pattern>
94+
<charset>UTF-8</charset>
95+
</encoder>
96+
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
97+
<FileNamePattern>${logging.path}/${APP_NAME}/req_trace.log.%d{yyyy-MM-dd}.%i</FileNamePattern>
98+
<maxHistory>7</maxHistory>
99+
<maxFileSize>50MB</maxFileSize>
100+
<totalSizeCap>500MB</totalSizeCap>
101+
<cleanHistoryOnStart>true</cleanHistoryOnStart>
102+
</rollingPolicy>
103+
</appender>
104+
<appender name="full-req-trace" class="ch.qos.logback.classic.AsyncAppender">
105+
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
106+
<discardingThreshold>0</discardingThreshold>
107+
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
108+
<queueSize>256</queueSize>
109+
<!-- 添加附加的appender,最多只能添加一个 -->
110+
<appender-ref ref="reqTraceAppender"/>
111+
</appender>
112+
113+
<logger name="req-trace" level="INFO" additivity="false">
114+
<appender-ref ref="full-req-trace"/>
115+
</logger>
116+
88117
<root level="INFO">
89118
<appender-ref ref="CONSOLE"/>
90119
<appender-ref ref="full-application"/>

ps-cli/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.alipay.antchain.bridge</groupId>
88
<artifactId>antchain-bridge-pluginserver</artifactId>
9-
<version>0.2.1</version>
9+
<version>0.2.2</version>
1010
</parent>
1111

1212
<artifactId>ps-cli</artifactId>

ps-pluginmanager/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.alipay.antchain.bridge</groupId>
88
<artifactId>antchain-bridge-pluginserver</artifactId>
9-
<version>0.2.1</version>
9+
<version>0.2.2</version>
1010
</parent>
1111

1212
<artifactId>ps-pluginmanager</artifactId>

ps-pluginmanager/src/main/java/com/alipay/antchain/bridge/pluginserver/pluginmanager/PluginManagerWrapperImpl.java

Lines changed: 126 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,88 @@
1616

1717
package com.alipay.antchain.bridge.pluginserver.pluginmanager;
1818

19+
import java.nio.charset.StandardCharsets;
20+
import java.nio.file.Path;
21+
import java.nio.file.Paths;
22+
import java.util.*;
23+
import java.util.stream.Collectors;
24+
25+
import ch.qos.logback.classic.AsyncAppender;
26+
import ch.qos.logback.classic.Level;
27+
import ch.qos.logback.classic.LoggerContext;
28+
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
29+
import ch.qos.logback.classic.spi.ILoggingEvent;
30+
import ch.qos.logback.core.rolling.RollingFileAppender;
31+
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
32+
import ch.qos.logback.core.util.FileSize;
33+
import cn.hutool.core.collection.ListUtil;
1934
import cn.hutool.core.util.ObjectUtil;
35+
import cn.hutool.core.util.StrUtil;
2036
import com.alipay.antchain.bridge.commons.core.base.CrossChainDomain;
2137
import com.alipay.antchain.bridge.plugins.manager.AntChainBridgePluginManagerFactory;
2238
import com.alipay.antchain.bridge.plugins.manager.core.IAntChainBridgePlugin;
2339
import com.alipay.antchain.bridge.plugins.manager.core.IAntChainBridgePluginManager;
2440
import com.alipay.antchain.bridge.plugins.spi.bbc.IBBCService;
2541
import lombok.extern.slf4j.Slf4j;
2642
import org.pf4j.ClassLoadingStrategy;
27-
28-
import java.nio.file.Paths;
29-
import java.util.HashMap;
30-
import java.util.List;
31-
import java.util.Map;
32-
import java.util.Set;
33-
import java.util.stream.Collectors;
43+
import org.slf4j.Logger;
44+
import org.slf4j.LoggerFactory;
45+
import org.springframework.beans.factory.annotation.Autowired;
46+
import org.springframework.beans.factory.annotation.Value;
47+
import org.springframework.stereotype.Component;
3448

3549
@Slf4j
50+
@Component
3651
public class PluginManagerWrapperImpl implements IPluginManagerWrapper {
3752

3853
private final IAntChainBridgePluginManager manager;
3954

40-
public PluginManagerWrapperImpl(String path, Map<ClassLoadingStrategy.Source, Set<String>> pathPrefixBannedMap) {
55+
private final String bbcLoggerDir;
56+
57+
@Value("${pluginserver.plugin.log.bbc.max_history:3}")
58+
private int maxBBCLogHistory;
59+
60+
@Value("${pluginserver.plugin.log.bbc.max_file_size:30mb}")
61+
private String maxBBCLogFileSize;
62+
63+
@Value("${pluginserver.plugin.log.bbc.level:info}")
64+
private String bbcLogLevel;
65+
66+
@Value("${pluginserver.plugin.log.bbc.on:true}")
67+
private boolean isBBCLogOn;
68+
69+
private final Map<String, Logger> bbcLoggerMap = new HashMap<>();
70+
71+
@Autowired
72+
public PluginManagerWrapperImpl(
73+
@Value("${pluginserver.plugin.repo}") String path,
74+
@Value("${logging.file.path}") String appLogDir,
75+
@Value("${pluginserver.plugin.policy.classloader.resource.ban-with-prefix.APPLICATION:}") String[] resourceBannedPrefixOnAppLevel
76+
) {
4177
log.info("plugins path: {}", Paths.get(path).toAbsolutePath());
42-
manager = AntChainBridgePluginManagerFactory.createPluginManager(path, ObjectUtil.defaultIfNull(pathPrefixBannedMap, new HashMap<>()));
78+
79+
this.bbcLoggerDir = Paths.get(appLogDir, "bbc").toAbsolutePath().toString();
80+
log.info("bbc logger base dir: {}", Paths.get(bbcLoggerDir).toAbsolutePath());
81+
82+
this.manager = AntChainBridgePluginManagerFactory.createPluginManager(
83+
path,
84+
ObjectUtil.defaultIfNull(convertPathPrefixBannedMap(resourceBannedPrefixOnAppLevel), new HashMap<>())
85+
);
4386
loadPlugins();
4487
startPlugins();
4588
}
4689

90+
private Map<ClassLoadingStrategy.Source, Set<String>> convertPathPrefixBannedMap(
91+
String[] resourceBannedPrefixOnAppLevel
92+
) {
93+
Map<ClassLoadingStrategy.Source, Set<String>> result = new HashMap<>();
94+
95+
Set<String> appSet = new HashSet<>(ListUtil.of(resourceBannedPrefixOnAppLevel));
96+
result.put(ClassLoadingStrategy.Source.APPLICATION, appSet);
97+
98+
return result;
99+
}
100+
47101
@Override
48102
public void loadPlugins() {
49103
manager.loadPlugins();
@@ -101,7 +155,7 @@ public List<String> allSupportProducts() {
101155

102156
@Override
103157
public IBBCService createBBCService(String product, String domain) {
104-
return manager.createBBCService(product, new CrossChainDomain(domain));
158+
return manager.createBBCService(product, new CrossChainDomain(domain), createBBCServiceLogger(product, domain));
105159
}
106160

107161
@Override
@@ -118,4 +172,66 @@ public boolean hasDomain(String domain) {
118172
public List<String> allRunningDomains() {
119173
return manager.allRunningDomains().stream().map(CrossChainDomain::toString).collect(Collectors.toList());
120174
}
175+
176+
private Logger createBBCServiceLogger(String product, String domain) {
177+
if (!isBBCLogOn) {
178+
return null;
179+
}
180+
String loggerName = getLoggerName(product, domain);
181+
if (bbcLoggerMap.containsKey(loggerName) && ObjectUtil.isNotNull(bbcLoggerMap.get(loggerName))) {
182+
return bbcLoggerMap.get(loggerName);
183+
}
184+
Path logFile = Paths.get(bbcLoggerDir, product, domain + ".log");
185+
Logger logger = LoggerFactory.getLogger(loggerName);
186+
if (logger instanceof ch.qos.logback.classic.Logger) {
187+
log.debug("using logback for bbc logger");
188+
189+
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
190+
191+
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
192+
encoder.setContext(context);
193+
encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n");
194+
encoder.setCharset(StandardCharsets.UTF_8);
195+
encoder.start();
196+
197+
SizeAndTimeBasedRollingPolicy rollingPolicy = new SizeAndTimeBasedRollingPolicy<>();
198+
rollingPolicy.setContext(context);
199+
rollingPolicy.setFileNamePattern(logFile + ".%d{yyyy-MM-dd}.%i");
200+
rollingPolicy.setMaxHistory(maxBBCLogHistory);
201+
rollingPolicy.setMaxFileSize(FileSize.valueOf(maxBBCLogFileSize));
202+
203+
RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
204+
appender.setContext(context);
205+
appender.setEncoder(encoder);
206+
appender.setFile(logFile.toString());
207+
appender.setRollingPolicy(rollingPolicy);
208+
209+
rollingPolicy.setParent(appender);
210+
rollingPolicy.start();
211+
appender.start();
212+
213+
AsyncAppender asyncAppender = new AsyncAppender();
214+
asyncAppender.setContext(context);
215+
asyncAppender.setName(loggerName);
216+
asyncAppender.addAppender(appender);
217+
asyncAppender.start();
218+
219+
ch.qos.logback.classic.Logger loggerLogback = (ch.qos.logback.classic.Logger) logger;
220+
loggerLogback.setLevel(Level.toLevel(bbcLogLevel));
221+
loggerLogback.setAdditive(false);
222+
loggerLogback.addAppender(asyncAppender);
223+
224+
bbcLoggerMap.put(loggerName, loggerLogback);
225+
log.info("bbc logger {} created", loggerName);
226+
227+
return loggerLogback;
228+
}
229+
230+
log.debug("logger library not support for now");
231+
return null;
232+
}
233+
234+
private String getLoggerName(String product, String domain) {
235+
return StrUtil.format("{}::{}", product, domain);
236+
}
121237
}

ps-server/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.alipay.antchain.bridge</groupId>
88
<artifactId>antchain-bridge-pluginserver</artifactId>
9-
<version>0.2.1</version>
9+
<version>0.2.2</version>
1010
</parent>
1111

1212
<artifactId>ps-server</artifactId>

0 commit comments

Comments
 (0)