1616
1717package 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 ;
1934import cn .hutool .core .util .ObjectUtil ;
35+ import cn .hutool .core .util .StrUtil ;
2036import com .alipay .antchain .bridge .commons .core .base .CrossChainDomain ;
2137import com .alipay .antchain .bridge .plugins .manager .AntChainBridgePluginManagerFactory ;
2238import com .alipay .antchain .bridge .plugins .manager .core .IAntChainBridgePlugin ;
2339import com .alipay .antchain .bridge .plugins .manager .core .IAntChainBridgePluginManager ;
2440import com .alipay .antchain .bridge .plugins .spi .bbc .IBBCService ;
2541import lombok .extern .slf4j .Slf4j ;
2642import 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
3651public 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}
0 commit comments