include purge job for maintaining event logs and visitor logs
This commit is contained in:
		| @ -1,6 +1,7 @@ | ||||
| @namespace Oqtane.Modules.Admin.Logs | ||||
| @inherits ModuleBase | ||||
| @inject ILogService LogService | ||||
| @inject ISettingService SettingService | ||||
| @inject IStringLocalizer<Index> Localizer | ||||
| @inject IStringLocalizer<SharedResources> SharedLocalizer | ||||
|  | ||||
| @ -10,67 +11,83 @@ | ||||
| } | ||||
| else | ||||
| { | ||||
|     <div class="container g-0"> | ||||
|         <div class="row mb-1 align-items-center"> | ||||
|             <div class="col-sm-4"> | ||||
|                 <Label For="level" HelpText="Select the log level for event log items" ResourceKey="Level">Level: </Label><br /><br /> | ||||
|                 <select id="level" class="form-select" @onchange="(e => LevelChanged(e))"> | ||||
|                     <option value="-"><@Localizer["AllLevels"]></option> | ||||
|                     <option value="Trace">@Localizer["Trace"]</option> | ||||
|                     <option value="Debug">@Localizer["Debug"]</option> | ||||
|                     <option value="Information">@Localizer["Information"]</option> | ||||
|                     <option value="Warning">@Localizer["Warning"]</option> | ||||
|                     <option value="Error">@Localizer["Error"]</option> | ||||
|                     <option value="Critical">@Localizer["Critical"]</option> | ||||
|                 </select> | ||||
|             </div>             | ||||
|             <div class="col-sm-4"> | ||||
|                 <Label For="function" HelpText="Select the function for event log items" ResourceKey="Function">Function: </Label><br /><br /> | ||||
|                 <select id="function" class="form-select" @onchange="(e => FunctionChanged(e))"> | ||||
|                     <option value="-"><@Localizer["AllFunctions"]></option> | ||||
|                     <option value="Create">@Localizer["Create"]</option> | ||||
|                     <option value="Read">@Localizer["Read"]</option> | ||||
|                     <option value="Update">@SharedLocalizer["Update"]</option> | ||||
|                     <option value="Delete">@SharedLocalizer["Delete"]</option> | ||||
|                     <option value="Security">@Localizer["Security"]</option> | ||||
|                     <option value="Other">@Localizer["Other"]</option> | ||||
|                 </select> | ||||
|             </div>             | ||||
|             <div class="col-sm-4"> | ||||
|                 <Label For="rows" HelpText="Select the maximum number of event log items to review. Please note that if you choose more than 10 items the information will be split into pages." ResourceKey="Rows">Maximum Items: </Label><br /><br /> | ||||
|                 <select id="rows" class="form-select" @onchange="(e => RowsChanged(e))"> | ||||
|                     <option value="10">10</option> | ||||
|                     <option value="50">50</option> | ||||
|                     <option value="100">100</option> | ||||
|                 </select> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| 	<br /> | ||||
|     <TabStrip> | ||||
|         <TabPanel Name="Events" Heading="Events" ResourceKey="Events"> | ||||
| 			<div class="container g-0"> | ||||
| 				<div class="row mb-1 align-items-center"> | ||||
| 					<div class="col-sm-4"> | ||||
| 						<Label For="level" HelpText="Select the log level for event log items" ResourceKey="Level">Level: </Label><br /><br /> | ||||
| 						<select id="level" class="form-select" @onchange="(e => LevelChanged(e))"> | ||||
| 							<option value="-"><@Localizer["AllLevels"]></option> | ||||
| 							<option value="Trace">@Localizer["Trace"]</option> | ||||
| 							<option value="Debug">@Localizer["Debug"]</option> | ||||
| 							<option value="Information">@Localizer["Information"]</option> | ||||
| 							<option value="Warning">@Localizer["Warning"]</option> | ||||
| 							<option value="Error">@Localizer["Error"]</option> | ||||
| 							<option value="Critical">@Localizer["Critical"]</option> | ||||
| 						</select> | ||||
| 					</div>             | ||||
| 					<div class="col-sm-4"> | ||||
| 						<Label For="function" HelpText="Select the function for event log items" ResourceKey="Function">Function: </Label><br /><br /> | ||||
| 						<select id="function" class="form-select" @onchange="(e => FunctionChanged(e))"> | ||||
| 							<option value="-"><@Localizer["AllFunctions"]></option> | ||||
| 							<option value="Create">@Localizer["Create"]</option> | ||||
| 							<option value="Read">@Localizer["Read"]</option> | ||||
| 							<option value="Update">@SharedLocalizer["Update"]</option> | ||||
| 							<option value="Delete">@SharedLocalizer["Delete"]</option> | ||||
| 							<option value="Security">@Localizer["Security"]</option> | ||||
| 							<option value="Other">@Localizer["Other"]</option> | ||||
| 						</select> | ||||
| 					</div>             | ||||
| 					<div class="col-sm-4"> | ||||
| 						<Label For="rows" HelpText="Select the maximum number of event log items to review. Please note that if you choose more than 10 items the information will be split into pages." ResourceKey="Rows">Maximum Items: </Label><br /><br /> | ||||
| 						<select id="rows" class="form-select" @onchange="(e => RowsChanged(e))"> | ||||
| 							<option value="10">10</option> | ||||
| 							<option value="50">50</option> | ||||
| 							<option value="100">100</option> | ||||
| 						</select> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<br /> | ||||
|  | ||||
|     @if (_logs.Any()) | ||||
|     { | ||||
|         <Pager Items="@_logs"> | ||||
|             <Header> | ||||
| 				<th style="width: 1px;"> </th> | ||||
| 				<th>@Localizer["Date"]</th> | ||||
| 				<th>@Localizer["Level"]</th> | ||||
| 				<th>@Localizer["Feature"]</th> | ||||
| 				<th>@Localizer["Function"]</th> | ||||
|             </Header> | ||||
|             <Row> | ||||
|                 <td class="@GetClass(context.Function)"><ActionLink Action="Detail" Parameters="@($"id=" + context.LogId.ToString())" ResourceKey="LogDetails" /></td> | ||||
|                 <td class="@GetClass(context.Function)">@context.LogDate</td> | ||||
|                 <td class="@GetClass(context.Function)">@context.Level</td> | ||||
|                 <td class="@GetClass(context.Function)">@context.Feature</td> | ||||
|                 <td class="@GetClass(context.Function)">@context.Function</td> | ||||
|             </Row> | ||||
|         </Pager> | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         <p><em>@Localizer["NoLogs"]</em></p> | ||||
|     } | ||||
| 			@if (_logs.Any()) | ||||
| 			{ | ||||
| 				<Pager Items="@_logs"> | ||||
| 					<Header> | ||||
| 						<th style="width: 1px;"> </th> | ||||
| 						<th>@Localizer["Date"]</th> | ||||
| 						<th>@Localizer["Level"]</th> | ||||
| 						<th>@Localizer["Feature"]</th> | ||||
| 						<th>@Localizer["Function"]</th> | ||||
| 					</Header> | ||||
| 					<Row> | ||||
| 						<td class="@GetClass(context.Function)"><ActionLink Action="Detail" Parameters="@($"id=" + context.LogId.ToString())" ResourceKey="LogDetails" /></td> | ||||
| 						<td class="@GetClass(context.Function)">@context.LogDate</td> | ||||
| 						<td class="@GetClass(context.Function)">@context.Level</td> | ||||
| 						<td class="@GetClass(context.Function)">@context.Feature</td> | ||||
| 						<td class="@GetClass(context.Function)">@context.Function</td> | ||||
| 					</Row> | ||||
| 				</Pager> | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				<p><em>@Localizer["NoLogs"]</em></p> | ||||
| 			} | ||||
| 		</TabPanel> | ||||
|         <TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings"> | ||||
| 			<div class="container"> | ||||
| 				<div class="row mb-1 align-items-center"> | ||||
| 					<Label Class="col-sm-3" For="retention" HelpText="Number of days of events to retain" ResourceKey="Retention">Retention (Days): </Label> | ||||
| 					<div class="col-sm-9"> | ||||
| 						<input id="retention" class="form-control" @bind="@_retention" /> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<br /> | ||||
| 			<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button> | ||||
| 		</TabPanel> | ||||
| 	</TabStrip> | ||||
| } | ||||
|  | ||||
| @code { | ||||
| @ -78,6 +95,7 @@ else | ||||
|     private string _function = "-"; | ||||
|     private string _rows = "10"; | ||||
|     private List<Log> _logs; | ||||
|     private string _retention = ""; | ||||
|  | ||||
|     public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; | ||||
|  | ||||
| @ -86,6 +104,7 @@ else | ||||
|         try | ||||
|         { | ||||
|             await GetLogs(); | ||||
| 			_retention = SettingService.GetSetting(PageState.Site.Settings, "LogRetention", "30"); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
| @ -171,4 +190,22 @@ else | ||||
|         } | ||||
|         return classname; | ||||
|     } | ||||
|  | ||||
| 	private async Task SaveSiteSettings() | ||||
| 	{ | ||||
| 		try | ||||
| 		{ | ||||
| 			var settings = PageState.Site.Settings; | ||||
| 			settings = SettingService.SetSetting(settings, "LogRetention", _retention); | ||||
|             await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId); | ||||
|  | ||||
| 			AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success); | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
| 		{ | ||||
| 			await logger.LogError(ex, "Error Saving Site Settings {Error}", ex.Message); | ||||
| 			AddModuleMessage(Localizer["Error.SaveSiteSettings"], MessageType.Error); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| @inherits ModuleBase | ||||
| @inject IVisitorService VisitorService | ||||
| @inject ISiteService SiteService | ||||
| @inject ISettingService SettingService | ||||
| @inject IStringLocalizer<Index> Localizer | ||||
| @inject IStringLocalizer<SharedResources> SharedLocalizer | ||||
|  | ||||
| @ -56,18 +57,30 @@ else | ||||
| 					<td>@context.CreatedOn</td> | ||||
| 				</Row> | ||||
| 			</Pager> | ||||
| 	</TabPanel> | ||||
| 		</TabPanel> | ||||
|         <TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings"> | ||||
| 			<div class="container"> | ||||
| 				<div class="row mb-1 align-items-center"> | ||||
| 					<Label Class="col-sm-3" For="visitortracking" HelpText="Specify if visitor tracking is enabled" ResourceKey="VisitorTracking">Visitor Tracking Enabled? </Label> | ||||
| 					<Label Class="col-sm-3" For="tracking" HelpText="Specify if visitor tracking is enabled" ResourceKey="Tracking">Tracking Enabled? </Label> | ||||
| 					<div class="col-sm-9"> | ||||
| 						<select id="visitortracking" class="form-select" @bind="@_visitortracking" > | ||||
| 						<select id="tracking" class="form-select" @bind="@_tracking" > | ||||
| 							<option value="True">@SharedLocalizer["Yes"]</option> | ||||
| 							<option value="False">@SharedLocalizer["No"]</option> | ||||
| 						</select> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 				<div class="row mb-1 align-items-center"> | ||||
| 					<Label Class="col-sm-3" For="filter" HelpText="Comma delimited list of terms which may exist in IP addresses, user agents, or languages which identify visitors which should not be tracked (ie. bots)" ResourceKey="Filter">Filter: </Label> | ||||
| 					<div class="col-sm-9"> | ||||
| 						<textarea id="filter" class="form-control" @bind="@_filter" rows="3"></textarea> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 				<div class="row mb-1 align-items-center"> | ||||
| 					<Label Class="col-sm-3" For="retention" HelpText="Number of days of visitor activity to retain" ResourceKey="Retention">Retention (Days): </Label> | ||||
| 					<div class="col-sm-9"> | ||||
| 						<input id="retention" class="form-control" @bind="@_retention" /> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<br /> | ||||
| 			<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button> | ||||
| @ -79,14 +92,18 @@ else | ||||
| 	private bool _users = false; | ||||
| 	private int _days = 1; | ||||
| 	private List<Visitor> _visitors; | ||||
| 	private string _visitortracking; | ||||
| 	private string _tracking; | ||||
| 	private string _filter = ""; | ||||
| 	private string _retention = ""; | ||||
|  | ||||
| 	public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; | ||||
|  | ||||
| 	protected override async Task OnParametersSetAsync() | ||||
| 	{ | ||||
| 		await GetVisitors(); | ||||
| 		_visitortracking = PageState.Site.VisitorTracking.ToString(); | ||||
| 		_tracking = PageState.Site.VisitorTracking.ToString(); | ||||
| 		_filter = SettingService.GetSetting(PageState.Site.Settings, "VisitorFilter", ""); | ||||
| 		_retention = SettingService.GetSetting(PageState.Site.Settings, "VisitorRetention", "30"); | ||||
| 	} | ||||
|  | ||||
| 	private async void TypeChanged(ChangeEventArgs e) | ||||
| @ -124,15 +141,21 @@ else | ||||
| 		{ | ||||
| 			_visitors = _visitors.Where(item => item.UserId != null).ToList(); | ||||
| 		} | ||||
|     } | ||||
| 	} | ||||
|  | ||||
| 	private async Task SaveSiteSettings() | ||||
| 	{ | ||||
| 		try | ||||
| 		{ | ||||
| 			var site = PageState.Site; | ||||
| 			site.VisitorTracking = bool.Parse(_visitortracking); | ||||
| 			site.VisitorTracking = bool.Parse(_tracking); | ||||
| 			await SiteService.UpdateSiteAsync(site); | ||||
|  | ||||
| 			var settings = PageState.Site.Settings; | ||||
| 			settings = SettingService.SetSetting(settings, "VisitorFilter", _filter); | ||||
| 			settings = SettingService.SetSetting(settings, "VisitorRetention", _retention); | ||||
|             await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId); | ||||
|  | ||||
| 			AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success); | ||||
| 		} | ||||
| 		catch (Exception ex) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Shaun Walker
					Shaun Walker