include purge job for maintaining event logs and visitor logs
This commit is contained in:
76
Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs
Normal file
76
Oqtane.Server/Infrastructure/Jobs/PurgeJob.cs
Normal file
@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Oqtane.Models;
|
||||
using Oqtane.Repository;
|
||||
using Oqtane.Shared;
|
||||
|
||||
namespace Oqtane.Infrastructure
|
||||
{
|
||||
public class PurgeJob : HostedServiceBase
|
||||
{
|
||||
// JobType = "Oqtane.Infrastructure.PurgeJob, Oqtane.Server"
|
||||
|
||||
public PurgeJob(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory)
|
||||
{
|
||||
Name = "Purge Job";
|
||||
Frequency = "d"; // daily
|
||||
Interval = 1;
|
||||
StartDate = DateTime.ParseExact("03:00", "H:mm", null, System.Globalization.DateTimeStyles.None); // 3 AM
|
||||
IsEnabled = true;
|
||||
}
|
||||
|
||||
// job is executed for each tenant in installation
|
||||
public override string ExecuteJob(IServiceProvider provider)
|
||||
{
|
||||
string log = "";
|
||||
|
||||
// get services
|
||||
var siteRepository = provider.GetRequiredService<ISiteRepository>();
|
||||
var settingRepository = provider.GetRequiredService<ISettingRepository>();
|
||||
var logRepository = provider.GetRequiredService<ILogRepository>();
|
||||
var visitorRepository = provider.GetRequiredService<IVisitorRepository>();
|
||||
|
||||
// iterate through sites for current tenant
|
||||
List<Site> sites = siteRepository.GetSites().ToList();
|
||||
foreach (Site site in sites)
|
||||
{
|
||||
log += "Processing Site: " + site.Name + "<br />";
|
||||
|
||||
// get site settings
|
||||
Dictionary<string, string> settings = GetSettings(settingRepository.GetSettings(EntityNames.Site, site.SiteId).ToList());
|
||||
|
||||
// purge event log
|
||||
int logretention = 30;
|
||||
if (settings.ContainsKey("LogRetention") && settings["LogRetention"] != "")
|
||||
{
|
||||
logretention = int.Parse(settings["LogRetention"]);
|
||||
}
|
||||
int count = logRepository.DeleteLogs(logretention);
|
||||
log += count.ToString() + " Event Logs Purged<br />";
|
||||
|
||||
// purge visitors
|
||||
int visitorrention = 30;
|
||||
if (settings.ContainsKey("VisitorRetention") && settings["VisitorRetention"] != "")
|
||||
{
|
||||
visitorrention = int.Parse(settings["VisitorRetention"]);
|
||||
}
|
||||
count = visitorRepository.DeleteVisitors(visitorrention);
|
||||
log += count.ToString() + " Visitors Purged<br />";
|
||||
}
|
||||
|
||||
return log;
|
||||
}
|
||||
|
||||
private Dictionary<string, string> GetSettings(List<Setting> settings)
|
||||
{
|
||||
Dictionary<string, string> dictionary = new Dictionary<string, string>();
|
||||
foreach (Setting setting in settings.OrderBy(item => item.SettingName).ToList())
|
||||
{
|
||||
dictionary.Add(setting.SettingName, setting.SettingValue);
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
}
|
||||
}
|
@ -35,8 +35,9 @@ namespace Oqtane.Pages
|
||||
private readonly IUrlMappingRepository _urlMappings;
|
||||
private readonly IVisitorRepository _visitors;
|
||||
private readonly IAliasRepository _aliases;
|
||||
private readonly ISettingRepository _settings;
|
||||
|
||||
public HostModel(IConfiguration configuration, ITenantManager tenantManager, ILocalizationManager localizationManager, ILanguageRepository languages, IAntiforgery antiforgery, ISiteRepository sites, IPageRepository pages, IUrlMappingRepository urlMappings, IVisitorRepository visitors, IAliasRepository aliases)
|
||||
public HostModel(IConfiguration configuration, ITenantManager tenantManager, ILocalizationManager localizationManager, ILanguageRepository languages, IAntiforgery antiforgery, ISiteRepository sites, IPageRepository pages, IUrlMappingRepository urlMappings, IVisitorRepository visitors, IAliasRepository aliases, ISettingRepository settings)
|
||||
{
|
||||
_configuration = configuration;
|
||||
_tenantManager = tenantManager;
|
||||
@ -48,6 +49,7 @@ namespace Oqtane.Pages
|
||||
_urlMappings = urlMappings;
|
||||
_visitors = visitors;
|
||||
_aliases = aliases;
|
||||
_settings = settings;
|
||||
}
|
||||
|
||||
public string AntiForgeryToken = "";
|
||||
@ -198,6 +200,20 @@ namespace Oqtane.Pages
|
||||
language = (language.Contains(",")) ? language.Substring(0, language.IndexOf(",")) : language;
|
||||
language = (language.Contains(";")) ? language.Substring(0, language.IndexOf(";")) : language;
|
||||
language = (language.Trim().Length == 0) ? "*" : language;
|
||||
|
||||
// filter
|
||||
var filter = _settings.GetSetting(EntityNames.Site, SiteId, "VisitorFilter");
|
||||
if (filter != null && !string.IsNullOrEmpty(filter.SettingValue))
|
||||
{
|
||||
foreach (string term in filter.SettingValue.ToLower().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(sValue => sValue.Trim()).ToArray())
|
||||
{
|
||||
if (ip.ToLower().Contains(term) || useragent.ToLower().Contains(term) || language.ToLower().Contains(term))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string url = Request.GetEncodedUrl();
|
||||
string referrer = (Request.Headers[HeaderNames.Referer] != StringValues.Empty) ? Request.Headers[HeaderNames.Referer] : "";
|
||||
int? userid = null;
|
||||
|
@ -1,4 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using Oqtane.Models;
|
||||
|
||||
namespace Oqtane.Repository
|
||||
@ -8,5 +8,6 @@ namespace Oqtane.Repository
|
||||
IEnumerable<Log> GetLogs(int siteId, string level, string function, int rows);
|
||||
Log GetLog(int logId);
|
||||
void AddLog(Log log);
|
||||
int DeleteLogs(int age);
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ namespace Oqtane.Repository
|
||||
Setting AddSetting(Setting setting);
|
||||
Setting UpdateSetting(Setting setting);
|
||||
Setting GetSetting(string entityName, int settingId);
|
||||
Setting GetSetting(string entityName, int entityId, string settingName);
|
||||
void DeleteSetting(string entityName, int settingId);
|
||||
void DeleteSettings(string entityName, int entityId);
|
||||
}
|
||||
|
@ -11,5 +11,6 @@ namespace Oqtane.Repository
|
||||
Visitor UpdateVisitor(Visitor visitor);
|
||||
Visitor GetVisitor(int visitorId);
|
||||
void DeleteVisitor(int visitorId);
|
||||
int DeleteVisitors(int age);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Oqtane.Models;
|
||||
|
||||
@ -47,5 +48,23 @@ namespace Oqtane.Repository
|
||||
_db.Log.Add(log);
|
||||
_db.SaveChanges();
|
||||
}
|
||||
|
||||
public int DeleteLogs(int age)
|
||||
{
|
||||
// delete logs in batches of 100 records
|
||||
int count = 0;
|
||||
var purgedate = DateTime.Now.AddDays(-age);
|
||||
var logs = _db.Log.Where(item => item.Level != "Error" && item.LogDate < purgedate)
|
||||
.OrderBy(item => item.LogDate).Take(100).ToList();
|
||||
while (logs.Count > 0)
|
||||
{
|
||||
count += logs.Count;
|
||||
_db.Log.RemoveRange(logs);
|
||||
_db.SaveChanges();
|
||||
logs = _db.Log.Where(item => item.Level != "Error" && item.LogDate < purgedate)
|
||||
.OrderBy(item => item.LogDate).Take(100).ToList();
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -77,6 +77,18 @@ namespace Oqtane.Repository
|
||||
}
|
||||
}
|
||||
|
||||
public Setting GetSetting(string entityName, int entityId, string settingName)
|
||||
{
|
||||
if (IsMaster(entityName))
|
||||
{
|
||||
return _master.Setting.Where(item => item.EntityName == entityName && item.EntityId == entityId && item.SettingName == settingName).FirstOrDefault();
|
||||
}
|
||||
else
|
||||
{
|
||||
return _tenant.Setting.Where(item => item.EntityName == entityName && item.EntityId == entityId && item.SettingName == settingName).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
|
||||
public void DeleteSetting(string entityName, int settingId)
|
||||
{
|
||||
if (IsMaster(entityName))
|
||||
|
@ -47,5 +47,23 @@ namespace Oqtane.Repository
|
||||
_db.Visitor.Remove(visitor);
|
||||
_db.SaveChanges();
|
||||
}
|
||||
|
||||
public int DeleteVisitors(int age)
|
||||
{
|
||||
// delete visitors in batches of 100 records
|
||||
int count = 0;
|
||||
var purgedate = DateTime.Now.AddDays(-age);
|
||||
var visitors = _db.Visitor.Where(item => item.Visits <= 1 && item.VisitedOn < purgedate)
|
||||
.OrderBy(item => item.VisitedOn).Take(100).ToList();
|
||||
while (visitors.Count > 0)
|
||||
{
|
||||
count += visitors.Count;
|
||||
_db.Visitor.RemoveRange(visitors);
|
||||
_db.SaveChanges();
|
||||
visitors = _db.Visitor.Where(item => item.Visits < 2 && item.VisitedOn < purgedate)
|
||||
.OrderBy(item => item.VisitedOn).Take(100).ToList();
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user