2 changed files with 177 additions and 2 deletions
@ -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<TaskLog> _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<TaskLog>(); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
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<bool> 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<bool> 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<bool> 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<JobDbContext>(); |
|||
|
|||
try |
|||
{ |
|||
dbContext.TaskLogs.Add(logMessage); |
|||
await dbContext.SaveChangesAsync(stoppingToken); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
Console.WriteLine($"Error saving log: {ex.Message}"); |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
Loading…
Reference in new issue