diff --git a/src/NATS.Server.Host/Program.cs b/src/NATS.Server.Host/Program.cs index b590de3..5f69a3c 100644 --- a/src/NATS.Server.Host/Program.cs +++ b/src/NATS.Server.Host/Program.cs @@ -85,6 +85,14 @@ for (int i = 0; i < args.Length; i++) case "--service": windowsService = true; break; + case "--log_level_override" when i + 1 < args.Length: + var parts = args[++i].Split('=', 2); + if (parts.Length == 2) + { + options.LogOverrides ??= new(); + options.LogOverrides[parts[0]] = parts[1]; + } + break; } } @@ -135,6 +143,16 @@ else if (options.Syslog) logConfig.WriteTo.LocalSyslog("nats-server"); } +// Apply per-subsystem log level overrides +if (options.LogOverrides is not null) +{ + foreach (var (ns, level) in options.LogOverrides) + { + if (Enum.TryParse(level, true, out var serilogLevel)) + logConfig.MinimumLevel.Override(ns, serilogLevel); + } +} + Log.Logger = logConfig.CreateLogger(); if (windowsService) diff --git a/src/NATS.Server/NatsOptions.cs b/src/NATS.Server/NatsOptions.cs index efc50cd..016f2fd 100644 --- a/src/NATS.Server/NatsOptions.cs +++ b/src/NATS.Server/NatsOptions.cs @@ -90,5 +90,8 @@ public sealed class NatsOptions public OcspConfig? OcspConfig { get; set; } public bool OcspPeerVerify { get; set; } + // Per-subsystem log level overrides (namespace -> level) + public Dictionary? LogOverrides { get; set; } + public bool HasTls => TlsCert != null && TlsKey != null; } diff --git a/tests/NATS.Server.Tests/NatsOptionsTests.cs b/tests/NATS.Server.Tests/NatsOptionsTests.cs index 4e57769..535af0d 100644 --- a/tests/NATS.Server.Tests/NatsOptionsTests.cs +++ b/tests/NATS.Server.Tests/NatsOptionsTests.cs @@ -15,3 +15,24 @@ public class NatsOptionsTests opts.Tags.ShouldBeNull(); } } + +public class LogOverrideTests +{ + [Fact] + public void LogOverrides_defaults_to_null() + { + var options = new NatsOptions(); + options.LogOverrides.ShouldBeNull(); + } + + [Fact] + public void LogOverrides_can_be_set() + { + var options = new NatsOptions + { + LogOverrides = new() { ["NATS.Server.Protocol"] = "Trace" } + }; + options.LogOverrides.ShouldNotBeNull(); + options.LogOverrides["NATS.Server.Protocol"].ShouldBe("Trace"); + } +}