Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NLog not logging on all levels

ASPNET Core 2.0 with latest Nlog.

All config files load correctly.

My config file is simple, I just want it to log every thing.

<?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"
      internalLogLevel="Warn"
      internalLogFile="C:\wwwLogs\nlog.log">

  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <targets>
    <target xsi:type="File" name="allfile" fileName="C:\wwwLogs\${shortdate}.log"
            maxArchiveFiles="90"
            archiveNumbering="DateAndSequence"
            archiveAboveSize="250000"
            archiveFileName="archive/log.{#######}.log"
            archiveEvery="Day"
            concurrentWrites="true"
            layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
  </targets>

  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />
  </rules>
</nlog>

I can see it in the trace log for nlog it is setting all levels to the correct output.

2017-11-01 14:21:26.3017 Trace Opening C:\wwwLogs\2017-11-01.log with allowFileSharedWriting=False
2017-11-01 14:21:28.5859 Debug Targets for TimeSlotApprovalService by level:
2017-11-01 14:21:28.5859 Debug Trace => allfile
2017-11-01 14:21:28.5859 Debug Debug => allfile
2017-11-01 14:21:28.5859 Debug Info => allfile
2017-11-01 14:21:28.5859 Debug Warn => allfile
2017-11-01 14:21:28.5859 Debug Error => allfile
2017-11-01 14:21:28.5859 Debug Fatal => allfile

In my application when I call this

_logger.LogDebug(JsonConvert.SerializeObject(resultList, Formatting.Indented));
_logger.LogError(JsonConvert.SerializeObject(resultList, Formatting.Indented));
_logger.LogCritical(JsonConvert.SerializeObject(resultList, Formatting.Indented));
_logger.LogWarning(JsonConvert.SerializeObject(resultList, Formatting.Indented));
_logger.LogTrace(JsonConvert.SerializeObject(rankedTimeSlots, Formatting.Indented));

Then the log file only logs these

2017-11-01 14:44:48.2570|TimeSlotApprovalService|**ERROR**|[json...

2017-11-01 14:44:48.2570|TimeSlotApprovalService|**FATAL**|[json...

2017-11-01 14:44:48.2570|TimeSlotApprovalService|**WARN**|[json...

Where are the rest?? Trace and Debug?? Info?

like image 453
Piotr Kula Avatar asked Nov 01 '17 15:11

Piotr Kula


People also ask

Which of the following logging levels does NLog support?

NLog supports the following levels: Trace - Very detailed log messages, potentially of a high frequency and volume. Debug -Less detailed and/or less frequent debugging messages. Info - Informational messages.

What types of logs are supported in the NLog library?

NLog supports semantic/structured logging known from similar frameworks like Serilog and Microsoft. Extensions. Logging. With structured logging, you no longer log just simple text messages.

Is NLog asynchronous?

NLog 1.0 supports asynchronous logging, but there is no good support for asynchronous exception handling. This is because wrappers targets are not capable of receiving exceptions which are raised on other threads.


1 Answers

ASP.NET Core and its logging system Microsoft.Extensions.Logging use a central configuration. This configuration applies regardless of the attached logging providers. So if you use NLog as a logging provider, you will still have to configure the logging infrastructure.

By default, the web host builder will automatically use the configuration within the appsettings.json to configure the logging verbosity. And in the default template, this is what the configuration looks like:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

So the default minimum log level to log is Warning. So even if you configure your NLog provider to log at any logging level, it won’t actually receive logging instructions lower than Warning from the logging system.

So you will have to adjust the configuration there to change it. Set it to Trace and it should log everything.

Note that you should still consider using the configuration there as the source of truth on what log levels should be logged. So just keep your NLog configuration to log whatever it gets, and then adjust your appsettings.json to match whatever you want to actually log, depending on the current enviroment (you can create files like appsettings.Development.json and appsettings.Production.json to create environment-specific configurations).

like image 98
poke Avatar answered Sep 20 '22 05:09

poke