diff --git a/README.cn.md b/README.cn.md index 7b5bc43..abcfa1b 100644 --- a/README.cn.md +++ b/README.cn.md @@ -8,7 +8,7 @@ MilvusPlus -> 🔥🔥🔥[MilvusPlus](https://milvusplus.cn/)(简称 MP)是一个 [Milvus](https://milvus.io) 的操作工具,旨在简化与 Milvus 向量数据库的交互,为开发者提供类似 MyBatis-Plus 注解和方法调用风格的直观 API,提高效率而生。 +> 🔥🔥🔥[MilvusPlus](https://milvus-plus.dromara.org)(简称 MP)是一个 [Milvus](https://milvus.io) 的操作工具,旨在简化与 Milvus 向量数据库的交互,为开发者提供类似 MyBatis-Plus 注解和方法调用风格的直观 API,提高效率而生。 ## 特性 @@ -31,7 +31,7 @@ org.dromara.milvus-plus milvus-plus-core - 2.2.3 + 2.2.4 ``` @@ -41,7 +41,7 @@ Spring应用支持: org.dromara.milvus-plus milvus-plus-boot-starter - 2.2.3 + 2.2.4 ``` @@ -51,7 +51,7 @@ Solon应用支持: org.dromara.milvus-plus milvus-plus-solon-plugin - 2.2.3 + 2.2.4 ``` diff --git a/README.md b/README.md index da9ab88..d081e37 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ MilvusPlus -> 🔥🔥🔥 [MilvusPlus](https://milvusplus.cn/) (short for MP) is an operational tool for [Milvus](https://milvus.io), designed to simplify interactions with the Milvus vector database, providing developers with an intuitive API similar to MyBatis-Plus annotations and method call style, born to improve efficiency. +> 🔥🔥🔥 [MilvusPlus](https://milvus-plus.dromara.org) (short for MP) is an operational tool for [Milvus](https://milvus.io), designed to simplify interactions with the Milvus vector database, providing developers with an intuitive API similar to MyBatis-Plus annotations and method call style, born to improve efficiency. ## Features @@ -29,7 +29,7 @@ Custom extension support: org.dromara.milvus-plus milvus-plus-core - 2.2.3 + 2.2.4 ``` @@ -39,7 +39,7 @@ Spring application support: org.dromara.milvus-plus milvus-plus-boot-starter - 2.2.3 + 2.2.4 ``` @@ -49,7 +49,7 @@ Solon application support: org.dromara.milvus-plus milvus-plus-solon-plugin - 2.2.3 + 2.2.4 ``` diff --git a/milvus-plus-core/pom.xml b/milvus-plus-core/pom.xml index acf4224..d72260d 100644 --- a/milvus-plus-core/pom.xml +++ b/milvus-plus-core/pom.xml @@ -28,7 +28,7 @@ io.milvus milvus-sdk-java - 2.5.2 + 2.5.5 org.apache.logging.log4j diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogAdapterFactory.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogAdapterFactory.java new file mode 100644 index 0000000..48d5496 --- /dev/null +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogAdapterFactory.java @@ -0,0 +1,43 @@ +package org.dromara.milvus.plus.log; + +import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.ServiceLoader; + +public class LogAdapterFactory { + private static volatile LogFrameworkAdapter cachedAdapter; + + public static LogFrameworkAdapter getAdapter() { + if (cachedAdapter == null) { + synchronized (LogAdapterFactory.class) { + if (cachedAdapter == null) { + ServiceLoader loader = ServiceLoader.load(LogFrameworkAdapter.class); + List adapters = new ArrayList<>(); + + for (LogFrameworkAdapter adapter : loader) { + if (adapter.isSupported()) { + adapters.add(adapter); + } + } + + if (adapters.isEmpty()) { + throw new IllegalStateException( + "No supported logging framework found! Please add one of:\n" + + "- Logback: ch.qos.logback:logback-classic\n" + + "- Log4j2: org.apache.logging.log4j:log4j-core + log4j-slf4j2-impl\n" + + "- JUL: JDK built-in (no extra dependencies needed)" + ); + } + + // 按优先级排序 + adapters.sort(Comparator.comparingInt(LogFrameworkAdapter::getPriority)); + cachedAdapter = adapters.get(0); + } + } + } + return cachedAdapter; + } +} diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogContext.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogContext.java new file mode 100644 index 0000000..fdf882c --- /dev/null +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogContext.java @@ -0,0 +1,15 @@ +package org.dromara.milvus.plus.log; + +import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter; + +public class LogContext { + private static final LogFrameworkAdapter ADAPTER = LogAdapterFactory.getAdapter(); + + public static void setLogLevel(String packageName, String level) { + ADAPTER.setLogLevel(packageName, level); + } + + public static void setLoggingEnabled(String packageName, boolean enabled, String level) { + setLogLevel(packageName, enabled ? level : "OFF"); + } +} diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogLevelController.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogLevelController.java index 1de085e..1adb3d7 100644 --- a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogLevelController.java +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/LogLevelController.java @@ -1,41 +1,11 @@ package org.dromara.milvus.plus.log; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.LoggerContext; -import org.slf4j.LoggerFactory; - public class LogLevelController { - - // 获取LoggerContext - private static final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); - - /** - * 设置特定包下所有类的日志级别。 - * - * @param packageName 包名 - * @param level 日志级别 - */ - public static void setLogLevelForPackage(String packageName, Level level) { - for (ch.qos.logback.classic.Logger logger : loggerContext.getLoggerList()) { - if (logger.getName().startsWith(packageName)) { - logger.setLevel(level); - } - } + public static void setLogLevelForPackage(String packageName, String level) { + LogContext.setLogLevel(packageName, level); } - /** - * 动态设置日志开关。 - * 当设置为Level.OFF时,等同于关闭日志。 - * - * @param packageName 包名 - * @param enabled 是否启用日志 - */ public static void setLoggingEnabledForPackage(String packageName, boolean enabled, String level) { - // 开启日志 默认 -> debug - if (enabled) { - setLogLevelForPackage(packageName, Level.toLevel(level, Level.DEBUG)); - } else { - setLogLevelForPackage(packageName, Level.OFF); - } + LogContext.setLoggingEnabled(packageName, enabled, level); } -} \ No newline at end of file +} diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/LogFrameworkAdapter.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/LogFrameworkAdapter.java new file mode 100644 index 0000000..472aa32 --- /dev/null +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/LogFrameworkAdapter.java @@ -0,0 +1,19 @@ +// LogFrameworkAdapter.java +package org.dromara.milvus.plus.log.spi; + +public interface LogFrameworkAdapter { + /** + * 适配器优先级(数值越小优先级越高) + */ + int getPriority(); + + /** + * 是否支持当前日志框架 + */ + boolean isSupported(); + + /** + * 设置指定包的日志级别 + */ + void setLogLevel(String packageName, String level); +} diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/JulAdapter.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/JulAdapter.java new file mode 100644 index 0000000..a181d72 --- /dev/null +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/JulAdapter.java @@ -0,0 +1,25 @@ +package org.dromara.milvus.plus.log.spi.impl; + +import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter; +import org.springframework.stereotype.Service; + +import java.util.logging.Level; +import java.util.logging.Logger; +@Service +public class JulAdapter implements LogFrameworkAdapter { + @Override + public int getPriority() { + return 3; // 最低优先级 + } + + @Override + public boolean isSupported() { + return true; // JUL 始终可用 + } + + @Override + public void setLogLevel(String packageName, String level) { + Logger logger = Logger.getLogger(packageName); + logger.setLevel(Level.parse(level)); + } +} diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/Log4j2Adapter.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/Log4j2Adapter.java new file mode 100644 index 0000000..518616d --- /dev/null +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/Log4j2Adapter.java @@ -0,0 +1,40 @@ +package org.dromara.milvus.plus.log.spi.impl; + +import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Method; +@Service +public class Log4j2Adapter implements LogFrameworkAdapter { + @Override + public int getPriority() { + return 2; + } + + @Override + public boolean isSupported() { + try { + Class.forName("org.apache.logging.log4j.core.config.Configurator"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + @Override + public void setLogLevel(String packageName, String level) { + try { + Class configuratorClass = Class.forName("org.apache.logging.log4j.core.config.Configurator"); + Class levelClass = Class.forName("org.apache.logging.log4j.Level"); + + // 缓存反射方法提升性能 + Method toLevelMethod = levelClass.getMethod("toLevel", String.class); + Object logLevel = toLevelMethod.invoke(null, level); + + Method setLevelMethod = configuratorClass.getMethod("setLevel", String.class, levelClass); + setLevelMethod.invoke(null, packageName, logLevel); + } catch (Exception e) { + throw new IllegalStateException("[Log4j2] Set log level failed: " + e.getMessage(), e); + } + } +} diff --git a/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/LogbackAdapter.java b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/LogbackAdapter.java new file mode 100644 index 0000000..5605222 --- /dev/null +++ b/milvus-plus-core/src/main/java/org/dromara/milvus/plus/log/spi/impl/LogbackAdapter.java @@ -0,0 +1,62 @@ +package org.dromara.milvus.plus.log.spi.impl; + +import org.dromara.milvus.plus.log.spi.LogFrameworkAdapter; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Method; +@Service +public class LogbackAdapter implements LogFrameworkAdapter { + @Override + public int getPriority() { + return 1; + } + + @Override + public boolean isSupported() { + try { + // 检测关键类是否存在,避免直接导入 + Class.forName("ch.qos.logback.classic.Logger"); + Class.forName("ch.qos.logback.classic.Level"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + @Override + public void setLogLevel(String packageName, String level) { + try { + // 反射获取 Logback 相关类和方法 + Class loggerContextClass = Class.forName("ch.qos.logback.classic.LoggerContext"); + Class levelClass = Class.forName("ch.qos.logback.classic.Level"); + + // 获取 Level.toLevel 方法 + Method toLevelMethod = levelClass.getMethod("toLevel", String.class); + Object logLevel = toLevelMethod.invoke(null, level); + + // 获取 LoggerContext 实例 + Object loggerContext = LoggerFactory.getILoggerFactory(); + if (!loggerContextClass.isInstance(loggerContext)) { + throw new IllegalStateException("LoggerFactory is not Logback"); + } + + // 调用 LoggerContext.getLoggerList() + Method getLoggerListMethod = loggerContextClass.getMethod("getLoggerList"); + Iterable loggers = (Iterable) getLoggerListMethod.invoke(loggerContext); + + // 遍历并设置日志级别 + for (Object logger : loggers) { + Method getNameMethod = logger.getClass().getMethod("getName"); + String name = (String) getNameMethod.invoke(logger); + if (name.startsWith(packageName)) { + Method setLevelMethod = logger.getClass().getMethod("setLevel", levelClass); + setLevelMethod.invoke(logger, logLevel); + } + } + } catch (Exception e) { + throw new IllegalStateException("[Logback] Set log level failed: " + e.getMessage(), e); + } + } +} + diff --git a/milvus-plus-core/src/main/resources/META-INF/services/org.dromara.milvus.plus.log.spi.LogFrameworkAdapter b/milvus-plus-core/src/main/resources/META-INF/services/org.dromara.milvus.plus.log.spi.LogFrameworkAdapter new file mode 100644 index 0000000..38e58aa --- /dev/null +++ b/milvus-plus-core/src/main/resources/META-INF/services/org.dromara.milvus.plus.log.spi.LogFrameworkAdapter @@ -0,0 +1,3 @@ +org.dromara.milvus.plus.log.spi.impl.LogbackAdapter +org.dromara.milvus.plus.log.spi.impl.Log4j2Adapter +org.dromara.milvus.plus.log.spi.impl.JulAdapter \ No newline at end of file diff --git a/milvus-plus-parent/pom.xml b/milvus-plus-parent/pom.xml index 9be102a..c7b7574 100644 --- a/milvus-plus-parent/pom.xml +++ b/milvus-plus-parent/pom.xml @@ -30,7 +30,7 @@ - 2.2.4-M1 + 2.2.4 ${java.version} ${java.version} 3.11.0 diff --git a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/ApplicationRunnerTest.java b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/ApplicationRunnerTest.java index 9860ccc..3715f9b 100644 --- a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/ApplicationRunnerTest.java +++ b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/ApplicationRunnerTest.java @@ -119,9 +119,9 @@ public class ApplicationRunnerTest implements ApplicationRunner { person.setImages(Lists.newArrayList("https://baidu.com")); faceTmp.setPerson(person); faceTmp.setTemp(i%2==0?11:22); - faceTmp.setText(i % 2 == 0 ?"nformation retrieval is a field of study.":"information retrieval focuses on finding relevant information in large datasets."); - faceTmp.setAge(10); - faceTmp.setSex("男"); +// faceTmp.setText(i % 2 == 0 ?"nformation retrieval is a field of study.":"information retrieval focuses on finding relevant information in large datasets."); +// faceTmp.setAge(10); +// faceTmp.setSex("男"); return faceTmp; }) .collect(Collectors.toList()); diff --git a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java index a1e5b9b..07f0c29 100644 --- a/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java +++ b/milvus-spring-demo/src/main/java/org/dromara/milvus/demo/model/Face.java @@ -38,13 +38,13 @@ public class Face { ) private Integer temp; - @MilvusField( - name = "text", - dataType = DataType.VarChar, - enableAnalyzer = true, - enableMatch = true - ) - private String text; // 文本 +// @MilvusField( +// name = "text", +// dataType = DataType.VarChar, +// enableAnalyzer = true, +// enableMatch = true +// ) +// private String text; // 文本 @MilvusField( name = "face_vector", // 字段名称 @@ -62,11 +62,11 @@ public class Face { private List faceVector; // 存储人脸特征的向量 - //后续添加 - - private String sex; - - - private Integer age; +// //后续添加 +// +// private String sex; +// +// +// private Integer age; } \ No newline at end of file