I have the following nlog.config file for my project. When I debug locally, it works as expected, that Hangfire messages are being filtered to only show Warn and above. However on our staging server (IIS 8.5) nlog seems to ignore the rule and just logs everything (including Info) to elmah:
<?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">
<extensions>
<add assembly="NLog.Elmah"/>
</extensions>
<targets>
<target xsi:type="Elmah" name="elmahWithLogLevelAsType" layout="${message}" LogLevelAsType="true"/>
</targets>
<rules>
<logger name="Hangfire.*" minlevel="Warn" writeTo="elmahWithLogLevelAsType" final="true" />
<logger name="*" minlevel="Info" writeTo="elmahWithLogLevelAsType" />
</rules>
</nlog>
Even if I remove the Hangfire.* rule and change the catchall to minlevel="Warn" it still logs Info items.
Think you are running two different versions of NLog.
This will capture all log-events with warning (and above levels):
<logger name="Hangfire.*" minlevel="Warn" writeTo="elmahWithLogLevelAsType" final="true" />
This means all log-events with info or below will try the next rule:
<logger name="*" minlevel="Info" writeTo="elmahWithLogLevelAsType" />
Try this configuration instead:
<?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">
<extensions>
<add assembly="NLog.Elmah"/>
</extensions>
<targets>
<target xsi:type="Elmah" name="elmahWithLogLevelAsType" layout="${message}" LogLevelAsType="true"/>
</targets>
<rules>
<logger name="Hangfire.*" minlevel="Warn" writeTo="elmahWithLogLevelAsType" final="true" />
<logger name="Hangfire.*" maxLevel="Warn" final="true" /> <!-- BlackHole -->
<logger name="*" minlevel="Info" writeTo="elmahWithLogLevelAsType" />
</rules>
</nlog>
Related
It is working fine on the local windows system. When I deploy it on a Linux server it is neither logging logs nor creating log files.
nlog.config
<?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"
autoReload="true"
throwConfigExceptions="true">
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- the targets to write to -->
<targets>
<target
name="errorLogFile"
xsi:type="File"
fileName="${currentdir}/logs/error/${date:format=yyyyMMdd}.txt"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${callsite}|${message} ${exception:format=tostring} ${newline} "
/>
<target
name="infoLogFile"
xsi:type="File"
fileName="${currentdir}/logs/info/${date:format=yyyyMMdd}.txt"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${callsite}|${message} ${exception:format=tostring} ${newline} "
/>
</targets>
<rules>
<logger name="Microsoft.*" minlevel="Info" maxlevel="Warn" writeTo="" final="true" />
<logger name="*" minlevel="ERROR" writeTo="errorLogFile" />
<logger name="*" minlevel="Info" maxlevel="Warn" writeTo="infoLogFile" />
</rules>
</nlog>
Program.cs > CreateHostBuilder
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
// Enable NLog as one of the Logging Provider
logging.AddNLog();
})
Using ASP.NET Core3.1 and NLog, this is a part of my NLog.config:
<nlog>
<targets>
<!-- write logs to file -->
<target name="allfile" xsi:type="File"
fileName="${aspnet-appbasepath}/AspNetCore_Nlog/nlog-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring} | url: ${aspnet-request-url} | controller: ${aspnet-mvc-controller} | action: ${aspnet-mvc-action}"
archiveAboveSize="1000000"
maxArchiveFiles="20" />
<target name="searchedFile" xsi:type="File"
fileName="${aspnet-appbasepath}/AspNetCore_Nlog/whatIsSearched-${shortdate}.txt"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message}"
archiveAboveSize="1000000"
maxArchiveFiles="20"/>
</targets>
<!-- rules to map from logger name to target -->
<rules>
<logger name="*" minlevel="Trace" writeTo="allfile" />
<logger name="whatIsSearched" minlevel="Trace" writeTo="searchedFile" />
</rules>
</nlog>
My problem is that, all the logs inside searchedFile, also exist in allfile.
I need to know if there is a way to exclude a special target from all logs/all file that logs every thing ?
I would move the logging-rule for whatIsSearched to the top, and add final="true":
<rules>
<logger name="whatIsSearched" minlevel="Trace" writeTo="searchedFile" final="true" />
<logger name="*" minlevel="Trace" writeTo="allfile" />
</rules>
See also: https://github.com/nlog/NLog/wiki/Configuration-file#rules
I have started using the Asp.Net Core 2.1 HttpClientFactory
services.AddHttpClient();
Now I get these huge logs from the HttpClient, every request logs Info and Trace level logs.
2018-11-08 14:34:59.6753|::1||INFO |8.11.7.0|12 |Dto|Log.RequestPipelineStart|Start processing HTTP request GET ...
I have been trying to throw them in a black hole:
<logger name="System.Net.Http.HttpClient*" minlevel ="Trace" writeTo="blackhole" final="true" />
But that does not help. Any suggestions?
Full Nlog:
<?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"
internalLogToConsoleError="true"
internalLogLevel="Warn"
internalLogFile="logs\internal-nlog.txt"
throwExceptions="true"
autoReload="true">
<!-- Load the ASP.NET Core plugin -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- the targets to write to -->
<targets async="true">
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="logs\${machinename}-all.log"
layout="${longdate}|${aspnet-request-ip}|${aspnet-User-Identity}|${pad:padding=-5:${uppercase:${level}}}|${assembly-version}|${event-properties:item=EventId.Id}|${logger}|${aspnet-mvc-controller}|${aspnet-Request-Method}|${message}|${exception}"
maxArchiveFiles="7"
archiveFileName="logs\archive\${machinename}-all.{#}.zip"
archiveNumbering="Date"
archiveEvery="Day"
archiveDateFormat="yyyyMMdd"
enableArchiveFileCompression ="true"
/>
<!-- another file log, only own logs. Uses some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-trace" fileName="logs\${machinename}-trace.log"
layout="${longdate}|${aspnet-request-ip}|${aspnet-User-Identity}|${pad:padding=-5:${uppercase:${level}}}|${assembly-version}|${pad:padding=-3:${threadid}}|${aspnet-mvc-controller}|${callsite:className=True:includeNamespace=False:fileName=False:includeSourcePath=False:methodName=True:cleanNamesOfAnonymousDelegates=True:cleanNamesOfAsyncContinuations=True}|${message}|${exception}"
maxArchiveFiles="14"
archiveFileName="logs\archive\${machinename}-trace.{#}.zip"
archiveNumbering="Date"
archiveEvery="Saturday"
archiveDateFormat="yyyyMMdd"
enableArchiveFileCompression ="true"
/>
<!-- another file log, only own logs. Uses some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-error" fileName="logs\${machinename}-error.log"
layout="${longdate}|${aspnet-request-ip}||${aspnet-User-Identity}|${pad:padding=-5:${uppercase:${level}}}|${assembly-version}|${pad:padding=-3:${threadid}}|${aspnet-mvc-controller}|${callsite:className=True:includeNamespace=False:fileName=False:includeSourcePath=False:methodName=True:cleanNamesOfAnonymousDelegates=True:cleanNamesOfAsyncContinuations=True}|${message}|${exception:format=tostring}"
maxArchiveFiles="100"
archiveFileName="logs\archive\${machinename}-error.{#}.zip"
archiveNumbering="Date"
archiveEvery="Day"
archiveDateFormat="yyyyMMdd"
enableArchiveFileCompression ="true"
/>
<target xsi:type="File" name="ownFile-info" fileName="logs\${machinename}-info.log"
layout="${longdate}|${aspnet-request-ip}|${aspnet-User-Identity}|${pad:padding=-5:${uppercase:${level}}}|${assembly-version}|${aspnet-mvc-controller}|${callsite:className=True:includeNamespace=False:fileName=False:includeSourcePath=False:methodName=True:cleanNamesOfAnonymousDelegates=True:cleanNamesOfAsyncContinuations=True}|${message}|${exception}"
maxArchiveFiles="36"
archiveFileName="logs\archive\${machinename}-info.{#}.zip"
archiveNumbering="Date"
archiveEvery="Month"
archiveDateFormat="yyyyMMdd"
enableArchiveFileCompression ="true"
/>
<target xsi:type="ColoredConsole"
name="ColoredConsole"
layout="${aspnet-User-Identity}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger}|${message} ${exception}"
header="${longdate}"
footer="${longdate}"
useDefaultRowHighlightingRules="True"
detectConsoleAvailable="True">
</target>
<target xsi:type="LimitingWrapper"
name="MailTarget"
messageLimit="1"
interval="00:15">
<target xsi:type="Mail"
layout="${longdate}|${aspnet-request-ip}||${aspnet-User-Identity}|${pad:padding=-5:${uppercase:${level}}}|${assembly-version}|${pad:padding=-3:${threadid}}|${aspnet-mvc-controller}|${callsite:className=True:includeNamespace=False:fileName=False:includeSourcePath=False:methodName=True}|${message}|${exception:format=tostring}"
subject ="Error in Testmij"
to="info#datec.nl"
from="testmijonline#testmij.nl"
body="${longdate}|${aspnet-request-ip}||${aspnet-User-Identity}|${pad:padding=-5:${uppercase:${level}}}|${assembly-version}|${pad:padding=-3:${threadid}}|${aspnet-mvc-controller}|${callsite:className=True:includeNamespace=False:fileName=False:includeSourcePath=False:methodName=True}|${message}|${exception:format=tostring}"
smtpUserName ="mail#smtp.datec.nl"
enableSsl ="false"
smtpPassword ="7dnV&q#D3s"
smtpAuthentication ="Basic"
smtpServer ="smtp.datec.nl "
smtpPort ="25"
/>
</target>
<!-- write to the void aka just remove -->
<target xsi:type="Null" name="blackhole" />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile"/>
<!--Skip Microsoft logs and so log only own logs-->
<logger name="DTOWEB.Models.HttpClientExtensions" writeTo="blackhole" final="true" />
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
<logger name="System.Net.Http.HttpClient*" minlevel ="Trace" writeTo="blackhole" final="true" />
<logger name="*" minlevel="Error" writeTo="ownFile-error" />
<logger name="*" minlevel="Trace" writeTo="ownFile-trace" />
<logger name="*" minlevel="Info" writeTo="ownFile-info" />
<logger name="*" minlevel="Trace" writeTo="ColoredConsole" />
<logger name ="*" minlevel="Error" writeTo ="MailTarget"/>
</rules>
</nlog>
Answered, see comment of Rolf Kristensen
When you run a debug session in localhost, Visual Studio does not deploy all files to the bin directory. So the changed Nlog.config was not deployed.
I need my azure app service's logs and error logs to be visualized using ELK stack. How to connect these logstash.?. How can I ship my app service logs to logstash.?
use NLog (https://nlog-project.org/)
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xsi:schemaLocation="NLog NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogFile="internal.nlog"
throwExceptions="true"
throwConfigExceptions="true"
internalLogLevel="Debug">
<extensions>
<add assembly="NLog.StructuredLogging.Json" />
</extensions>
<targets>
<target xsi:type="Console" name="console" layout="${structuredlogging.json}" />
<!--<target name="logstash" xsi:type="BufferingWrapper" flushTimeout="5000">-->
<target name="logstash" xsi:type="Network" layout="${structuredlogging.json}" address="elasticsearch:5443" />
<!--</target>-->
</targets>
<rules>
<logger name="*" writeTo="logstash" />
<logger name="*" minlevel="Trace" writeTo="console" />
</rules>
</nlog>
I'm trying to insert an NLog custom config section into my Web.config using this XDT section:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" throwExceptions="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xdt:Transform="InsertIfMissing" >
<targets>
<target xsi:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile" />
</rules>
</nlog>
When I run the XDT transform, my Web.Debug.config contains:
<nlog throwExceptions="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
<targets>
<target d4p1:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile" />
</rules>
</nlog>
Typically, a namespace prefix is arbitrary, so transforming xsi to d4p1 would cause no issues.
However, I get a runtime exception in my application from NLog when I use d4p1. Manually changing the instances of d4p1 to xsi fixes the issue, but it subverts the utility of config transformation for me if the user needs to manually alter the file afterward.
Is there a way to preserve namespace prefixes using XDT?
We had exactly the same issue. I'm not sure why it suddenly started happening with a particular project, but the solution for us was to add the xsi namespace to the top level of the original configuration file (ie the base file the transformations work on). So...
<configuration>
... would become...
<configuration xmlns:xsi="http://www.nlog-project.org/schemas/NLog.xsd">
This did the trick.
An alternative approach that also worked was to apply the transforms on child elements of the nlog element.
Hope that helps someone.
I started to see this problem when I moved my xdt:Transform attribute from the target and rule tags to nlog. Moving them back to the original tags like this solved it:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" throwExceptions="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets xdt:Transform="InsertIfMissing">
<target xsi:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>
<rules xdt:Transform="InsertIfMissing">
<logger name="*" minlevel="Trace" writeTo="logfile" />
</rules>
</nlog>