发布 2.2.4:更新 sdk 2.5.5,更新日志打印,通过spi支持选择log4j、logback等

This commit is contained in:
xgc 2025-03-10 15:23:20 +08:00
parent 7fc911a2bd
commit 8f4f1e7494
14 changed files with 237 additions and 60 deletions

View File

@ -8,7 +8,7 @@
<img src="./logo/milvus.png" alt="MilvusPlus" style="border-radius: 10px;" />
</div>
> 🔥🔥🔥[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 @@
<dependency>
<groupId>org.dromara.milvus-plus</groupId>
<artifactId>milvus-plus-core</artifactId>
<version>2.2.3</version>
<version>2.2.4</version>
</dependency>
```
@ -41,7 +41,7 @@ Spring应用支持
<dependency>
<groupId>org.dromara.milvus-plus</groupId>
<artifactId>milvus-plus-boot-starter</artifactId>
<version>2.2.3</version>
<version>2.2.4</version>
</dependency>
```
@ -51,7 +51,7 @@ Solon应用支持
<dependency>
<groupId>org.dromara.milvus-plus</groupId>
<artifactId>milvus-plus-solon-plugin</artifactId>
<version>2.2.3</version>
<version>2.2.4</version>
</dependency>
```

View File

@ -6,7 +6,7 @@
<img src="./logo/milvus.png" alt="MilvusPlus" style="border-radius: 10px;" />
</div>
> 🔥🔥🔥 [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:
<dependency>
<groupId>org.dromara.milvus-plus</groupId>
<artifactId>milvus-plus-core</artifactId>
<version>2.2.3</version>
<version>2.2.4</version>
</dependency>
```
@ -39,7 +39,7 @@ Spring application support:
<dependency>
<groupId>org.dromara.milvus-plus</groupId>
<artifactId>milvus-plus-boot-starter</artifactId>
<version>2.2.3</version>
<version>2.2.4</version>
</dependency>
```
@ -49,7 +49,7 @@ Solon application support:
<dependency>
<groupId>org.dromara.milvus-plus</groupId>
<artifactId>milvus-plus-solon-plugin</artifactId>
<version>2.2.3</version>
<version>2.2.4</version>
</dependency>
```

View File

@ -28,7 +28,7 @@
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.5.2</version>
<version>2.5.5</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>

View File

@ -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<LogFrameworkAdapter> loader = ServiceLoader.load(LogFrameworkAdapter.class);
List<LogFrameworkAdapter> 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;
}
}

View File

@ -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");
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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));
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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

View File

@ -30,7 +30,7 @@
</developer>
</developers>
<properties>
<revision>2.2.4-M1</revision>
<revision>2.2.4</revision>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<maven-compiler.version>3.11.0</maven-compiler.version>

View File

@ -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());

View File

@ -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<Float> faceVector; // 存储人脸特征的向量
//后续添加
private String sex;
private Integer age;
// //后续添加
//
// private String sex;
//
//
// private Integer age;
}