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
}
}