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
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVSim.ContentServer", "SVSim.ContentServer\SVSim.ContentServer.csproj", "{AC3897E1-7745-49D0-BFA1-7D859D317C07}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVSim.ContentServer", "SVSim.ContentServer\SVSim.ContentServer.csproj", "{AC3897E1-7745-49D0-BFA1-7D859D317C07}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVSim.Hosting", "SVSim.Hosting\SVSim.Hosting.csproj", "{70D7E6B2-A812-497F-A254-CDD643F99A8A}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
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}.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.ActiveCfg = Release|Any CPU
|
||||||
{AC3897E1-7745-49D0-BFA1-7D859D317C07}.Release|Any CPU.Build.0 = 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
|
EndGlobalSection
|
||||||
EndGlobal
|
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