using Quartz;
using System;
using System.IO;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
namespace WIDESEAWCS_Tasks
{
[DisallowConcurrentExecution]
public class LogJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
try
{
Task.Run(() =>
{
try
{
WriteLog.GetLog("LogJob").Write($"日志记录:{DateTime.Now}", "LogJob");
// 设置保留天数为30天
int saveDays = 30;
// 清理Log目录下的所有过期文件夹
CleanLogDirectory(saveDays);
Thread.Sleep(1000 * 10);
}
catch (Exception ex)
{
WriteLog.GetLog("LogJob").Write($"日志清理出错:{ex.Message}", "LogJob");
}
});
}
catch (Exception ex)
{
Console.Out.WriteLine(nameof(LogJob) + ":" + ex.Message);
}
return Task.CompletedTask;
}
///
/// 清理Log目录下的所有过期日志文件夹
///
/// 保留天数
private static void CleanLogDirectory(int saveDays)
{
// 获取Log目录路径
var logBasePath = Path.Combine(Environment.CurrentDirectory, "Log");
if (!Directory.Exists(logBasePath))
{
WriteLog.GetLog("LogJob").Write($"Log目录不存在:{logBasePath}", "LogJob");
return;
}
var nowTime = DateTime.Now;
var cutoffDate = nowTime.AddDays(-saveDays);
WriteLog.GetLog("LogJob").Write($"开始清理日志,保留天数:{saveDays},截止日期:{cutoffDate:yyyy-MM-dd}", "LogJob");
// 获取Log目录下的所有子目录
var allSubDirs = Directory.GetDirectories(logBasePath, "*", SearchOption.AllDirectories);
foreach (var dirPath in allSubDirs)
{
try
{
// 获取文件夹名
var dirName = Path.GetFileName(dirPath);
// 尝试解析为日期(支持多种格式)
if (TryParseDateFolder(dirName, out DateTime folderDate))
{
// 判断是否过期
if (folderDate < cutoffDate)
{
WriteLog.GetLog("LogJob").Write($"删除过期日志文件夹:{dirPath},日期:{folderDate:yyyy-MM-dd}", "LogJob");
// 递归删除文件夹及其内容
Directory.Delete(dirPath, true);
}
else
{
WriteLog.GetLog("LogJob").Write($"保留日志文件夹:{dirPath},日期:{folderDate:yyyy-MM-dd}", "LogJob");
}
}
}
catch (Exception ex)
{
WriteLog.GetLog("LogJob").Write($"处理文件夹 {dirPath} 时出错:{ex.Message}", "LogJob");
}
}
WriteLog.GetLog("LogJob").Write($"日志清理完成", "LogJob");
}
///
/// 尝试解析日期文件夹名称
///
/// 文件夹名称
/// 解析出的日期
/// 是否成功解析
private static bool TryParseDateFolder(string folderName, out DateTime date)
{
// 支持的日期格式
string[] dateFormats =
{
"yyyy-MM-dd", // 2025-12-07
"yyyyMMdd", // 20251207
"yyyy_MM_dd", // 2025_12_07
"yyyy.MM.dd", // 2025.12.07
"yyyy年MM月dd日" // 2025年12月07日
};
// 尝试解析日期
bool success = DateTime.TryParseExact(
folderName,
dateFormats,
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
out date
);
return success;
}
}
}