pluginResources = resourceWrapper.getResources();
- if (pluginResources == null || pluginResources.isEmpty()) {
+ @Override
+ public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception {
+ if (logRegistry == null) {
return;
}
- logConfigProcess.loadLogConfig(pluginResources, pluginWrapper);
+ logRegistry.unRegistry(pluginRegistryInfo);
}
- @Override
- public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception {
- logConfigProcess.unloadLogConfig(pluginRegistryInfo.getPluginWrapper());
+ /**
+ * 加载日志配置文件资源
+ * 文件路径配置为 file:D://log.xml
+ * resources路径配置为
classpath:log.xml
+ * @param pluginRegistryInfo 当前插件注册的信息
+ * @throws IOException 获取不到配置文件异常
+ **/
+ private Resource getLogConfigFile(PluginRegistryInfo pluginRegistryInfo) throws IOException {
+ GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext();
+ String logConfigLocation = pluginApplicationContext.getEnvironment()
+ .getProperty(PropertyKey.LOG_CONFIG_LOCATION);
+ if (ObjectUtils.isEmpty(logConfigLocation)) {
+ return null;
+ }
+ String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId();
+ String matchLocation = ResourceUtils.getMatchLocation(logConfigLocation);
+ if (matchLocation == null || "".equals(matchLocation)) {
+ LOG.warn("Plugin '{}' not match {}: {}", pluginId, PropertyKey.LOG_CONFIG_LOCATION,
+ logConfigLocation);
+ return null;
+ }
+ if(ResourceUtils.isFile(logConfigLocation)){
+ return new FileSystemResource(matchLocation);
+ } else {
+ return new ClassPathResource(matchLocation, pluginRegistryInfo.getPluginClassLoader());
+ }
}
+
}
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java
new file mode 100644
index 0000000000000000000000000000000000000000..a907a53d694cacd3710e57a17b0d3eed008ddd03
--- /dev/null
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java
@@ -0,0 +1,11 @@
+package com.gitee.starblues.extension.log;
+
+/**
+ * @author zhangzhuo
+ * @version 2.4.3
+ */
+public class PropertyKey {
+
+ public final static String LOG_CONFIG_LOCATION = "plugin.log-config-location";
+
+}
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java
index 37787d63baf4f32157e08dfb20ba832c33723e5a..93cb475eafd74ecba1be70a94ea07fc23409635b 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java
@@ -3,7 +3,6 @@ package com.gitee.starblues.extension.log;
import com.gitee.starblues.extension.AbstractExtension;
import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend;
-import com.gitee.starblues.factory.process.pipe.loader.PluginResourceLoader;
import org.springframework.context.ApplicationContext;
import java.util.ArrayList;
@@ -11,29 +10,41 @@ import java.util.List;
/**
* 日志扩展
- * @author sousouki
+ * @author sousouki starBlues
* @version 2.4.3
*/
public class SpringBootLogExtension extends AbstractExtension {
- public static final String KEY = "SpringBootLogExtension";
+ private static final String KEY = "SpringBootLogExtension";
- @Override
- public String key() {
- return KEY;
+ private final Type type;
+
+ public SpringBootLogExtension(Type type){
+ this.type = type;
}
+
@Override
- public List getPluginResourceLoader() {
- List resourceLoaders = new ArrayList<>();
- resourceLoaders.add(new PluginLogConfigLoader());
- return resourceLoaders;
+ public String key() {
+ return KEY;
}
@Override
- public List getPluginPipeProcessor(ApplicationContext applicationContext) {
+ public List getPluginPipeProcessor(ApplicationContext mainApplicationContext) {
List pipeProcessorExtends = new ArrayList<>();
- pipeProcessorExtends.add(new PluginLogConfigProcessor());
+ pipeProcessorExtends.add(new PluginLogConfigProcessor(type));
return pipeProcessorExtends;
}
+
+ public enum Type{
+ /**
+ * 集成log4j
+ **/
+ LOG4J,
+
+ /**
+ * 集成 logback
+ **/
+ LOGBACK
+ }
}
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/annotation/ConfigItem.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/annotation/ConfigItem.java
index c868a46430ae2a0a30a7532065f3269f138cbfea..38d98117edca3edbadab1c279f4af1763491b646 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/annotation/ConfigItem.java
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/annotation/ConfigItem.java
@@ -6,9 +6,21 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+/**
+ * 配置的默认值注解
+ * @author sousouki
+ * @version 2.4.3
+ */
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigItem {
+
+
+ /**
+ * 默认值
+ * @return String
+ */
String defaultValue() default "";
+
}
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java
index 4f5818738ad5381a0352678030923b6285177441..596d4e9012397179b672f485816ef60069014960 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java
@@ -14,32 +14,73 @@ import javax.xml.bind.annotation.XmlTransient;
@XmlRootElement(name = "log")
public class LogConfig {
+ public static final String ROOT_PLUGIN_SIGN = "~";
+
+ /**
+ * 日志存储根目录,默认为当前插件存放目录。
+ * ~: 符号表示当前插件根目录
+ **/
+ @XmlElement(name = "rootDir")
+ @ConfigItem(defaultValue = ROOT_PLUGIN_SIGN + "/logs/")
+ private String rootDir;
+
+
+ /**
+ * 日志文件名称
+ **/
@XmlElement(name = "fileName")
private String fileName;
- @ConfigItem(defaultValue = "INFO")
+ /**
+ * 日志级别
+ **/
@XmlElement(name = "level")
+ @ConfigItem(defaultValue = "INFO")
private String level;
- @ConfigItem(defaultValue = "10MB")
+ /**
+ * 日志文件最大容量
+ **/
@XmlElement(name = "maxFileSize")
+ @ConfigItem(defaultValue = "10MB")
private String maxFileSize;
- @ConfigItem(defaultValue = "10GB")
+ /**
+ * 日志文件总容量
+ **/
@XmlElement(name = "totalFileSize")
+ @ConfigItem(defaultValue = "10GB")
private String totalFileSize;
- @ConfigItem(defaultValue = "30")
+ /**
+ * 最大保存时间
+ **/
@XmlElement(name = "maxHistory")
+ @ConfigItem(defaultValue = "30")
private Integer maxHistory;
- @ConfigItem(defaultValue = "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p --- [%t] %-40.40logger{39} : %m%n")
+ /**
+ * 日志内容格式
+ **/
@XmlElement(name = "pattern")
+ @ConfigItem(defaultValue = "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p --- [%t] %-40.40logger{39} : %m%n")
private String pattern;
+ /**
+ * 包名, 自定义当前插件的日志包名, 默认为 BasePlugin 实现类的 包名
+ **/
@XmlTransient
private String packageName;
+ @XmlTransient
+ public String getRootDir() {
+ return rootDir;
+ }
+
+ public void setRootDir(String rootDir) {
+ this.rootDir = rootDir;
+ }
+
@XmlTransient
public String getFileName() {
return fileName;
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java
deleted file mode 100644
index ff27d201648634e46c2f5f3360ca9236a68788f4..0000000000000000000000000000000000000000
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.gitee.starblues.extension.log.config;
-
-import java.util.Set;
-
-/**
- * 日志配置
- * @author sousouki
- * @version 2.4.3
- */
-public interface SpringBootLogConfig {
-
- /**
- * 日志xml配置文件的路径
- * @return Set
- */
- Set logConfigLocations();
-}
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java
new file mode 100644
index 0000000000000000000000000000000000000000..c314075af12fa6065153f51580a9bb492318d31d
--- /dev/null
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java
@@ -0,0 +1,209 @@
+package com.gitee.starblues.extension.log.log4j;
+
+import com.gitee.starblues.extension.log.LogRegistry;
+import com.gitee.starblues.extension.log.config.LogConfig;
+import com.gitee.starblues.extension.log.logback.LogbackLogRegistry;
+import com.gitee.starblues.extension.log.util.LogConfigUtil;
+import com.gitee.starblues.factory.PluginRegistryInfo;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.*;
+import org.apache.logging.log4j.core.appender.RollingFileAppender;
+import org.apache.logging.log4j.core.appender.rolling.*;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.DefaultConfiguration;
+import org.apache.logging.log4j.core.config.LoggerConfig;
+import org.apache.logging.log4j.core.filter.AbstractFilter;
+import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.message.Message;
+import org.pf4j.PluginWrapper;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.Resource;
+
+import java.nio.charset.Charset;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 日志注册统一接口
+ * @author starBlues
+ * @version 2.4.3
+ */
+public class Log4jLogRegistry implements LogRegistry {
+
+ private final org.slf4j.Logger log = LoggerFactory.getLogger(LogbackLogRegistry.class);
+ private final Map> pluginAppenderInfo = new ConcurrentHashMap<>();
+
+
+ @Override
+ public void registry(List resources, PluginRegistryInfo pluginRegistryInfo) throws Exception {
+ PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper();
+ LoggerContext loggerContext = (LoggerContext)LogManager.getContext(false);
+ Configuration configuration = loggerContext.getConfiguration();
+ LoggerConfig rootLogger = configuration.getRootLogger();
+ Set allAppender = new HashSet<>();
+ for (Resource resource : resources) {
+ if(resource == null){
+ continue;
+ }
+ LogConfig logConfig;
+ try {
+ logConfig = LogConfigUtil.getLogConfig(resource, pluginRegistryInfo);
+ } catch (Exception e){
+ log.error("Failed to read log configuration.", e);
+ continue;
+ }
+ Set appenderSet = getAppender(pluginRegistryInfo, logConfig);
+ for (Appender appender : appenderSet) {
+ configuration.addAppender(appender);
+ rootLogger.addAppender(appender, Level.toLevel(logConfig.getLevel()), null);
+ allAppender.add(appender);
+ }
+ }
+ pluginAppenderInfo.put(pluginWrapper.getPluginId(), allAppender);
+ }
+
+
+ private Set getAppender(PluginRegistryInfo pluginRegistryInfo, LogConfig logConfig){
+ PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper();
+ Filter filter = new LogFilter(pluginRegistryInfo.getBasePlugin().scanPackage());
+ PatternLayout patternLayout = PatternLayout.newBuilder()
+ .withPattern(logConfig.getPattern())
+ .withCharset(Charset.defaultCharset())
+ .build();
+
+ final TriggeringPolicy policy =
+ CompositeTriggeringPolicy.createPolicy(
+ SizeBasedTriggeringPolicy.createPolicy(
+ logConfig.getMaxFileSize()
+ ),
+ TimeBasedTriggeringPolicy.createPolicy("1", "true")
+ );
+
+ RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder()
+ .withFileIndex(logConfig.getTotalFileSize())
+ .withConfig(new DefaultConfiguration())
+ .withMax(String.valueOf(logConfig.getMaxHistory()))
+ .build();
+
+ RollingFileAppender appender = RollingFileAppender.newBuilder()
+ .withFilter(filter)
+ .withName(pluginWrapper.getPluginId())
+ .withLayout(patternLayout)
+ .withIgnoreExceptions(false)
+ .withFileName(LogConfigUtil.getLogFile(pluginRegistryInfo, logConfig).concat(".log"))
+ .withFilePattern(".%d{yyyy-MM-dd}-%i.log")
+ .withAppend(true)
+ .withPolicy(policy)
+ .withStrategy(strategy)
+ .build();
+
+ appender.start();
+ filter.start();
+
+ return Collections.singleton(appender);
+ }
+
+ @Override
+ public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception {
+ Set allAppender = pluginAppenderInfo.get(pluginRegistryInfo.getPluginWrapper().getPluginId());
+ if(allAppender == null || allAppender.isEmpty()){
+ return;
+ }
+ LoggerContext loggerContext = (LoggerContext)LogManager.getContext(false);
+ Configuration configuration = loggerContext.getConfiguration();
+ for (Appender appender : allAppender) {
+ configuration.getAppenders().remove(appender.getName());
+ }
+ }
+
+ private static class LogFilter extends AbstractFilter{
+
+ private final String packageName;
+
+ private LogFilter(String packageName) {
+ this.packageName = packageName;
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7, Object p8, Object p9) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(LogEvent event) {
+ return filter(event.getLoggerName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object... params) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7) {
+ return filter(logger.getName());
+ }
+
+ @Override
+ public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7, Object p8) {
+ return filter(logger.getName());
+ }
+
+ private Result filter(String loggerName){
+ if (loggerName.startsWith(packageName)) {
+ return Result.ACCEPT;
+ }
+ return Result.DENY;
+ }
+ }
+
+
+
+}
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java
similarity index 40%
rename from springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java
rename to springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java
index 0c7fa912c48368bfb0166658799b4c94887f43b0..d81d723cc387a62018d2ee52fd603bd6d596d79c 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java
@@ -1,254 +1,185 @@
-package com.gitee.starblues.extension.log.util;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.ConsoleAppender;
-import ch.qos.logback.core.filter.Filter;
-import ch.qos.logback.core.rolling.RollingFileAppender;
-import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
-import ch.qos.logback.core.spi.FilterReply;
-import ch.qos.logback.core.util.FileSize;
-import ch.qos.logback.core.util.OptionHelper;
-import com.gitee.starblues.extension.log.annotation.ConfigItem;
-import com.gitee.starblues.extension.log.config.LogConfig;
-import org.pf4j.PluginWrapper;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.io.Resource;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 日志配置处理者
- * @author sousouki
- * @version 2.4.3
- */
-public class LogConfigProcess {
-
- private org.slf4j.Logger log = LoggerFactory.getLogger(LogConfigProcess.class);
-
- private final Map pluginLogMap = new HashMap<>();
-
- private static LogConfigProcess instance = null;
-
- private LogConfigProcess() {
- }
-
- public static LogConfigProcess getInstance() {
- if (instance == null) {
- synchronized (LogConfigProcess.class) {
- if (instance == null) {
- instance = new LogConfigProcess();
- }
- }
- }
- return instance;
- }
-
- public void loadLogConfig(List resources, PluginWrapper pluginWrapper) {
- for (Resource resource : resources) {
- String configText;
- try {
- configText = readConfigText(resource);
- } catch (IOException e) {
- log.error("Failed to read log configuration.", e);
- return;
- }
- LogConfig logConfig;
- try {
- logConfig = (LogConfig) xml2object(configText);
- } catch (Exception e) {
- log.error("", e);
- return;
- }
- checkLogConfig(logConfig, pluginWrapper.getPluginId());
- String pluginClass = pluginWrapper.getDescriptor().getPluginClass();
- String packageName = pluginClass.substring(0, pluginClass.lastIndexOf("."));
- splitPluginLog(pluginWrapper, logConfig, packageName);
- String pluginId = pluginWrapper.getPluginId();
- logConfig.setPattern(packageName);
- pluginLogMap.put(pluginId, logConfig);
- }
- }
-
- public void unloadLogConfig(PluginWrapper pluginWrapper) {
- pluginLogMap.remove(pluginWrapper.getPluginId());
- }
-
- private void splitPluginLog(PluginWrapper pluginWrapper, LogConfig logConfig, String packageName) {
- LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
- Logger logger = context.getLogger(packageName);
- logger.detachAndStopAllAppenders();
-
- ConsoleAppender consoleAppender = createConsoleAppender(pluginWrapper, logConfig, packageName);
- RollingFileAppender fileAppender = createFileAppender(pluginWrapper, logConfig, packageName);
-
- logger.setAdditive(false);
- logger.setLevel(Level.toLevel(logConfig.getLevel()));
- logger.addAppender(consoleAppender);
- logger.addAppender(fileAppender);
- }
-
- private ConsoleAppender createConsoleAppender(PluginWrapper pluginWrapper, LogConfig logConfig, String packageName) {
- LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
- ConsoleAppender appender = new ConsoleAppender<>();
- Filter filter = new LogFilter(packageName);
- filter.start();
- appender.addFilter(filter);
- appender.setContext(context);
- appender.setName(pluginWrapper.getPluginId().concat("-console"));
-
- PatternLayoutEncoder encoder = new PatternLayoutEncoder();
- encoder.setContext(context);
- encoder.setPattern(logConfig.getPattern());
- encoder.start();
-
- appender.setEncoder(encoder);
- appender.start();
- return appender;
- }
-
- private RollingFileAppender createFileAppender(PluginWrapper pluginWrapper, LogConfig logConfig, String packageName) {
- LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
- RollingFileAppender appender = new RollingFileAppender<>();
- Filter filter = new LogFilter(packageName);
- filter.start();
-
- appender.addFilter(filter);
-
- appender.setContext(context);
- appender.setName(pluginWrapper.getPluginId().concat("-file"));
-
- String fileName = logConfig.getFileName();
- if (fileName == null || "".equals(fileName)) {
- fileName = pluginWrapper.getPluginId();
- }
-
- String home = pluginWrapper.getPluginPath().toString();
- String logPrefix = home.concat("/logs/").concat(pluginWrapper.getPluginId()).concat("/").concat(fileName);
- appender.setFile(OptionHelper.substVars(logPrefix.concat(".log"), context));
-
- appender.setAppend(true);
- appender.setPrudent(false);
-
- SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy<>();
-
- String fp = OptionHelper.substVars(logPrefix.concat(".%d{yyyy-MM-dd}%i.log"), context);
- policy.setMaxFileSize(FileSize.valueOf(logConfig.getMaxFileSize()));
- policy.setFileNamePattern(fp);
- policy.setMaxHistory(logConfig.getMaxHistory());
- policy.setTotalSizeCap(FileSize.valueOf(logConfig.getTotalFileSize()));
- policy.setParent(appender);
- policy.setContext(context);
- policy.start();
-
- PatternLayoutEncoder encoder = new PatternLayoutEncoder();
- encoder.setContext(context);
- encoder.setPattern(logConfig.getPattern());
- encoder.start();
-
- appender.setRollingPolicy(policy);
- appender.setEncoder(encoder);
- appender.start();
- return appender;
- }
-
- private static class LogFilter extends Filter {
-
- private final String packageName;
- private final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
-
- private LogFilter(String packageName) {
- this.packageName = packageName;
- }
-
- @Override
- public FilterReply decide(ILoggingEvent event) {
- Logger logger = loggerContext.getLogger(packageName);
- if (event.getLoggerName().startsWith(packageName) && event.getLevel().isGreaterOrEqual(logger.getLevel())) {
- return FilterReply.ACCEPT;
- }
- return FilterReply.DENY;
- }
- }
-
- private void checkLogConfig(LogConfig logConfig, String pluginId) {
- String fileName = logConfig.getFileName();
- if (fileName == null || "".equals(fileName)) {
- logConfig.setFileName(pluginId.concat("Log"));
- }
- Field[] fields = LogConfig.class.getDeclaredFields();
- Arrays.stream(fields).forEach(field -> {
- if (!field.isAccessible()) {
- field.setAccessible(true);
- }
- ConfigItem configItem = field.getDeclaredAnnotation(ConfigItem.class);
- if (configItem == null) {
- return;
- }
- try {
- Object fieldValue = field.get(logConfig);
- if(fieldValue == null){
- return;
- }
- Class> fieldType = field.getType();
- if ("".equals(fieldValue.toString()) || ObjectUtil.isEmptyObject(fieldType, fieldValue)) {
- String defaultValue = configItem.defaultValue();
- log.debug("Field {} is not config or invalid in log config of plugin {}, set it to default value {}.", field.getName(), defaultValue, pluginId);
- Object fixedValue = ObjectUtil.parseBasicTypeValue(fieldType, defaultValue);
- field.set(logConfig, fixedValue);
- }
- } catch (IllegalAccessException e) {
- log.error("Failed to check config item {} in log config.", field.getName());
- }
- });
- }
-
- public Map getPluginLogMap() {
- return pluginLogMap;
- }
-
- private String readConfigText(Resource resource) throws IOException {
- String fileContent;
- try (InputStream inputStream = resource.getInputStream();
- ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
- byte[] buff = new byte[1024];
- int len;
- while ((len = inputStream.read(buff)) != -1) {
- baos.write(buff, 0, len);
- }
- byte[] data = baos.toByteArray();
- fileContent = new String(data);
- }
- return fileContent;
- }
-
- private Object xml2object(String xml) throws Exception {
- Object object;
- try {
- System.out.println(xml);
- JAXBContext context = JAXBContext.newInstance(LogConfig.class);
- Unmarshaller unmarshaller = context.createUnmarshaller();
- StringReader stringReader = new StringReader(xml);
- object = unmarshaller.unmarshal(stringReader);
- } catch (JAXBException e) {
- e.printStackTrace();
- throw new Exception("Invalid xml definition", e);
- }
- return object;
- }
-
-}
+package com.gitee.starblues.extension.log.logback;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.ConsoleAppender;
+import ch.qos.logback.core.filter.Filter;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
+import ch.qos.logback.core.spi.FilterReply;
+import ch.qos.logback.core.util.FileSize;
+import ch.qos.logback.core.util.OptionHelper;
+import com.gitee.starblues.extension.log.LogRegistry;
+import com.gitee.starblues.extension.log.config.LogConfig;
+import com.gitee.starblues.extension.log.util.LogConfigUtil;
+import com.gitee.starblues.factory.PluginRegistryInfo;
+import org.pf4j.PluginWrapper;
+import org.pf4j.util.StringUtils;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.Resource;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 日志配置处理者
+ * @author sousouki
+ * @version 2.4.3
+ */
+public class LogbackLogRegistry implements LogRegistry {
+
+ private final org.slf4j.Logger log = LoggerFactory.getLogger(LogbackLogRegistry.class);
+
+ private final Map>> pluginAppenderInfo = new ConcurrentHashMap<>();
+
+ @Override
+ public void registry(List resources, PluginRegistryInfo pluginRegistryInfo) throws Exception {
+ Set> appenderSet = new HashSet<>();
+ PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper();
+ for (Resource resource : resources) {
+ if(resource == null){
+ continue;
+ }
+ LogConfig logConfig;
+ try {
+ logConfig = LogConfigUtil.getLogConfig(resource, pluginRegistryInfo);
+ } catch (Exception e){
+ log.error("Failed to read log configuration.", e);
+ continue;
+ }
+ Set> logAppenderSet = addAppender(pluginRegistryInfo, logConfig);
+ appenderSet.addAll(logAppenderSet);
+ }
+ pluginAppenderInfo.put(pluginWrapper.getPluginId(), appenderSet);
+ }
+
+ @Override
+ public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception {
+ PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper();
+ Set> logAppenderSet = pluginAppenderInfo.get(pluginWrapper.getPluginId());
+ if(logAppenderSet == null || logAppenderSet.isEmpty()){
+ return;
+ }
+ String packageName = pluginRegistryInfo.getBasePlugin().scanPackage();
+ LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+ Logger logger = context.getLogger(packageName);
+ for (Appender appender : logAppenderSet) {
+ logger.detachAppender(appender);
+ }
+ pluginAppenderInfo.remove(pluginWrapper.getPluginId());
+ }
+
+ private Set> addAppender(PluginRegistryInfo pluginRegistryInfo, LogConfig logConfig) {
+ LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+ String packageName = logConfig.getPackageName();
+ Logger logger = context.getLogger(packageName);
+ logger.detachAndStopAllAppenders();
+
+ ConsoleAppender consoleAppender = createConsoleAppender(pluginRegistryInfo.getPluginWrapper(),
+ logConfig, packageName);
+ RollingFileAppender fileAppender = createFileAppender(pluginRegistryInfo,
+ logConfig, packageName);
+
+ logger.setAdditive(false);
+ logger.setLevel(Level.toLevel(logConfig.getLevel()));
+ logger.addAppender(consoleAppender);
+ logger.addAppender(fileAppender);
+
+ Set> appenderSet = new HashSet<>();
+ appenderSet.add(consoleAppender);
+ appenderSet.add(fileAppender);
+ return appenderSet;
+ }
+
+ private ConsoleAppender createConsoleAppender(PluginWrapper pluginWrapper,
+ LogConfig logConfig,
+ String packageName) {
+ LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+ ConsoleAppender appender = new ConsoleAppender<>();
+ Filter filter = new LogFilter(packageName);
+ filter.start();
+ appender.addFilter(filter);
+ appender.setContext(context);
+ appender.setName(pluginWrapper.getPluginId().concat("-console"));
+
+ PatternLayoutEncoder encoder = new PatternLayoutEncoder();
+ encoder.setContext(context);
+ encoder.setPattern(logConfig.getPattern());
+ encoder.start();
+
+ appender.setEncoder(encoder);
+ appender.start();
+ return appender;
+ }
+
+ private RollingFileAppender createFileAppender(PluginRegistryInfo pluginRegistryInfo,
+ LogConfig logConfig,
+ String packageName) {
+ LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+
+ RollingFileAppender appender = new RollingFileAppender<>();
+ if(StringUtils.isNotNullOrEmpty(packageName)){
+ Filter filter = new LogFilter(packageName);
+ filter.start();
+ appender.addFilter(filter);
+ }
+
+ PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper();
+ appender.setContext(context);
+ appender.setName(pluginWrapper.getPluginId());
+
+ String logFilePrefix = LogConfigUtil.getLogFile(pluginRegistryInfo, logConfig);
+ appender.setFile(OptionHelper.substVars(logFilePrefix.concat(".log"), context));
+
+ appender.setAppend(true);
+ appender.setPrudent(false);
+
+ SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy<>();
+
+ String fp = OptionHelper.substVars(logFilePrefix.concat(".%d{yyyy-MM-dd}-%i.log"), context);
+ policy.setMaxFileSize(FileSize.valueOf(logConfig.getMaxFileSize()));
+ policy.setFileNamePattern(fp);
+ policy.setMaxHistory(logConfig.getMaxHistory());
+ policy.setTotalSizeCap(FileSize.valueOf(logConfig.getTotalFileSize()));
+ policy.setParent(appender);
+ policy.setContext(context);
+ policy.start();
+
+ PatternLayoutEncoder encoder = new PatternLayoutEncoder();
+ encoder.setContext(context);
+ encoder.setPattern(logConfig.getPattern());
+ encoder.start();
+
+ appender.setRollingPolicy(policy);
+ appender.setEncoder(encoder);
+ appender.start();
+ return appender;
+ }
+
+ private static class LogFilter extends Filter {
+
+ private final String packageName;
+ private final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
+
+ private LogFilter(String packageName) {
+ this.packageName = packageName;
+ }
+
+ @Override
+ public FilterReply decide(ILoggingEvent event) {
+ Logger logger = loggerContext.getLogger(packageName);
+ if (event.getLoggerName().startsWith(packageName) && event.getLevel().isGreaterOrEqual(logger.getLevel())) {
+ return FilterReply.ACCEPT;
+ }
+ return FilterReply.DENY;
+ }
+ }
+
+}
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5fcdab7639584067f2208616b1fed1cceb9eea4
--- /dev/null
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java
@@ -0,0 +1,136 @@
+package com.gitee.starblues.extension.log.util;
+
+import com.gitee.starblues.extension.log.annotation.ConfigItem;
+import com.gitee.starblues.extension.log.config.LogConfig;
+import com.gitee.starblues.factory.PluginRegistryInfo;
+import com.gitee.starblues.integration.IntegrationConfiguration;
+import com.gitee.starblues.utils.CommonUtils;
+import org.pf4j.PluginWrapper;
+import org.pf4j.RuntimeMode;
+import org.pf4j.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.Resource;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.lang.reflect.Field;
+
+/**
+ * LogConfig 对象和 xml 映射的工具类
+ * @author starBlues
+ * @version 2.4.3
+ */
+public class LogConfigUtil {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LogConfigUtil.class);
+
+
+ public static LogConfig getLogConfig(Resource xmlResource, PluginRegistryInfo pluginRegistryInfo)
+ throws Exception{
+ PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper();
+ String configText = readConfigText(xmlResource);
+ LogConfig logConfig = (LogConfig) xml2object(configText);
+ checkLogConfig(logConfig, pluginWrapper.getPluginId());
+ String packageName = logConfig.getPackageName();
+ if(StringUtils.isNullOrEmpty(packageName)){
+ logConfig.setPackageName(pluginRegistryInfo.getBasePlugin().scanPackage());
+ }
+ return logConfig;
+ }
+
+
+ public static String getLogFile(PluginRegistryInfo pluginRegistryInfo, LogConfig logConfig){
+ String rootDir = logConfig.getRootDir();
+ String home;
+ PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper();
+ IntegrationConfiguration configuration = pluginRegistryInfo.getConfiguration();
+ String pluginRootDir;
+ RuntimeMode runtimeMode = pluginWrapper.getRuntimeMode();
+ if(runtimeMode == RuntimeMode.DEVELOPMENT){
+ pluginRootDir = pluginWrapper.getPluginPath().toString();
+ } else {
+ pluginRootDir = configuration.pluginPath();
+ }
+ if(StringUtils.isNullOrEmpty(rootDir)){
+ home = CommonUtils.joiningFilePath(pluginRootDir, "logs");
+ } else {
+ if(rootDir.startsWith(LogConfig.ROOT_PLUGIN_SIGN)){
+ // 如果root路径中开始存在ROOT_PLUGIN_SIGN,则说明进行插件根路替换
+ home = rootDir.replaceFirst("\\" + LogConfig.ROOT_PLUGIN_SIGN, "");
+ home = CommonUtils.joiningFilePath(pluginRootDir, home);
+ } else {
+ home = rootDir;
+ }
+ }
+ String fileName = logConfig.getFileName();
+ if (StringUtils.isNullOrEmpty(fileName)) {
+ fileName = pluginWrapper.getPluginId();
+ }
+ return CommonUtils.joiningFilePath(home, pluginWrapper.getPluginId(), fileName);
+ }
+
+ private static void checkLogConfig(LogConfig logConfig, String pluginId) {
+ String fileName = logConfig.getFileName();
+ if (StringUtils.isNullOrEmpty(fileName)) {
+ logConfig.setFileName(pluginId.concat("-log"));
+ }
+ Field[] fields = LogConfig.class.getDeclaredFields();
+ for (Field field : fields) {
+ if (!field.isAccessible()) {
+ field.setAccessible(true);
+ }
+ ConfigItem configItem = field.getDeclaredAnnotation(ConfigItem.class);
+ if (configItem == null) {
+ continue;
+ }
+ try {
+ Object fieldValue = field.get(logConfig);
+ Class> fieldType = field.getType();
+ if (fieldValue == null || "".equals(fieldValue.toString()) ||
+ ObjectUtil.isEmptyObject(fieldType, fieldValue)) {
+ String defaultValue = configItem.defaultValue();
+ LOG.debug("Field {} is not config or invalid in log config of plugin {}, set it to default value {}.", field.getName(), defaultValue, pluginId);
+ Object fixedValue = ObjectUtil.parseBasicTypeValue(fieldType, defaultValue);
+ field.set(logConfig, fixedValue);
+ }
+ } catch (IllegalAccessException e) {
+ LOG.error("Failed to check config item {} in log config.", field.getName());
+ }
+ }
+ }
+
+ private static String readConfigText(Resource resource) throws IOException {
+ String fileContent;
+ try (InputStream inputStream = resource.getInputStream();
+ ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
+ byte[] buff = new byte[1024];
+ int len;
+ while ((len = inputStream.read(buff)) != -1) {
+ stream.write(buff, 0, len);
+ }
+ byte[] data = stream.toByteArray();
+ fileContent = new String(data);
+ }
+ return fileContent;
+ }
+
+ private static Object xml2object(String xml) throws Exception {
+ Object object;
+ try {
+ JAXBContext context = JAXBContext.newInstance(LogConfig.class);
+ Unmarshaller unmarshaller = context.createUnmarshaller();
+ StringReader stringReader = new StringReader(xml);
+ object = unmarshaller.unmarshal(stringReader);
+ } catch (JAXBException e) {
+ e.printStackTrace();
+ throw new Exception("Invalid xml definition");
+ }
+ return object;
+ }
+}
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md
index 5bfc4fb383df33b787d24919bdeebed1c63587f5..382c251a351c2ce621dfbb4313f7950318f01d2f 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md
@@ -211,7 +211,7 @@ public void oneselfConfig(Config config){
## 版本说明
-### `2.4.2-RELEASE` 版本
+### `2.4.3-RELEASE` 版本
1. 新增`Mybatis`、`Mybatis-Plus`、`Tk-Mybatis`扩展新增可重写覆盖主程序的配置(重写后会当前插件私有, 不影响主程序)
2. 修复`Mybatis-Plus`批量插入的bug
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml
index 52067942e1eb3e984a9dabd033c4aa944ccedd15..b5229c067cc89f04326ae19384249c1e5bd7c655 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml
@@ -13,7 +13,7 @@
com.gitee.starblues
springboot-plugin-framework-extension-mybatis
- 2.4.2-RELEASE
+ 2.4.3-RELEASE
jar
插件扩展-spring boot mybatis 集成扩展
@@ -64,7 +64,7 @@
3.1.0
1.6
- 2.4.2-RELEASE
+ 2.4.3-RELEASE
2.0.1
3.4.1
2.1.5
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisCommonConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisCommonConfig.java
index 5b629518c5c5229129c5c90328631597a5cc8bed..3cbdad79a62c2406b7e6af490bb9b53d9b75c55f 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisCommonConfig.java
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisCommonConfig.java
@@ -21,9 +21,9 @@ public interface MybatisCommonConfig {
* * 匹配零个或多个字符
* ** 匹配路径中的零或多个目录
* 例如:
- * 文件路径配置为 file: D://xml/*PluginMapper.xml
- * resources路径配置为
classpath: xml/mapper/*PluginMapper.xml
- * 包路径配置为
package: com.plugin.xml.mapper.*PluginMapper.xml
+ * 文件路径配置为
file:D://xml/*PluginMapper.xml
+ * resources路径配置为
classpath:xml/mapper/*PluginMapper.xml
+ * 包路径配置为
package:com.plugin.xml.mapper.*PluginMapper.xml
* @return Set
*/
Set xmlLocationsMatch();
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md
index 1e9b69b00c85cc4dc1ec092fb7d396ee83bb2539..7bd65b0fd0c91937f2aaf9b5f5f5cc257ce91515 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md
@@ -104,7 +104,7 @@ public class ResourceConfig implements SpringBootThymeleafConfig {
## 版本说明
-### `2.4.2-RELEASE` 版本
+### `2.4.3-RELEASE` 版本
1. 修复静态资源无法访问的bug
#### `2.4.0-RELEASE` 版本
diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml
index 2b13e49ffb027d632493aba979e130a54a106b0a..f6c455388057231093e8209cc9bd1931bbf4ac49 100644
--- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml
+++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml
@@ -13,7 +13,7 @@
com.gitee.starblues
springboot-plugin-framework-extension-resources
- 2.4.2-RELEASE
+ 2.4.3-RELEASE
jar
插件扩展-通过url读取插件中的静态资源
@@ -69,9 +69,11 @@
5.0.7.RELEASE
4.0.1
- 2.4.2-RELEASE
+ 2.4.3-RELEASE
2.0.3.RELEASE
2.1.1.RELEASE
+
+ 4.11