diff --git a/bitwarden_license/src/Scim/Program.cs b/bitwarden_license/src/Scim/Program.cs index 48d5711e1..5d7d505aa 100644 --- a/bitwarden_license/src/Scim/Program.cs +++ b/bitwarden_license/src/Scim/Program.cs @@ -1,5 +1,4 @@ using Bit.Core.Utilities; -using Serilog.Events; namespace Bit.Scim; @@ -13,7 +12,7 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => + logging.AddSerilog(hostingContext, (e, globalSettings) => { var context = e.Properties["SourceContext"].ToString(); @@ -24,7 +23,7 @@ public class Program return false; } - return e.Level >= LogEventLevel.Warning; + return e.Level >= globalSettings.MinLogLevel.ScimSettings.Default; })); }) .Build() diff --git a/bitwarden_license/src/Sso/Program.cs b/bitwarden_license/src/Sso/Program.cs index 672c73bfb..051caca9c 100644 --- a/bitwarden_license/src/Sso/Program.cs +++ b/bitwarden_license/src/Sso/Program.cs @@ -1,6 +1,5 @@ using Bit.Core.Utilities; using Serilog; -using Serilog.Events; namespace Bit.Sso; @@ -15,7 +14,7 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => + logging.AddSerilog(hostingContext, (e, globalSettings) => { var context = e.Properties["SourceContext"].ToString(); if (e.Properties.ContainsKey("RequestPath") && @@ -24,7 +23,7 @@ public class Program { return false; } - return e.Level >= LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.SsoSettings.Default; })); }) .Build() diff --git a/src/Admin/Program.cs b/src/Admin/Program.cs index f5bc877ab..fb5dc7e08 100644 --- a/src/Admin/Program.cs +++ b/src/Admin/Program.cs @@ -1,5 +1,4 @@ using Bit.Core.Utilities; -using Serilog.Events; namespace Bit.Admin; @@ -18,7 +17,7 @@ public class Program }); webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => + logging.AddSerilog(hostingContext, (e, globalSettings) => { var context = e.Properties["SourceContext"].ToString(); if (e.Properties.ContainsKey("RequestPath") && @@ -27,7 +26,7 @@ public class Program { return false; } - return e.Level >= LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.AdminSettings.Default; })); }) .Build() diff --git a/src/Api/Program.cs b/src/Api/Program.cs index b7e80d6c2..b44ffa835 100644 --- a/src/Api/Program.cs +++ b/src/Api/Program.cs @@ -1,7 +1,6 @@ using AspNetCoreRateLimit; using Bit.Core.Utilities; using Microsoft.IdentityModel.Tokens; -using Serilog.Events; namespace Bit.Api; @@ -16,7 +15,7 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => + logging.AddSerilog(hostingContext, (e, globalSettings) => { var context = e.Properties["SourceContext"].ToString(); if (e.Exception != null && @@ -26,19 +25,19 @@ public class Program return false; } - if (e.Level == LogEventLevel.Information && + if ( context.Contains(typeof(IpRateLimitMiddleware).FullName)) { - return true; + return e.Level >= globalSettings.MinLogLevel.ApiSettings.IpRateLimit; } if (context.Contains("IdentityServer4.Validation.TokenValidator") || context.Contains("IdentityServer4.Validation.TokenRequestValidator")) { - return e.Level > LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.ApiSettings.IdentityToken; } - return e.Level >= LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.ApiSettings.Default; })); }) .Build() diff --git a/src/Billing/Program.cs b/src/Billing/Program.cs index d7ebadd92..33e266542 100644 --- a/src/Billing/Program.cs +++ b/src/Billing/Program.cs @@ -1,5 +1,4 @@ using Bit.Core.Utilities; -using Serilog.Events; namespace Bit.Billing; @@ -13,13 +12,12 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => + logging.AddSerilog(hostingContext, (e, globalSettings) => { var context = e.Properties["SourceContext"].ToString(); - if (e.Level == LogEventLevel.Information && - (context.StartsWith("\"Bit.Billing.Jobs") || context.StartsWith("\"Bit.Core.Jobs"))) + if (context.StartsWith("\"Bit.Billing.Jobs") || context.StartsWith("\"Bit.Core.Jobs")) { - return true; + return e.Level >= globalSettings.MinLogLevel.BillingSettings.Jobs; } if (e.Properties.ContainsKey("RequestPath") && @@ -29,7 +27,7 @@ public class Program return false; } - return e.Level >= LogEventLevel.Warning; + return e.Level >= globalSettings.MinLogLevel.BillingSettings.Default; })); }) .Build() diff --git a/src/Core/OrganizationFeatures/OrganizationServiceCollectionExtensions.cs b/src/Core/OrganizationFeatures/OrganizationServiceCollectionExtensions.cs index e428318c5..4a6fbf3f7 100644 --- a/src/Core/OrganizationFeatures/OrganizationServiceCollectionExtensions.cs +++ b/src/Core/OrganizationFeatures/OrganizationServiceCollectionExtensions.cs @@ -12,6 +12,7 @@ using Bit.Core.Settings; using Bit.Core.Tokens; using Microsoft.AspNetCore.DataProtection; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; namespace Bit.Core.OrganizationFeatures; @@ -70,7 +71,8 @@ public static class OrganizationServiceCollectionExtensions new DataProtectorTokenFactory( OrganizationSponsorshipOfferTokenable.ClearTextPrefix, OrganizationSponsorshipOfferTokenable.DataProtectorPurpose, - serviceProvider.GetDataProtectionProvider()) + serviceProvider.GetDataProtectionProvider(), + serviceProvider.GetRequiredService>>()) ); } } diff --git a/src/Core/Settings/GlobalSettings.cs b/src/Core/Settings/GlobalSettings.cs index c75a74ba7..93a7188ca 100644 --- a/src/Core/Settings/GlobalSettings.cs +++ b/src/Core/Settings/GlobalSettings.cs @@ -1,4 +1,6 @@ -namespace Bit.Core.Settings; +using Bit.Core.Settings.LoggingSettings; + +namespace Bit.Core.Settings; public class GlobalSettings : IGlobalSettings { @@ -58,6 +60,7 @@ public class GlobalSettings : IGlobalSettings public virtual DocumentDbSettings DocumentDb { get; set; } = new DocumentDbSettings(); public virtual SentrySettings Sentry { get; set; } = new SentrySettings(); public virtual SyslogSettings Syslog { get; set; } = new SyslogSettings(); + public virtual ILogLevelSettings MinLogLevel { get; set; } = new LogLevelSettings(); public virtual NotificationHubSettings NotificationHub { get; set; } = new NotificationHubSettings(); public virtual YubicoSettings Yubico { get; set; } = new YubicoSettings(); public virtual DuoSettings Duo { get; set; } = new DuoSettings(); diff --git a/src/Core/Settings/IGlobalSettings.cs b/src/Core/Settings/IGlobalSettings.cs index 16a06c3ec..9ed58669c 100644 --- a/src/Core/Settings/IGlobalSettings.cs +++ b/src/Core/Settings/IGlobalSettings.cs @@ -15,5 +15,6 @@ public interface IGlobalSettings IBaseServiceUriSettings BaseServiceUri { get; set; } ITwoFactorAuthSettings TwoFactorAuth { get; set; } ISsoSettings Sso { get; set; } + ILogLevelSettings MinLogLevel { get; set; } IPasswordlessAuthSettings PasswordlessAuth { get; set; } } diff --git a/src/Core/Settings/ILogLevelSettings.cs b/src/Core/Settings/ILogLevelSettings.cs new file mode 100644 index 000000000..b3cedf083 --- /dev/null +++ b/src/Core/Settings/ILogLevelSettings.cs @@ -0,0 +1,74 @@ +using Serilog.Events; + +namespace Bit.Core.Settings; + +public interface ILogLevelSettings +{ + IBillingLogLevelSettings BillingSettings { get; set; } + IApiLogLevelSettings ApiSettings { get; set; } + IIdentityLogLevelSettings IdentitySettings { get; set; } + IScimLogLevelSettings ScimSettings { get; set; } + ISsoLogLevelSettings SsoSettings { get; set; } + IAdminLogLevelSettings AdminSettings { get; set; } + IEventsLogLevelSettings EventsSettings { get; set; } + IEventsProcessorLogLevelSettings EventsProcessorSettings { get; set; } + IIconsLogLevelSettings IconsSettings { get; set; } + INotificationsLogLevelSettings NotificationsSettings { get; set; } +} + +public interface IBillingLogLevelSettings +{ + LogEventLevel Default { get; set; } + LogEventLevel Jobs { get; set; } +} + +public interface IApiLogLevelSettings +{ + LogEventLevel Default { get; set; } + LogEventLevel IdentityToken { get; set; } + LogEventLevel IpRateLimit { get; set; } +} + +public interface IIdentityLogLevelSettings +{ + LogEventLevel Default { get; set; } + LogEventLevel IdentityToken { get; set; } + LogEventLevel IpRateLimit { get; set; } +} + +public interface IScimLogLevelSettings +{ + LogEventLevel Default { get; set; } +} + +public interface ISsoLogLevelSettings +{ + LogEventLevel Default { get; set; } +} + +public interface IAdminLogLevelSettings +{ + LogEventLevel Default { get; set; } +} + +public interface IEventsLogLevelSettings +{ + LogEventLevel Default { get; set; } + LogEventLevel IdentityToken { get; set; } +} + +public interface IEventsProcessorLogLevelSettings +{ + LogEventLevel Default { get; set; } +} + +public interface IIconsLogLevelSettings +{ + LogEventLevel Default { get; set; } +} + +public interface INotificationsLogLevelSettings +{ + LogEventLevel Default { get; set; } + LogEventLevel IdentityToken { get; set; } +} diff --git a/src/Core/Settings/LoggingSettings/AdminLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/AdminLogLevelSettings.cs new file mode 100644 index 000000000..d2c74dd07 --- /dev/null +++ b/src/Core/Settings/LoggingSettings/AdminLogLevelSettings.cs @@ -0,0 +1,8 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class AdminLogLevelSettings : IAdminLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Error; +} diff --git a/src/Core/Settings/LoggingSettings/ApiLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/ApiLogLevelSettings.cs new file mode 100644 index 000000000..7961ab7e3 --- /dev/null +++ b/src/Core/Settings/LoggingSettings/ApiLogLevelSettings.cs @@ -0,0 +1,10 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class ApiLogLevelSettings : IApiLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Error; + public LogEventLevel IdentityToken { get; set; } = LogEventLevel.Fatal; + public LogEventLevel IpRateLimit { get; set; } = LogEventLevel.Information; +} diff --git a/src/Core/Settings/LoggingSettings/BillingLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/BillingLogLevelSettings.cs new file mode 100644 index 000000000..b9e53e6bc --- /dev/null +++ b/src/Core/Settings/LoggingSettings/BillingLogLevelSettings.cs @@ -0,0 +1,9 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class BillingLogLevelSettings : IBillingLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Warning; + public LogEventLevel Jobs { get; set; } = LogEventLevel.Information; +} diff --git a/src/Core/Settings/LoggingSettings/EventsLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/EventsLogLevelSettings.cs new file mode 100644 index 000000000..320174855 --- /dev/null +++ b/src/Core/Settings/LoggingSettings/EventsLogLevelSettings.cs @@ -0,0 +1,9 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class EventsLogLevelSettings : IEventsLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Error; + public LogEventLevel IdentityToken { get; set; } = LogEventLevel.Fatal; +} diff --git a/src/Core/Settings/LoggingSettings/EventsProcessorLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/EventsProcessorLogLevelSettings.cs new file mode 100644 index 000000000..5aff18a21 --- /dev/null +++ b/src/Core/Settings/LoggingSettings/EventsProcessorLogLevelSettings.cs @@ -0,0 +1,8 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class EventsProcessorLogLevelSettings : IEventsProcessorLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Warning; +} diff --git a/src/Core/Settings/LoggingSettings/IconsLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/IconsLogLevelSettings.cs new file mode 100644 index 000000000..c7b73ba68 --- /dev/null +++ b/src/Core/Settings/LoggingSettings/IconsLogLevelSettings.cs @@ -0,0 +1,8 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class IconsLogLevelSettings : IIconsLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Error; +} diff --git a/src/Core/Settings/LoggingSettings/IdentityLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/IdentityLogLevelSettings.cs new file mode 100644 index 000000000..a823cb510 --- /dev/null +++ b/src/Core/Settings/LoggingSettings/IdentityLogLevelSettings.cs @@ -0,0 +1,10 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class IdentityLogLevelSettings : IIdentityLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Error; + public LogEventLevel IdentityToken { get; set; } = LogEventLevel.Fatal; + public LogEventLevel IpRateLimit { get; set; } = LogEventLevel.Information; +} diff --git a/src/Core/Settings/LoggingSettings/LogLevelSettings.cs b/src/Core/Settings/LoggingSettings/LogLevelSettings.cs new file mode 100644 index 000000000..1af05ebfd --- /dev/null +++ b/src/Core/Settings/LoggingSettings/LogLevelSettings.cs @@ -0,0 +1,16 @@ + +namespace Bit.Core.Settings.LoggingSettings; + +public class LogLevelSettings : ILogLevelSettings +{ + public IBillingLogLevelSettings BillingSettings { get; set; } = new BillingLogLevelSettings(); + public IApiLogLevelSettings ApiSettings { get; set; } = new ApiLogLevelSettings(); + public IIdentityLogLevelSettings IdentitySettings { get; set; } = new IdentityLogLevelSettings(); + public IScimLogLevelSettings ScimSettings { get; set; } = new ScimLogLevelSettings(); + public ISsoLogLevelSettings SsoSettings { get; set; } = new SsoLogLevelSettings(); + public IAdminLogLevelSettings AdminSettings { get; set; } = new AdminLogLevelSettings(); + public IEventsLogLevelSettings EventsSettings { get; set; } = new EventsLogLevelSettings(); + public IEventsProcessorLogLevelSettings EventsProcessorSettings { get; set; } = new EventsProcessorLogLevelSettings(); + public IIconsLogLevelSettings IconsSettings { get; set; } = new IconsLogLevelSettings(); + public INotificationsLogLevelSettings NotificationsSettings { get; set; } = new NotificationsLogLevelSettings(); +} diff --git a/src/Core/Settings/LoggingSettings/NotificationsLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/NotificationsLogLevelSettings.cs new file mode 100644 index 000000000..3494fbfcc --- /dev/null +++ b/src/Core/Settings/LoggingSettings/NotificationsLogLevelSettings.cs @@ -0,0 +1,9 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class NotificationsLogLevelSettings : INotificationsLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Warning; + public LogEventLevel IdentityToken { get; set; } = LogEventLevel.Fatal; +} diff --git a/src/Core/Settings/LoggingSettings/ScimLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/ScimLogLevelSettings.cs new file mode 100644 index 000000000..f297b17e9 --- /dev/null +++ b/src/Core/Settings/LoggingSettings/ScimLogLevelSettings.cs @@ -0,0 +1,8 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class ScimLogLevelSettings : IScimLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Warning; +} diff --git a/src/Core/Settings/LoggingSettings/SsoLogLevelSettings.cs b/src/Core/Settings/LoggingSettings/SsoLogLevelSettings.cs new file mode 100644 index 000000000..495ec41fd --- /dev/null +++ b/src/Core/Settings/LoggingSettings/SsoLogLevelSettings.cs @@ -0,0 +1,8 @@ +using Serilog.Events; + +namespace Bit.Core.Settings.LoggingSettings; + +public class SsoLogLevelSettings : ISsoLogLevelSettings +{ + public LogEventLevel Default { get; set; } = LogEventLevel.Error; +} diff --git a/src/Core/Tokens/DataProtectorTokenFactory.cs b/src/Core/Tokens/DataProtectorTokenFactory.cs index e0ec9811f..ad703cb58 100644 --- a/src/Core/Tokens/DataProtectorTokenFactory.cs +++ b/src/Core/Tokens/DataProtectorTokenFactory.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.DataProtection; +using Microsoft.Extensions.Logging; namespace Bit.Core.Tokens; @@ -6,15 +7,17 @@ public class DataProtectorTokenFactory : IDataProtectorTokenFactory where { private readonly IDataProtector _dataProtector; private readonly string _clearTextPrefix; + private readonly ILogger> _logger; - public DataProtectorTokenFactory(string clearTextPrefix, string purpose, IDataProtectionProvider dataProtectionProvider) + public DataProtectorTokenFactory(string clearTextPrefix, string purpose, IDataProtectionProvider dataProtectionProvider, ILogger> logger) { _dataProtector = dataProtectionProvider.CreateProtector(purpose); _clearTextPrefix = clearTextPrefix; + _logger = logger; } public string Protect(T data) => - data.ToToken().ProtectWith(_dataProtector).WithPrefix(_clearTextPrefix).ToString(); + data.ToToken().ProtectWith(_dataProtector, _logger).WithPrefix(_clearTextPrefix).ToString(); /// /// Unprotect token @@ -24,7 +27,7 @@ public class DataProtectorTokenFactory : IDataProtectorTokenFactory where /// The parsed tokenable /// Throws CryptographicException if fails to unprotect public T Unprotect(string token) => - Tokenable.FromToken(new Token(token).RemovePrefix(_clearTextPrefix).UnprotectWith(_dataProtector).ToString()); + Tokenable.FromToken(new Token(token).RemovePrefix(_clearTextPrefix).UnprotectWith(_dataProtector, _logger).ToString()); public bool TokenValid(string token) { @@ -45,8 +48,9 @@ public class DataProtectorTokenFactory : IDataProtectorTokenFactory where data = Unprotect(token); return true; } - catch + catch (Exception ex) { + _logger.LogInformation(ex, "Failed to unprotect token: {rawToken}", token); data = default; return false; } diff --git a/src/Core/Tokens/Token.cs b/src/Core/Tokens/Token.cs index a50b81fbb..a2b42dd4c 100644 --- a/src/Core/Tokens/Token.cs +++ b/src/Core/Tokens/Token.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.DataProtection; +using Microsoft.Extensions.Logging; namespace Bit.Core.Tokens; @@ -26,11 +27,28 @@ public class Token return new Token(_token[expectedPrefix.Length..]); } - public Token ProtectWith(IDataProtector dataProtector) => - new(dataProtector.Protect(ToString())); - public Token UnprotectWith(IDataProtector dataProtector) => - new(dataProtector.Unprotect(ToString())); + public Token ProtectWith(IDataProtector dataProtector, ILogger logger) + { + logger.LogDebug("Protecting token: {token}", this); + return new(dataProtector.Protect(ToString())); + } + + public Token UnprotectWith(IDataProtector dataProtector, ILogger logger) + { + var unprotected = ""; + try + { + unprotected = dataProtector.Unprotect(ToString()); + } + catch (Exception e) + { + logger.LogInformation(e, "Failed to unprotect token: {token}", this); + throw; + } + logger.LogDebug("Unprotected token: {token} to {decryptedToken}", this, unprotected); + return new(unprotected); + } public override string ToString() => _token; } diff --git a/src/Core/Utilities/LoggerFactoryExtensions.cs b/src/Core/Utilities/LoggerFactoryExtensions.cs index 792225cdf..f3e1ddb2f 100644 --- a/src/Core/Utilities/LoggerFactoryExtensions.cs +++ b/src/Core/Utilities/LoggerFactoryExtensions.cs @@ -31,13 +31,16 @@ public static class LoggerFactoryExtensions public static ILoggingBuilder AddSerilog( this ILoggingBuilder builder, WebHostBuilderContext context, - Func filter = null) + Func filter = null) { if (context.HostingEnvironment.IsDevelopment()) { return builder; } + var globalSettings = new GlobalSettings(); + ConfigurationBinder.Bind(context.Configuration.GetSection("GlobalSettings"), globalSettings); + bool inclusionPredicate(LogEvent e) { if (filter == null) @@ -49,12 +52,9 @@ public static class LoggerFactoryExtensions { return true; } - return filter(e); + return filter(e, globalSettings); } - var globalSettings = new GlobalSettings(); - ConfigurationBinder.Bind(context.Configuration.GetSection("GlobalSettings"), globalSettings); - var config = new LoggerConfiguration() .Enrich.FromLogContext() .Filter.ByIncludingOnly(inclusionPredicate); diff --git a/src/Events/Program.cs b/src/Events/Program.cs index 74f82cd41..e09cfc17e 100644 --- a/src/Events/Program.cs +++ b/src/Events/Program.cs @@ -1,5 +1,4 @@ using Bit.Core.Utilities; -using Serilog.Events; namespace Bit.Events; @@ -14,13 +13,13 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => + logging.AddSerilog(hostingContext, (e, globalSettings) => { var context = e.Properties["SourceContext"].ToString(); if (context.Contains("IdentityServer4.Validation.TokenValidator") || context.Contains("IdentityServer4.Validation.TokenRequestValidator")) { - return e.Level > LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.EventsSettings.IdentityToken; } if (e.Properties.ContainsKey("RequestPath") && @@ -30,7 +29,7 @@ public class Program return false; } - return e.Level >= LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.EventsSettings.Default; })); }) .Build() diff --git a/src/EventsProcessor/Program.cs b/src/EventsProcessor/Program.cs index 0cf2d17fa..9b7a31e6f 100644 --- a/src/EventsProcessor/Program.cs +++ b/src/EventsProcessor/Program.cs @@ -1,5 +1,4 @@ using Bit.Core.Utilities; -using Serilog.Events; namespace Bit.EventsProcessor; @@ -13,7 +12,7 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => e.Level >= LogEventLevel.Warning)); + logging.AddSerilog(hostingContext, (e, globalSettings) => e.Level >= globalSettings.MinLogLevel.EventsProcessorSettings.Default)); }) .Build() .Run(); diff --git a/src/Icons/Program.cs b/src/Icons/Program.cs index d57a6fd1c..237096b0b 100644 --- a/src/Icons/Program.cs +++ b/src/Icons/Program.cs @@ -1,5 +1,4 @@ using Bit.Core.Utilities; -using Serilog.Events; namespace Bit.Icons; @@ -13,7 +12,7 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => e.Level >= LogEventLevel.Error)); + logging.AddSerilog(hostingContext, (e, globalSettings) => e.Level >= globalSettings.MinLogLevel.IconsSettings.Default)); }) .Build() .Run(); diff --git a/src/Identity/Program.cs b/src/Identity/Program.cs index e87f81aa6..2ca52bffe 100644 --- a/src/Identity/Program.cs +++ b/src/Identity/Program.cs @@ -1,6 +1,5 @@ using AspNetCoreRateLimit; using Bit.Core.Utilities; -using Serilog.Events; namespace Bit.Identity; @@ -22,22 +21,21 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => + logging.AddSerilog(hostingContext, (e, globalSettings) => { var context = e.Properties["SourceContext"].ToString(); - if (context.Contains(typeof(IpRateLimitMiddleware).FullName) && - e.Level == LogEventLevel.Information) + if (context.Contains(typeof(IpRateLimitMiddleware).FullName)) { - return true; + return e.Level >= globalSettings.MinLogLevel.IdentitySettings.IpRateLimit; } if (context.Contains("IdentityServer4.Validation.TokenValidator") || context.Contains("IdentityServer4.Validation.TokenRequestValidator")) { - return e.Level > LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.IdentitySettings.IdentityToken; } - return e.Level >= LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.IdentitySettings.Default; })); }); } diff --git a/src/Notifications/Program.cs b/src/Notifications/Program.cs index 4834972ab..48221c2c4 100644 --- a/src/Notifications/Program.cs +++ b/src/Notifications/Program.cs @@ -14,13 +14,13 @@ public class Program { webBuilder.UseStartup(); webBuilder.ConfigureLogging((hostingContext, logging) => - logging.AddSerilog(hostingContext, e => + logging.AddSerilog(hostingContext, (e, globalSettings) => { var context = e.Properties["SourceContext"].ToString(); if (context.Contains("IdentityServer4.Validation.TokenValidator") || context.Contains("IdentityServer4.Validation.TokenRequestValidator")) { - return e.Level > LogEventLevel.Error; + return e.Level >= globalSettings.MinLogLevel.NotificationsSettings.IdentityToken; } if (e.Level == LogEventLevel.Error && @@ -41,7 +41,7 @@ public class Program return false; } - return e.Level >= LogEventLevel.Warning; + return e.Level >= globalSettings.MinLogLevel.NotificationsSettings.Default; })); }) .Build() diff --git a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs index a9a88b4fe..2ad8e2b2b 100644 --- a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs +++ b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs @@ -35,6 +35,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Serilog.Context; using StackExchange.Redis; @@ -116,19 +117,22 @@ public static class ServiceCollectionExtensions new DataProtectorTokenFactory( EmergencyAccessInviteTokenable.ClearTextPrefix, EmergencyAccessInviteTokenable.DataProtectorPurpose, - serviceProvider.GetDataProtectionProvider()) + serviceProvider.GetDataProtectionProvider(), + serviceProvider.GetRequiredService>>()) ); services.AddSingleton>(serviceProvider => new DataProtectorTokenFactory( HCaptchaTokenable.ClearTextPrefix, HCaptchaTokenable.DataProtectorPurpose, - serviceProvider.GetDataProtectionProvider()) + serviceProvider.GetDataProtectionProvider(), + serviceProvider.GetRequiredService>>()) ); services.AddSingleton>(serviceProvider => new DataProtectorTokenFactory( SsoTokenable.ClearTextPrefix, SsoTokenable.DataProtectorPurpose, - serviceProvider.GetDataProtectionProvider())); + serviceProvider.GetDataProtectionProvider(), + serviceProvider.GetRequiredService>>())); } public static void AddDefaultServices(this IServiceCollection services, GlobalSettings globalSettings)