diff --git a/Myshipping.Core/EventSubscriber/LogZipClearSubscriber.cs b/Myshipping.Core/EventSubscriber/LogZipClearSubscriber.cs new file mode 100644 index 00000000..f37384cf --- /dev/null +++ b/Myshipping.Core/EventSubscriber/LogZipClearSubscriber.cs @@ -0,0 +1,93 @@ +using Furion.EventBus; +using Myshipping.Core.Entity; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading.Tasks; +using System.IO; +using System.Collections.Generic; +using ICSharpCode.SharpZipLib.Zip; +using System.Linq; +using Furion; +using Furion.Logging; + +namespace Myshipping.Core; + +public class LogZipClearSubscriber : IEventSubscriber +{ + public LogZipClearSubscriber(IServiceProvider services) + { + Services = services; + } + + public IServiceProvider Services { get; } + + [EventSubscribe("LogZipClear:DoWork")] + public async Task DoWork(EventHandlerExecutingContext context) + { + var logBaseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs"); + var subDirs = new string[] { + Path.Combine(logBaseDir,"error"), + Path.Combine(logBaseDir,"info"), + Path.Combine(logBaseDir,"warn") + }; + + //留3天的不压缩处理 + var skipDate = new string[] { + DateTime.Today.ToString("yyyyMMdd"), + DateTime.Today.AddDays(-1).ToString("yyyyMMdd"), + DateTime.Today.AddDays(-2).ToString("yyyyMMdd") + }; + + //压缩日志 + Log.Information($"准备压缩日志文件……"); + foreach (var dir in subDirs) + { + var files = new List(Directory.GetFiles(dir, "*.log")); + var fileDateList = files.GroupBy(x => Path.GetFileName(x).Substring(0, Path.GetFileName(x).IndexOf("_"))).Select(x => x.Key).Where(x => !skipDate.Contains(x)).ToList(); + + foreach (var fd in fileDateList) + { + var zipFile = Path.Combine(dir, $"{fd}.zip"); + var listToZip = files.Where(x => Path.GetFileName(x).Substring(0, Path.GetFileName(x).IndexOf("_")) == fd).ToList(); + using (FileStream fs = new FileStream(zipFile, FileMode.Create, FileAccess.ReadWrite)) + { + using (ZipOutputStream zipOut = new ZipOutputStream(fs)) + { + foreach (var f in listToZip) + { + var fn = Path.GetFileName(f); + var fileDate = fn.Substring(0, fn.IndexOf("_")); + + ZipEntry zipEntry = new ZipEntry(fn); + zipOut.PutNextEntry(zipEntry); + await zipOut.WriteAsync(File.ReadAllBytes(f)); + await zipOut.FlushAsync(); + + File.Delete(f); + } + } + } + + Log.Information($"已将{fd}的日志压缩,共{listToZip.Count}个文件"); + } + } + + //清理过期 + Log.Information($"准备清理过期日志文件……"); + var dtExpire = DateTime.Today.AddDays(-60); + foreach (var dir in subDirs) + { + var files = new List(Directory.GetFiles(dir, "*.zip")); + foreach (var file in files) + { + var fileDate = DateTime.ParseExact(Path.GetFileNameWithoutExtension(file), "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); + if (fileDate < dtExpire) + { + File.Delete(file); + Log.Information($"已删除过期日志文件:{Path.GetFileName(file)}"); + } + } + } + } + +} diff --git a/Myshipping.Core/Job/LogZipClearWorker.cs b/Myshipping.Core/Job/LogZipClearWorker.cs new file mode 100644 index 00000000..bc4c822b --- /dev/null +++ b/Myshipping.Core/Job/LogZipClearWorker.cs @@ -0,0 +1,35 @@ +using Furion; +using Furion.DataEncryption; +using Furion.EventBus; +using Furion.Logging; +using Furion.TaskScheduler; +using ICSharpCode.SharpZipLib.Zip; +using Myshipping.Core.Entity; +using Myshipping.Core.Service; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Myshipping.Core.Job +{ + /// + /// 日志清理 + /// + public class LogZipClearWorker : ISpareTimeWorker + { + [SpareTime(60000, "LogZipClearWorker", Description = "日志压缩清理", DoOnce = false, StartNow = true, ExecuteType = SpareTimeExecuteTypes.Serial)] + public void LogZipClear(SpareTimer timer, long count) + { + Log.Information($"日志清理 {DateTime.Now}"); + + var evtPub = App.GetService(); + evtPub.PublishAsync(new ChannelEventSource("LogZipClear:DoWork")); + + } + + } +} diff --git a/Myshipping.Core/Myshipping.Core.xml b/Myshipping.Core/Myshipping.Core.xml index 60565a1a..890cf412 100644 --- a/Myshipping.Core/Myshipping.Core.xml +++ b/Myshipping.Core/Myshipping.Core.xml @@ -5859,6 +5859,11 @@ 后台批量删除临时文件 + + + 日志清理 + + 和川用户同步 diff --git a/Myshipping.Core/Service/Log/SysOpLogService.cs b/Myshipping.Core/Service/Log/SysOpLogService.cs index a7d60100..ceb71ad3 100644 --- a/Myshipping.Core/Service/Log/SysOpLogService.cs +++ b/Myshipping.Core/Service/Log/SysOpLogService.cs @@ -8,6 +8,8 @@ using Microsoft.AspNetCore.Mvc; using SqlSugar; using System; using System.Threading.Tasks; +using Furion.EventBus; +using Furion; namespace Myshipping.Core.Service; @@ -55,4 +57,11 @@ public class SysOpLogService : ISysOpLogService, IDynamicApiController, ITransie { await _sysOpLogRep.DeleteAsync(m => true); } + + [HttpPost("/sysOpLog/zipClear")] + public async Task ZipClear() + { + var evtPub = App.GetService(); + await evtPub.PublishAsync(new ChannelEventSource("LogZipClear:DoWork")); + } } diff --git a/Myshipping.Web.Core/Startup.cs b/Myshipping.Web.Core/Startup.cs index d1343e4d..c9537a05 100644 --- a/Myshipping.Web.Core/Startup.cs +++ b/Myshipping.Web.Core/Startup.cs @@ -115,6 +115,8 @@ public class Startup : AppStartup builder.AddSubscriber(); //发送订舱同步数据给客户订舱系统 builder.AddSubscriber(); + //日志压缩清理 + builder.AddSubscriber(); }); }