- 新增文件下载功能: - 新增 `FileBody.java` 类,定义文件下载的数据结构。 - 新增 `FileCallback.java` 类,处理文件下载的回调逻辑,包括线程池管理和下载进度报告。 - 新增 `HttpDownloadUtils.java` 工具类,提供异步和同步的文件下载方法,并支持下载接口回调。 - 改进HTTP请求处理: - 修改 `NapCatQQ.java` 的 `onResponse` 方法,增加对响应头(`Headers`)的处理。 - 修改 `GetRequestParams.java` 和 `PostRequestParams.java` 的 `getRequest` 方法,支持在请求中添加自定义Header。 - 修改 `HttpCallback.java` 的 `onResponse` 方法,增加对响应头(`Headers`)的处理。 - 优化HTTP日志记录: - 修改 `HttpLoggingInterceptor.java`,调整日志级别为默认输出响应体,修复日志输出格式和异常处理问题。 - 改进BaseApi类: - 修改 `BaseApi.java`,增加对请求头的支持,并优化错误处理逻辑。 - 在拦截器中处理非成功的响应码,返回统一格式的错误信息,避免业务逻辑中重复处理。 - 更新QQBotManager API回调: - 修改 `QQBotManager.java`,更新API回调方法以处理响应头(`Headers`),确保所有回调方法一致。 - 新增GPT API交互功能: - 新增 `OpenAiBean.java` 类,定义与OpenAI交互的数据结构,包含响应中的各个字段。 - 新增 `SiliconGPTManager.java` 类,实现新的GPT管理器,处理与Silicon GPT API的交互。 - 新增 `GPTApi.java` 类,提供与GPT API交互的基础配置和API调用方法。 - 新增 `GPTBuilder.java` 类,用于构建发送给GPT API的请求对象。 - 改进GPT管理器: - 修改 `AbsGPTManager.java`,添加锁机制,防止同一用户同时发起多个请求。 - 提供获取消息列表的方法,限制历史消息的最大数量。 - 支持设置模型版本。 - 修改 `BaiduGPTManager.java`,移除重复的清除方法,继承自父类。 - 使用父类提供的方法获取消息列表,简化代码逻辑。 - 优化和重构: - 进一步优化 `HttpLoggingInterceptor.java` 的日志记录逻辑,提高性能和可读性。 - 重构 `BaseApi.java` 初始化方法,简化代码逻辑,提高可读性。 这些改动增强了HTTP请求处理能力,增加了文件下载功能,并为与GPT API的交互提供了支持。
136 lines
5.2 KiB
Java
136 lines
5.2 KiB
Java
package com.yutou.qqbot.utlis;
|
||
|
||
import com.google.common.cache.Cache;
|
||
import com.google.common.cache.CacheBuilder;
|
||
import org.apache.logging.log4j.Level;
|
||
import org.apache.logging.log4j.LogManager;
|
||
import org.apache.logging.log4j.Logger;
|
||
import org.apache.logging.log4j.core.Appender;
|
||
import org.apache.logging.log4j.core.Layout;
|
||
import org.apache.logging.log4j.core.LoggerContext;
|
||
import org.apache.logging.log4j.core.appender.ConsoleAppender;
|
||
import org.apache.logging.log4j.core.appender.RollingFileAppender;
|
||
import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy;
|
||
import org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy;
|
||
import org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy;
|
||
import org.apache.logging.log4j.core.config.Configuration;
|
||
import org.apache.logging.log4j.core.layout.PatternLayout;
|
||
|
||
import java.util.Date;
|
||
import java.util.concurrent.ExecutionException;
|
||
import java.util.concurrent.TimeUnit;
|
||
|
||
public class DynamicLogFile {
|
||
// 创建一个缓存,用于存储Logger对象,最大容量为1000,过期时间为10分钟
|
||
static Cache<String, Logger> cache = CacheBuilder.newBuilder()
|
||
.maximumSize(1000)
|
||
.expireAfterAccess(10, TimeUnit.MINUTES)
|
||
.removalListener(it -> {
|
||
if (it.wasEvicted()) {
|
||
if (it.getKey() != null) {
|
||
String loggerName = (String) it.getKey();
|
||
remove(loggerName, true);
|
||
}
|
||
}
|
||
})
|
||
.build();
|
||
|
||
// 根据loggerName获取Logger对象,如果缓存中不存在,则创建一个新的Logger对象并放入缓存
|
||
public static Logger getLogger(String loggerName) {
|
||
try {
|
||
return cache.get(loggerName, () -> {
|
||
configureLogger(loggerName);
|
||
return LogManager.getLogger(loggerName);
|
||
});
|
||
} catch (ExecutionException e) {
|
||
throw new RuntimeException(e);
|
||
}
|
||
}
|
||
|
||
// 配置Logger对象
|
||
private static void configureLogger(String loggerName) {
|
||
|
||
LoggerContext context = (LoggerContext) LogManager.getContext(false);
|
||
Configuration config = context.getConfiguration();
|
||
|
||
// 创建日志格式
|
||
Layout<String> layout = PatternLayout.newBuilder()
|
||
.withPattern("%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %-5p [%thread] (%F:%L) : %m%n")
|
||
.build();
|
||
|
||
// 创建时间触发策略
|
||
TimeBasedTriggeringPolicy timePolicy = TimeBasedTriggeringPolicy.newBuilder()
|
||
.build();
|
||
|
||
// 创建文件大小触发策略
|
||
SizeBasedTriggeringPolicy sizePolicy = SizeBasedTriggeringPolicy.createPolicy("100 MB");
|
||
|
||
// 创建组合触发策略
|
||
CompositeTriggeringPolicy triggeringPolicy = CompositeTriggeringPolicy.createPolicy(timePolicy, sizePolicy);
|
||
|
||
|
||
// 创建滚动文件Appender
|
||
RollingFileAppender appender = RollingFileAppender.newBuilder()
|
||
.setName(loggerName)
|
||
.withFileName("logs" + "/" + DateFormatUtils.getInstance().format(new Date(), "yyyy-MM-dd") + "/" + loggerName + ".log")
|
||
.withFilePattern("logs" + "/" + "%d{yyyy-MM-dd}" + "/" + loggerName + "-%i.log.gz")
|
||
.setLayout(layout)
|
||
.setImmediateFlush(true)
|
||
.withAppend(true)
|
||
.setIgnoreExceptions(false)
|
||
.withPolicy(triggeringPolicy)
|
||
.build();
|
||
|
||
// 创建控制台Appender
|
||
Appender consoleAppender = ConsoleAppender.newBuilder()
|
||
.setName(loggerName + "-console")
|
||
.setLayout(layout)
|
||
.setTarget(ConsoleAppender.Target.SYSTEM_OUT)
|
||
.build();
|
||
|
||
appender.start();
|
||
consoleAppender.start();
|
||
config.addAppender(appender);
|
||
config.addAppender(consoleAppender);
|
||
|
||
// 获取Logger对象
|
||
org.apache.logging.log4j.core.Logger coreLogger = context.getLogger(loggerName);
|
||
if (coreLogger == null) {
|
||
throw new IllegalStateException("Logger with name " + loggerName + " does not exist.");
|
||
}
|
||
|
||
// 将Appender添加到Logger对象中
|
||
coreLogger.addAppender(appender);
|
||
coreLogger.addAppender(consoleAppender);
|
||
coreLogger.setLevel(Level.ALL);
|
||
coreLogger.setAdditive(false);
|
||
|
||
// 更新Logger对象
|
||
context.updateLoggers();
|
||
|
||
}
|
||
|
||
// 移除Logger对象
|
||
public static void remove(String loggerName) {
|
||
remove(loggerName, false);
|
||
}
|
||
|
||
// 私有方法,移除Logger对象,isAuto参数用于判断是否是自动移除
|
||
private static void remove(String loggerName, boolean isAuto) {
|
||
if (!isAuto) {
|
||
cache.invalidate(loggerName);
|
||
}
|
||
LoggerContext context = (LoggerContext) LogManager.getContext(false);
|
||
Configuration config = context.getConfiguration();
|
||
org.apache.logging.log4j.core.Logger coreLogger = context.getLogger(loggerName);
|
||
Appender appender = config.getAppender(loggerName);
|
||
if (appender != null) {
|
||
appender.stop();
|
||
coreLogger.removeAppender(appender);
|
||
}
|
||
config.getAppenders().remove(loggerName);
|
||
context.updateLoggers();
|
||
}
|
||
|
||
}
|