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:
@@ -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
|
||||
|
||||
16
SVSim.Hosting/SVSim.Hosting.csproj
Normal file
16
SVSim.Hosting/SVSim.Hosting.csproj
Normal 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>
|
||||
42
SVSim.Hosting/SerilogHostingExtensions.cs
Normal file
42
SVSim.Hosting/SerilogHostingExtensions.cs
Normal 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);
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user