diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index 2bd43685..9a1eb15d 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -131,7 +131,7 @@ } else { - await logger.LogError(LogFunction.Security, "Login Failed For Username {Username}", _username); + await logger.LogInformation(LogFunction.Security, "Login Failed For Username {Username}", _username); AddModuleMessage(Localizer["Error.Login.Fail"], MessageType.Error); } } @@ -152,7 +152,7 @@ } else { - await logger.LogError(LogFunction.Security, "Login Failed For Username {Username}", _username); + await logger.LogInformation(LogFunction.Security, "Login Failed For Username {Username}", _username); AddModuleMessage(Localizer["Error.Login.Fail"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor index ef09cd2a..0fe5c328 100644 --- a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor +++ b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor @@ -69,6 +69,21 @@ + + + + +
+ +
+
@@ -110,6 +125,7 @@ private string _detailederrors = string.Empty; private string _logginglevel = string.Empty; + private string _notificationlevel = string.Empty; private string _swagger = string.Empty; private string _packageservice = string.Empty; @@ -128,6 +144,7 @@ _detailederrors = systeminfo["detailederrors"]; _logginglevel = systeminfo["logginglevel"]; + _notificationlevel = systeminfo["notificationlevel"]; _swagger = systeminfo["swagger"]; _packageservice = systeminfo["packageservice"]; } @@ -140,6 +157,7 @@ var settings = new Dictionary(); settings.Add("detailederrors", _detailederrors); settings.Add("logginglevel", _logginglevel); + settings.Add("notificationlevel", _notificationlevel); settings.Add("swagger", _swagger); settings.Add("packageservice", _packageservice); await SystemService.UpdateSystemInfoAsync(settings); diff --git a/Oqtane.Client/Resources/Modules/Admin/SystemInfo/Index.resx b/Oqtane.Client/Resources/Modules/Admin/SystemInfo/Index.resx index e564fcf8..95a0fcc9 100644 --- a/Oqtane.Client/Resources/Modules/Admin/SystemInfo/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/SystemInfo/Index.resx @@ -231,4 +231,13 @@ Restart Application + + None + + + The Minimum Logging Level For Which Notifications Should Be Sent To Host Users. + + + Notification Level: + \ No newline at end of file diff --git a/Oqtane.Server/Controllers/SystemController.cs b/Oqtane.Server/Controllers/SystemController.cs index 6ec0fe11..0991c60f 100644 --- a/Oqtane.Server/Controllers/SystemController.cs +++ b/Oqtane.Server/Controllers/SystemController.cs @@ -38,6 +38,7 @@ namespace Oqtane.Controllers systeminfo.Add("rendermode", _configManager.GetSetting("RenderMode", "ServerPrerendered")); systeminfo.Add("detailederrors", _configManager.GetSetting("DetailedErrors", "false")); systeminfo.Add("logginglevel", _configManager.GetSetting("Logging:LogLevel:Default", "Information")); + systeminfo.Add("notificationlevel", _configManager.GetSetting("Logging:LogLevel:Notify", "Error")); systeminfo.Add("swagger", _configManager.GetSetting("UseSwagger", "true")); systeminfo.Add("packageservice", _configManager.GetSetting("PackageService", "true")); @@ -64,6 +65,9 @@ namespace Oqtane.Controllers case "logginglevel": _configManager.AddOrUpdateSetting("Logging:LogLevel:Default", kvp.Value, false); break; + case "notificationlevel": + _configManager.AddOrUpdateSetting("Logging:LogLevel:Notify", kvp.Value, false); + break; case "swagger": _configManager.AddOrUpdateSetting("UseSwagger", kvp.Value, false); break; diff --git a/Oqtane.Server/Infrastructure/LogManager.cs b/Oqtane.Server/Infrastructure/LogManager.cs index e8f58854..5a1d9984 100644 --- a/Oqtane.Server/Infrastructure/LogManager.cs +++ b/Oqtane.Server/Infrastructure/LogManager.cs @@ -18,14 +18,18 @@ namespace Oqtane.Infrastructure private readonly IConfigManager _config; private readonly IUserPermissions _userPermissions; private readonly IHttpContextAccessor _accessor; + private readonly IUserRoleRepository _userRoles; + private readonly INotificationRepository _notifications; - public LogManager(ILogRepository logs, ITenantManager tenantManager, IConfigManager config, IUserPermissions userPermissions, IHttpContextAccessor accessor) + public LogManager(ILogRepository logs, ITenantManager tenantManager, IConfigManager config, IUserPermissions userPermissions, IHttpContextAccessor accessor, IUserRoleRepository userRoles, INotificationRepository notifications) { _logs = logs; _tenantManager = tenantManager; _config = config; _userPermissions = userPermissions; _accessor = accessor; + _userRoles = userRoles; + _notifications = notifications; } public void Log(LogLevel level, object @class, LogFunction function, string message, params object[] args) @@ -124,11 +128,11 @@ namespace Oqtane.Infrastructure try { _logs.AddLog(log); + SendNotification(log); } - catch (Exception ex) + catch { // an error occurred writing to the database - var x = ex.Message; } } } @@ -188,5 +192,28 @@ namespace Oqtane.Infrastructure } return log; } + + private void SendNotification(Log log) + { + LogLevel notifylevel = LogLevel.Error; + var section = _config.GetSection("Logging:LogLevel:Notify"); + if (section.Exists()) + { + notifylevel = Enum.Parse(section.Value); + } + if (Enum.Parse(log.Level) >= notifylevel) + { + foreach (var userrole in _userRoles.GetUserRoles(log.SiteId.Value)) + { + if (userrole.Role.Name == RoleNames.Host) + { + var url = _accessor.HttpContext.Request.Scheme + "://" + _tenantManager.GetAlias().Name + "/admin/log"; + var notification = new Notification(log.SiteId.Value, null, userrole.User, "Site " + log.Level + " Notification", "Please visit " + url + " for more information", null); + _notifications.AddNotification(notification); + } + } + + } + } } } diff --git a/Oqtane.Shared/Enums/LogLevel.cs b/Oqtane.Shared/Enums/LogLevel.cs index f772157e..79ba84c9 100644 --- a/Oqtane.Shared/Enums/LogLevel.cs +++ b/Oqtane.Shared/Enums/LogLevel.cs @@ -1,4 +1,4 @@ -namespace Oqtane.Shared +namespace Oqtane.Shared { public enum LogLevel { @@ -7,6 +7,7 @@ Information, Warning, Error, - Critical + Critical, + None } }