Add project files.

alphons <alphons@heijden.com> 21 Jan 2026, 21:01
7bf38bd07243dcbd69afc71c3c3299c4ea5fc473
4 files changed
  • LoggerExtensions/CertServiceLoggerFactory.cs
  • LoggerExtensions/FileLogger.cs
  • LoggerExtensions/LoggerExtensions.csproj
  • LoggerHelper.slnx
diff --git a/LoggerExtensions/CertServiceLoggerFactory.cs b/LoggerExtensions/CertServiceLoggerFactory.cs
new file mode 100644
index 0000000..9955fa9
--- /dev/null
+++ b/LoggerExtensions/CertServiceLoggerFactory.cs
@@ -0,0 +1,56 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace LoggerExtensions;
+
+public static class CertServiceLoggerFactory
+{
+ public static IServiceCollection AddLoggers(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.AddLogging(logging =>
+ {
+ if (configuration.GetValue<bool>("ConsoleLogging"))
+ {
+ logging.AddSimpleConsole(c =>
+ {
+ c.SingleLine = true;
+ c.TimestampFormat = "HH:mm:ss ";
+ });
+ }
+ if (configuration.GetValue<bool>("FileLogging"))
+ {
+ logging.AddFileLogger("Logs");
+ }
+ // Minimum level from configuration (standard Logging section)
+ // Supports: "Trace", "Debug", "Information", "Warning", "Error", "Critical", "None"
+ var loggingSection = configuration.GetSection("Logging");
+ LogLevel minimumLevel = LogLevel.Information; // always default
+ if (loggingSection.Exists())
+ {
+ string? minLevelString = loggingSection.GetValue<string>("LogLevel:Default");
+ if (!string.IsNullOrWhiteSpace(minLevelString) &&
+ Enum.TryParse<LogLevel>(minLevelString, true, out LogLevel parsedLevel))
+ {
+ minimumLevel = parsedLevel;
+ }
+ }
+ logging.SetMinimumLevel(minimumLevel);
+ });
+ return services;
+ }
+
+ public static ILogger<T> CreateLogger<T>(IConfiguration configuration)
+ {
+ var services = new ServiceCollection();
+
+ services.AddLoggers(configuration);
+
+ var sp = services.BuildServiceProvider();
+
+ var logger = sp.GetRequiredService<ILogger<T>>();
+
+ return logger;
+ }
+}
+
diff --git a/LoggerExtensions/FileLogger.cs b/LoggerExtensions/FileLogger.cs
new file mode 100644
index 0000000..5d3909f
--- /dev/null
+++ b/LoggerExtensions/FileLogger.cs
@@ -0,0 +1,48 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace LoggerExtensions;
+
+public sealed class FileLogger : ILogger
+{
+ private readonly string filePath;
+ private static readonly Lock lockObject = new();
+
+ public FileLogger(string categoryName, string logDirectory = "Logs")
+ {
+ Directory.CreateDirectory(logDirectory);
+ filePath = Path.Combine(logDirectory, $"log-{DateTime.Today:yyyyMMdd}.txt");
+ }
+
+ public IDisposable? BeginScope<TState>(TState state) where TState : notnull => null;
+
+ public bool IsEnabled(LogLevel logLevel) => true;
+
+ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
+ {
+ var message = $"{DateTime.Now:HH:mm:ss} [{logLevel}] {formatter(state, exception)}";
+ if (exception != null)
+ message += $"{Environment.NewLine}{exception}";
+
+ lock (lockObject)
+ {
+ File.AppendAllText(filePath, message + Environment.NewLine);
+ }
+ }
+}
+
+public sealed class FileLoggerProvider(string logDirectory = "Logs") : ILoggerProvider
+{
+ public ILogger CreateLogger(string categoryName) => new FileLogger(categoryName, logDirectory);
+
+ public void Dispose() { }
+}
+
+public static class LoggingBuilderExtensions
+{
+ public static ILoggingBuilder AddFileLogger(this ILoggingBuilder builder, string logDirectory = "Logs")
+ {
+ builder.Services.AddSingleton<ILoggerProvider>(sp => new FileLoggerProvider(logDirectory));
+ return builder;
+ }
+}
diff --git a/LoggerExtensions/LoggerExtensions.csproj b/LoggerExtensions/LoggerExtensions.csproj
new file mode 100644
index 0000000..446c1ce
--- /dev/null
+++ b/LoggerExtensions/LoggerExtensions.csproj
@@ -0,0 +1,16 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net10.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.2" />
+ <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.2" />
+ <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.2" />
+ <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.2" />
+ </ItemGroup>
+
+</Project>
diff --git a/LoggerHelper.slnx b/LoggerHelper.slnx
new file mode 100644
index 0000000..bf98e66
--- /dev/null
+++ b/LoggerHelper.slnx
@@ -0,0 +1,3 @@
+<Solution>
+ <Project Path="LoggerExtensions/LoggerExtensions.csproj" />
+</Solution>