-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Logging Rules FinalMinLevel
finalMinLevel is an option for Logging Rules,
that have been introduced with NLog ver 5.0. It is conceptually similar to the combination of the maxLevel and final option.
The main reason for the finalMinLevel option is to easily silence
all noisy loggers from one subcomponent (like Microsoft.*), while
overriding this behavior for a single logger of that subcomponent
(like Microsoft.Hosting.Lifetime). This is similar to how the
filtering works in Microsoft Extension Logging.
finalMinLevel is intended for configurations that have
catch-all log-targets at the bottom of the logging rules.
Here's a small example to start with: if logs coming from
Microsoft.* should only be logged if the log level is Warn or
higher, and all other logs should be logged if the level is Info or
higher, then the following configuration could be used:
<rules>
<logger name="Microsoft.*" finalMinLevel="Warn" />
<logger name="*" minLevel="Info" writeTo="console" />
</rules>This can also be implemented using maxLevel and final in NLog v4:
<rules>
<logger name="Microsoft.*" maxLevel="Info" final="true" />
<logger name="*" minLevel="Info" writeTo="console" />
</rules>In both examples, the first rule is a "black hole" that swallows the applicable logs. Also keep in mind that the order of the logger-rules are always very important.
The advantage of finalMinLevel is that it is easier to read,
comprehend and reduces the configuration required, especially with
more complex configurations. Additionally, it allows overriding
previous finalMinLevel filters, such a pattern is not possible
otherwise.
The following table describes which log levels are enabled depending
on the finalMinLevel value:
| FinalMinLevel | Ordinal | Enabled log levels |
|---|---|---|
| Trace | 0 | Trace, Debug, Info, Warn, Error and Fatal |
| Debug | 1 | Debug, Info, Warn, Error and Fatal |
| Info | 2 | Info, Warn, Error and Fatal |
| Warn | 3 | Warn, Error and Fatal |
| Error | 4 | Error and Fatal |
| Fatal | 5 | Fatal |
| Off | 6 |
NLog includes LogLevel Off, that can be used to suppress all output from a noisy logger:
<rules>
<logger name="NoisyLogger.*" finalMinLevel="Off" />
<logger name="*" minLevel="Info" writeTo="console" />
</rules>This can also be implemented using maxLevel and final in NLog v4:
<rules>
<logger name="NoisyLogger.*" maxLevel="Off" final="true" />
<logger name="*" minLevel="Info" writeTo="console" />
</rules>As mentioned before, finalMinLevel can override previous rules. For
example, if we want Warn logs of higher from Microsoft.*, but
Info logs or higher from Microsoft.Hosting.Lifetime, then this is
a possible configuration:
<rules>
<logger name="Microsoft.*" finalMinLevel="Warn" />
<logger name="Microsoft.Hosting.Lifetime*" finalMinLevel="Info" />
<logger name="*" minLevel="Info" writeTo="console" />
</rules>Keep in mind that the order is still important. If the "Microsoft.*
and Microsoft.Hosting.Lifetime* were reversed, then Microsoft.*
would override Microsoft.Hosting.Lifetime* and both would be set to
Warn.
The Microsoft Logging filters specified in appsettings.json are ignored by default when using NLog 5.0.
This is to avoid that new users think NLog Logging Rules are not working, because Microsoft LoggerFactory filters are interfering.
The default logging logging configuration in appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}Can be configured through NLog.config like this:
<rules>
<logger name="Microsoft.*" finalMinLevel="Warn" />
<logger name="Microsoft.Hosting.Lifetime*" finalMinLevel="Info" />
<logger name="*" minLevel="Info" writeTo="console" />
</rules>Notice that the logger named Microsoft.Hosting.Lifetime* overrides the Microsoft.* logger. See also Microsoft Hosting Lifetime Startup Messages
See also Tutorial for using NLog with ASP.NET Core
This example also filters logs from System.* and separates
informative logs and error logs between the stdout and stderr
output streams.
It is a good configuration for new ASP.NET projects.
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd">
<targets>
<target name="stdout" xsi:type="Console" />
<target name="stderr" xsi:type="Console" stdErr="true" />
</targets>
<rules>
<logger name="System.*" finalMinLevel="Warn" />
<logger name="Microsoft.*" finalMinLevel="Warn" />
<logger name="Microsoft.Hosting.Lifetime*" finalMinLevel="Info" />
<logger name="*" minLevel="Info" maxLevel="Warn" writeTo="stdout" />
<logger name="*" minLevel="Error" writeTo="stderr" />
</rules>
</nlog>It can be useful to combine finalMinLevel with MinLevel. Suppose
there's a sub-module RequestLogger that should have its own
dedicated log-target, but at the same time all Error or higher logs
should flow to the catch-all log-target. This can be achieved through:
<logger name="RequestLogger" minLevel="Debug" writeTo="requestTarget" finalMinLevel="Error" />
<logger name="*" minLevel="Info" writeTo="catchAllTarget" />It can also be configured like this if using NLog v4:
<logger name="RequestLogger" minLevel="Debug" writeTo="requestTarget" />
<logger name="RequestLogger" maxLevel="Warn" final="true" />
<logger name="*" minLevel="Info" writeTo="catchAllTarget" />All logs coming from RequestLogger with a level between Debug and
higher will be logged to requestTarget. All other logs with a level
Info or higher will be logged to catchAllTarget, including Error
and Fatal logs from RequestLogger.
- Troubleshooting Guide - See available NLog Targets and Layouts: https://nlog-project.org/config
- Getting started
- How to use structured logging
- Troubleshooting
- FAQ
- Articles about NLog
-
All targets, layouts and layout renderers
Popular: - Using NLog with NLog.config
- Using NLog with appsettings.json