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](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](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