== Why is this an issue?

In most logging frameworks, it's good practice to set the logger name to match its enclosing type, as enforced by S3416.

Logging frameworks can define or use https://learn.microsoft.com/en-us/dotnet/standard/generics/interfaces[Generic interfaces] for the logger, such as https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger-1[`ILogger<TCategoryName>`]. 

The use of a logger of a generic type parameter `A` (e.g. `ILogger<A>`) in a type different than `A`, say `B`, goes against the convention.

Because the instance of type `A` would log with a logger named after `B`, log items would appear as if they were logged by `B` instead, resulting in confusion and logging misconfiguration:

* overriding defaults for the logger named after `A` would not take effect for entries logged in the type `A`
* fine-graned logging configuration would not be possible, since there would be no way to distinguish entries logged in the type `A` from entries logged in the type `B`

Further details and examples are provided in S3416.

This rule specifically targets the generic logging interface https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger-1[`ILogger<TCategoryName>` Interface] defined by https://learn.microsoft.com/en-us/dotnet/core/extensions/logging[Microsoft Extensions Logging].

== How to fix it

include::{language}/how-code-example.adoc[]

== Resources

=== Documentation

* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/core/diagnostics/logging-tracing[.NET logging and tracing]
* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/standard/generics/interfaces[Generic interface]
* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger-1[`ILogger<TCategoryName>` Interface]
* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line#log-category[Logging in C# and .NET - Log category]

include::rspecator.adoc[]