diff --git a/API/TaskManager.Entity/Entity.cs b/API/TaskManager.Entity/Entity.cs index 23c87e5..492eb77 100644 --- a/API/TaskManager.Entity/Entity.cs +++ b/API/TaskManager.Entity/Entity.cs @@ -129,33 +129,48 @@ namespace TaskManager.Entity public class TaskLog:BaseEntity { - + /// + /// 版本号 + /// + [ExporterHeader(DisplayName = "版本号")] + [MaxLength(20)] + public string? Path { set; get; } + /// + /// 版本号 + /// + [ExporterHeader(DisplayName = "版本号")] + [MaxLength(20)] + public string? Version { set; get; } /// /// 详细描述 /// [ExporterHeader(DisplayName = "信息")] + [MaxLength(20)] public string? Info { get; set; } /// /// 日志类型 /// + [MaxLength(20)] [ExporterHeader(DisplayName = "日志类型")] public string? Type { get; set; } /// /// 任务名称 /// + [MaxLength(20)] [ExporterHeader(DisplayName = "任务名")] public string? TaskName { get; set; } /// /// 任务名称 /// + [ExporterHeader(DisplayName = "任务ID")] public Guid TaskId { get; set; } /// /// 创建时间 /// [ExporterHeader(DisplayName = "创建时间")] - public DateTime CreationTime { set; get; } + public DateTime? CreationTime { set; get; } /// /// 备注 /// diff --git a/API/Wood.Service/Controllers/LogService.cs b/API/Wood.Service/Controllers/LogService.cs new file mode 100644 index 0000000..7a6eb75 --- /dev/null +++ b/API/Wood.Service/Controllers/LogService.cs @@ -0,0 +1,160 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Channels; +using System.Threading.Tasks; +using TaskManager.Entity; +using TaskManager.EntityFramework; + +namespace Wood.Service.Controllers +{ + public class LogController1 : BackgroundService + { + private readonly IServiceProvider _serviceProvider; + private readonly Channel _logChannel; + private readonly string _logDirectory; + + public LogController1( + IServiceProvider serviceProvider, + IConfiguration configuration) + { + _serviceProvider = serviceProvider; + _logDirectory = configuration["Logging:Directory"] ?? + Path.Combine(Directory.GetCurrentDirectory(), "Logs"); + + EnsureDirectoryExists(_logDirectory); + _logChannel = Channel.CreateUnbounded(); + } + + + + + public void EnqueueLog(TaskLog logMessage) + { + // 设置日志路径并写入文件 + logMessage.Path= WriteLogToFile(logMessage); + + // 将日志加入处理队列 + _logChannel.Writer.TryWrite(logMessage); + } + + private string WriteLogToFile(TaskLog logMessage) + { + // 获取今天的日期目录 + string todayDirectory = Path.Combine(_logDirectory, DateTime.Now.ToString("yyyy-MM-dd")); + + // 确保目录存在 + EnsureDirectoryExists(todayDirectory); + + // 创建或追加到日志文件 + string logFilePath = Path.Combine(todayDirectory, "application.log"); + + try + { + // 写入日志内容到文件 + File.AppendAllText(logFilePath, + $"[{logMessage.CreationTime:yyyy-MM-dd HH:mm:ss}] [{logMessage.Type}] {logMessage.Info}{Environment.NewLine}"); + + // 返回相对路径(从日志根目录开始) + return Path.GetRelativePath(_logDirectory, logFilePath); + } + catch (Exception ex) + { + // 记录日志写入失败的错误 + Console.WriteLine($"Error writing log to file: {ex.Message}"); + return null; + } + } + + private void EnsureDirectoryExists(string directoryPath) + { + if (!Directory.Exists(directoryPath)) + { + Directory.CreateDirectory(directoryPath); + } + } + + + + [HttpGet("AddError")] + public async Task AddError(string message, string taskname, Guid taskid, Version version) + { + var log = new TaskLog + { + Info = message, + Type = "错误", + TaskName = taskname, + CreationTime = DateTime.Now, + TaskId = taskid, + Version = version?.ToString() + }; + + EnqueueLog(log); + + return true; // 日志已入队,视为成功 + } + + [HttpGet("AddInfo")] + public async Task AddInfo(string message, string taskname) + { + var log = new TaskLog + { + Info = message, + Type = "记录", + TaskName = taskname, + CreationTime = DateTime.Now + }; + + EnqueueLog(log); + + return true; + } + + [HttpGet("AddInfoRemark")] + public async Task AddInfoRemark(string message, string taskname, string remark) + { + var log = new TaskLog + { + Info = message, + Type = "记录", + TaskName = taskname, + CreationTime = DateTime.Now, + Remark = remark + }; + + EnqueueLog(log); + + return true; + } + + + // 其他方法保持不变... + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + await foreach (var logMessage in _logChannel.Reader.ReadAllAsync(stoppingToken)) + { + // 使用IServiceScopeFactory创建独立的作用域 + using var scope = _serviceProvider.CreateScope(); + var dbContext = scope.ServiceProvider.GetRequiredService(); + + try + { + dbContext.TaskLogs.Add(logMessage); + await dbContext.SaveChangesAsync(stoppingToken); + } + catch (Exception ex) + { + Console.WriteLine($"Error saving log: {ex.Message}"); + } + } + } + + + } +}