mirror of
https://gitee.com/dromara/MilvusPlus.git
synced 2025-12-06 08:58:26 +08:00
发布 2.2.4:更新 sdk 2.5.5,更新日志打印,通过spi支持选择log4j、logback等
This commit is contained in:
parent
7fc911a2bd
commit
8f4f1e7494
@ -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>
|
||||
```
|
||||
|
||||
|
||||
@ -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>
|
||||
```
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -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>
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user