In the past I have written few blog posts on NLog and discussed several techniques:
Programatically configuring NLog in C#
Some NLog configuration examples for writing into different log management systems
And I have discussed about a possibility of capturing more information in logs only when needed such as in the case of errors or exceptions in the following blog post:
An abnormal way of logging – open for discussion
This blog post is for Asp.Net Core only.
This should be possible by combining AspNetBufferingWrapper and PostFilteringWrapper.
Sample configuration provided below:
AspNetBufferingWrapper:
AspNetBufferingWrapper buffers all the messages in a ASP.Net request and sends all the messages to the wrapped target.
Remember to set this logger properly. This involves:
- Adding the NLog.Web.AspNetCore nuget package
- Properly configuring nlog.config file
- Registering the middleware
dotnet add package NLog.Web.AspNetCore --version 5.2.1
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
using NLog.Web;
app.UseMiddleware<NLogBufferingTargetWrapperMiddleware>();
PostFilteringWrapper:
This wrapper evaluates a specified condition and filters logs, then sends the logs to the wrapped target:
<target xsi:type="PostFilteringWrapper" defaultFilter="level >= LogLevel.Info">
<target .... />
<when exists="level >= LogLevel.Warn" filter="level >= LogLevel.Debug"/>
</target>
The above configuration by default logs Info and above logs, but if there is a Warn or higher, logs debug or higher. For this to work properly obviously this logger has to receive Debug messages otherwise there is no point in using this logger.
Now combing these two loggers, here is an example:
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<target xsi:type="AspNetBufferingWrapper" name="aspnetbuffer" bufferGrowLimit="1000" growBufferAsNeeded="true">
<target xsi:type="PostFilteringWrapper" defaultFilter="level >= LogLevel.Info">
<target xsi:type="File" fileName="c:\temp\nlog-AspNetCore-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />
<when exists="level >= LogLevel.Warn" filter="level >= LogLevel.Debug"/>
</target>
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="aspnetbuffer" />
</rules>
Hoping this post helps someone!
Happy development.
–
Mr. Kanti Kalyan Arumilli
B.Tech, M.B.A
Founder & CEO, Lead Full-Stack .Net developer
ALight Technology And Services Limited
Phone / SMS / WhatsApp on the following 3 numbers:
+91-789-362-6688, +1-480-347-6849, +44-07718-273-964
+44-33-3303-1284 (Preferred number if calling from U.K, No WhatsApp)
kantikalyan@gmail.com, kantikalyan@outlook.com, admin@alightservices.com, kantikalyan.arumilli@alightservices.com, KArumilli2020@student.hult.edu, KantiKArumilli@outlook.com and 3 more rarely used email addresses – hardly once or twice a year.