wet 1 year ago
commit 2d70cb1e68

@ -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<string>(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<string>(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)}");
}
}
}
}
}

@ -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
{
/// <summary>
/// 日志清理
/// </summary>
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<IEventPublisher>();
evtPub.PublishAsync(new ChannelEventSource("LogZipClear:DoWork"));
}
}
}

@ -5859,6 +5859,11 @@
后台批量删除临时文件
</summary>
</member>
<member name="T:Myshipping.Core.Job.LogZipClearWorker">
<summary>
日志清理
</summary>
</member>
<member name="T:Myshipping.Core.Job.UserSyncWorker">
<summary>
和川用户同步

@ -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<IEventPublisher>();
await evtPub.PublishAsync(new ChannelEventSource("LogZipClear:DoWork"));
}
}

@ -115,6 +115,8 @@ public class Startup : AppStartup
builder.AddSubscriber<DingTalkSubscriber>();
//发送订舱同步数据给客户订舱系统
builder.AddSubscriber<BookingSyncSubscriber>();
//日志压缩清理
builder.AddSubscriber<LogZipClearSubscriber>();
});
}

Loading…
Cancel
Save