diff --git a/SteamTogether.Bot/Program.cs b/SteamTogether.Bot/Program.cs index 9fb6759..9d84293 100644 --- a/SteamTogether.Bot/Program.cs +++ b/SteamTogether.Bot/Program.cs @@ -5,6 +5,7 @@ using SteamTogether.Bot.Services.Command.Handlers; using SteamTogether.Bot.Services.Command.Parser; using SteamTogether.Core; +using SteamTogether.Core.Logging; using SteamTogether.Core.Options; using SteamTogether.Core.Services.Steam; using Telegram.Bot; @@ -25,6 +26,51 @@ .AddCommandLine(args); } ) + .ConfigureLogging( + (context, logging) => + { + logging.ClearProviders(); + logging.AddProvider( + new FilteredConsoleLoggerProvider( + (category, level) => + { + if (level == LogLevel.None) + { + return false; + } + + if (category == typeof(SteamService).FullName) + { + return level == LogLevel.Information; + } + + if (category == typeof(TelegramService).FullName) + { + return level == LogLevel.Information; + } + + if (category == typeof(HealthCheckService).FullName) + { + return level == LogLevel.Information; + } + + if (category == typeof(TelegramPollingWorker).FullName) + { + return level == LogLevel.Information; + } + + if (category == typeof(HealthCheckWorker).FullName) + { + return level == LogLevel.Information; + } + + return true; + }, + true + ) + ); + } + ) .ConfigureServices( (builder, services) => { diff --git a/SteamTogether.Core/Logging/FilteredConsoleLoggerProvider.cs b/SteamTogether.Core/Logging/FilteredConsoleLoggerProvider.cs new file mode 100644 index 0000000..faf2b61 --- /dev/null +++ b/SteamTogether.Core/Logging/FilteredConsoleLoggerProvider.cs @@ -0,0 +1,88 @@ +using Microsoft.Extensions.Logging; + +namespace SteamTogether.Core.Logging; + +public class FilteredConsoleLoggerProvider : ILoggerProvider +{ + private readonly Func _filter; + private readonly bool _filterSensitiveData; + + public FilteredConsoleLoggerProvider( + Func filter, + bool filterSensitiveData = false + ) + { + _filter = filter; + _filterSensitiveData = filterSensitiveData; + } + + public ILogger CreateLogger(string categoryName) + { + return new FilteredConsoleLogger(categoryName, _filter, _filterSensitiveData); + } + + public void Dispose() { } +} + +public class FilteredConsoleLogger : ILogger +{ + private readonly string _categoryName; + private readonly Func _filter; + private readonly bool _filterSensitiveData; + + public FilteredConsoleLogger( + string categoryName, + Func filter, + bool filterSensitiveData + ) + { + _categoryName = categoryName; + _filter = filter; + _filterSensitiveData = filterSensitiveData; + } + + public IDisposable? BeginScope(TState state) + where TState : notnull => default!; + + public bool IsEnabled(LogLevel logLevel) + { + return _filter(_categoryName, logLevel); + } + + void ILogger.Log( + LogLevel logLevel, + EventId eventId, + TState state, + Exception? exception, + Func formatter + ) + { + if (!IsEnabled(logLevel)) + { + return; + } + + if (_filterSensitiveData) + { + state = (TState)FilterSensitiveData(state); + } + + Console.WriteLine($"{logLevel}: {formatter(state, exception)}"); + } + + private static object FilterSensitiveData(TState state) + { + if (state is string) + { + return FilterStringSensitiveData((string)(object)state); + } + + return state; + } + + private static string FilterStringSensitiveData(string message) + { + // Replace any occurrences of "password" with "***" + return message.Replace("password", "***"); + } +}