hosting: add SVSim.Hosting with Serilog extension

Adds new SVSim.Hosting project carrying Serilog + Serilog.AspNetCore +
Serilog.Settings.Configuration + enricher package refs, and a single
IHostBuilder extension method UseSvSimSerilog(appName) that installs a
colored console sink and a plain-text file sink rolling daily with a
100 MB per-file cap and 7-file retention. ReadFrom.Configuration is
called last so appsettings can override minimum levels per category.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
gamer147
2026-07-04 01:55:58 -04:00
parent 87891f9896
commit a7843adfe6
3 changed files with 64 additions and 0 deletions

View File

@@ -17,6 +17,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVSim.BattleEngine.Tests",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVSim.ContentServer", "SVSim.ContentServer\SVSim.ContentServer.csproj", "{AC3897E1-7745-49D0-BFA1-7D859D317C07}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVSim.Hosting", "SVSim.Hosting\SVSim.Hosting.csproj", "{70D7E6B2-A812-497F-A254-CDD643F99A8A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -55,5 +57,9 @@ Global
{AC3897E1-7745-49D0-BFA1-7D859D317C07}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AC3897E1-7745-49D0-BFA1-7D859D317C07}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC3897E1-7745-49D0-BFA1-7D859D317C07}.Release|Any CPU.Build.0 = Release|Any CPU
{70D7E6B2-A812-497F-A254-CDD643F99A8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{70D7E6B2-A812-497F-A254-CDD643F99A8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{70D7E6B2-A812-497F-A254-CDD643F99A8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{70D7E6B2-A812-497F-A254-CDD643F99A8A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.4" />
<PackageReference Include="Serilog.Enrichers.Thread" Version="4.0.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="3.0.1" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,42 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.SystemConsole.Themes;
namespace SVSim.Hosting;
public static class SerilogHostingExtensions
{
// Wires Serilog as the host's logging provider. Sinks, rotation, retention,
// and enrichment defaults are baked in here; per-category level overrides
// ride via appsettings under "Serilog:MinimumLevel:Override". The file sink
// rolls daily (or when a single file hits 100 MB) and retains the newest 7.
public static IHostBuilder UseSvSimSerilog(this IHostBuilder host, string appName)
{
var logDirectory = Path.Combine(AppContext.BaseDirectory, "logs");
var filePathBase = Path.Combine(logDirectory, $"{appName}-.log");
return host.UseSerilog((context, services, loggerConfig) =>
{
loggerConfig
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
.Enrich.FromLogContext()
.Enrich.WithMachineName()
.Enrich.WithThreadId()
.WriteTo.Console(
theme: AnsiConsoleTheme.Code,
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}")
.WriteTo.File(
path: filePathBase,
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true,
fileSizeLimitBytes: 100_000_000,
retainedFileCountLimit: 7,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}")
.ReadFrom.Configuration(context.Configuration);
});
}
}