mirror of
https://gitee.com/ccnetcore/Yi
synced 2026-04-05 00:37:21 +08:00
feat: Token 支持请求日志开关并记录 OpenAPI 请求日志
新增 Token 的 IsEnableLog 字段,贯穿领域、应用与 DTO;在 OpenApiService 中根据 Token 配置异步记录请求日志,包含请求体、模型与接口类型,用于后续审计与分析。
This commit is contained in:
@@ -83,6 +83,7 @@ public class TokenService : ApplicationService
|
||||
PremiumQuotaLimit = t.PremiumQuotaLimit,
|
||||
PremiumUsedQuota = usedQuota,
|
||||
IsDisabled = t.IsDisabled,
|
||||
IsEnableLog = t.IsEnableLog,
|
||||
CreationTime = t.CreationTime
|
||||
};
|
||||
}).ToList();
|
||||
@@ -158,6 +159,7 @@ public class TokenService : ApplicationService
|
||||
PremiumQuotaLimit = token.PremiumQuotaLimit,
|
||||
PremiumUsedQuota = 0,
|
||||
IsDisabled = token.IsDisabled,
|
||||
IsEnableLog = token.IsEnableLog,
|
||||
CreationTime = token.CreationTime
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Volo.Abp.Application.Services;
|
||||
using Volo.Abp.Uow;
|
||||
using Volo.Abp.Users;
|
||||
using Yi.Framework.AiHub.Domain.Entities;
|
||||
using Yi.Framework.AiHub.Domain.Entities.Chat;
|
||||
using Yi.Framework.AiHub.Domain.Entities.Model;
|
||||
using Yi.Framework.AiHub.Domain.Entities.OpenApi;
|
||||
using Yi.Framework.AiHub.Domain.Extensions;
|
||||
using Yi.Framework.AiHub.Domain.Managers;
|
||||
using Yi.Framework.AiHub.Domain.Shared.Consts;
|
||||
@@ -33,10 +36,12 @@ public class OpenApiService : ApplicationService
|
||||
private readonly PremiumPackageManager _premiumPackageManager;
|
||||
private readonly ISqlSugarRepository<ImageStoreTaskAggregateRoot> _imageStoreRepository;
|
||||
private readonly ISqlSugarRepository<AiModelEntity> _aiModelRepository;
|
||||
private readonly IServiceScopeFactory _serviceScopeFactory;
|
||||
public OpenApiService(IHttpContextAccessor httpContextAccessor, ILogger<OpenApiService> logger,
|
||||
TokenManager tokenManager, AiGateWayManager aiGateWayManager,
|
||||
ModelManager modelManager, AiBlacklistManager aiBlacklistManager,
|
||||
IAccountService accountService, PremiumPackageManager premiumPackageManager, ISqlSugarRepository<ImageStoreTaskAggregateRoot> imageStoreRepository, ISqlSugarRepository<AiModelEntity> aiModelRepository)
|
||||
IAccountService accountService, PremiumPackageManager premiumPackageManager, ISqlSugarRepository<ImageStoreTaskAggregateRoot> imageStoreRepository, ISqlSugarRepository<AiModelEntity> aiModelRepository,
|
||||
IServiceScopeFactory serviceScopeFactory)
|
||||
{
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_logger = logger;
|
||||
@@ -48,6 +53,7 @@ public class OpenApiService : ApplicationService
|
||||
_premiumPackageManager = premiumPackageManager;
|
||||
_imageStoreRepository = imageStoreRepository;
|
||||
_aiModelRepository = aiModelRepository;
|
||||
_serviceScopeFactory = serviceScopeFactory;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -91,6 +97,12 @@ public class OpenApiService : ApplicationService
|
||||
null, tokenId,
|
||||
CancellationToken.None);
|
||||
}
|
||||
|
||||
// 记录请求日志
|
||||
if (tokenValidation.IsEnableLog)
|
||||
{
|
||||
FireAndForgetMessageLog(JsonSerializer.Serialize(input), tokenValidation.Token, tokenValidation.TokenName, input.Model, ModelApiTypeEnum.Completions);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -206,6 +218,12 @@ public class OpenApiService : ApplicationService
|
||||
null, tokenId,
|
||||
CancellationToken.None);
|
||||
}
|
||||
|
||||
// 记录请求日志
|
||||
if (tokenValidation.IsEnableLog)
|
||||
{
|
||||
FireAndForgetMessageLog(JsonSerializer.Serialize(input), tokenValidation.Token, tokenValidation.TokenName, input.Model, ModelApiTypeEnum.Messages);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -258,6 +276,12 @@ public class OpenApiService : ApplicationService
|
||||
null, tokenId,
|
||||
CancellationToken.None);
|
||||
}
|
||||
|
||||
// 记录请求日志
|
||||
if (tokenValidation.IsEnableLog)
|
||||
{
|
||||
FireAndForgetMessageLog(JsonSerializer.Serialize(input), tokenValidation.Token, tokenValidation.TokenName, input.Model, ModelApiTypeEnum.Responses);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -318,6 +342,12 @@ public class OpenApiService : ApplicationService
|
||||
null, tokenId,
|
||||
CancellationToken.None);
|
||||
}
|
||||
|
||||
// 记录请求日志
|
||||
if (tokenValidation.IsEnableLog)
|
||||
{
|
||||
FireAndForgetMessageLog(input.GetRawText(), tokenValidation.Token, tokenValidation.TokenName, modelId, ModelApiTypeEnum.GenerateContent);
|
||||
}
|
||||
}
|
||||
|
||||
#region 私有
|
||||
@@ -357,5 +387,25 @@ public class OpenApiService : ApplicationService
|
||||
}
|
||||
}
|
||||
|
||||
private void FireAndForgetMessageLog(string requestBody, string apiKey, string apiKeyName, string modelId, ModelApiTypeEnum apiType)
|
||||
{
|
||||
_ = Task.Run(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
using var scope = _serviceScopeFactory.CreateScope();
|
||||
var uowManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
|
||||
var manager = scope.ServiceProvider.GetRequiredService<MessageLogManager>();
|
||||
using var uow = uowManager.Begin(requiresNew: true);
|
||||
await manager.CreateAsync(requestBody, apiKey, apiKeyName, modelId, apiType);
|
||||
await uow.CompleteAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "记录消息日志失败, 请求体长度: {RequestBodyLength}", requestBody?.Length ?? 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user